표준 빌트인 객체(네이티브 객체)
- Ecmascript 사양에 정의된 객체, 애플리 케이션 전역의 공통 기능을 제공, 표준 빌트인 객체는 전역객체의 프로퍼티로서 제공됨. 따라서 선언 없이 전역 변수처럼 언제나 참조가능
호스트 객체
- ecma 사양에 정의되어 있지 않지만, 자바스크립트 실행환경(호스트환경. 브라우져, node.js) 에서 추가로 제공하는 객체
사용자 정의 객체
- 사용자가 직접 정의한 객체
자바 스크립트는 object, string 등 40여개의 표준 빌트인 객체를 제공한다.
-개발자는 별도의 선언 없이 사용할수 있다.
-이 객체들은 다양한 기능 (수학연산, 데이터 처리, 문자열 다루기 ) 등을 제공한다.
-전역객체의 일부로 포함된다.표준 빌트인 객체
Object, Array , String, Number 등…
Math, Reflect, JSON
나머지 표준 빌트인 객체
정적메소드와 프로토 타입 메소드
클래스나 객체 자체에 붙어있는 메소드
클래스의 인스턴스가 아니라 클래스 자체에서 호출됨.
예시 코드) Math 객체
console.log(Math.max(1, 2, 3)); // 3
console.log(Math.random()); // 0과 1 사이의 난수
// Math의 메서드는 모두 정적 메서드입니다.
const math = new Math(); // TypeError: Math is not a constructor
두가지 구별하기
//정적 메소드: 클래스나 객체 자체의 유틸리티 기능 제공
Array.isArray([1, 2, 3]); // 정적 메서드
//프로토타입 메서드: 인스턴스가 고유하게 사용할 수 있는 기능 제공.
const arr = [1, 2, 3];
arr.push(4); // 프로토타입 메서드
class School {
constructor(name, location) {
this.name = name; // 학교 이름
this.location = location; // 위치
this.students = []; // 학생 리스트
}
addStudent(studentName) {
this.students.push(studentName); // 학생 추가
console.log(`${studentName} 학생이 ${this.name}에 등록되었습니다.`);
}
listStudents() {
console.log(`${this.name}의 학생 명단: ${this.students.join(", ")}`);
}
}
// 서울고등학교와 부산중학교 인스턴스 생성
const school1 = new School("서울고등학교", "서울");
const school2 = new School("부산중학교", "부산");
// 학생 등록
school1.addStudent("철수"); // 출력: 철수 학생이 서울고등학교에 등록되었습니다.
school1.addStudent("영희"); // 출력: 영희 학생이 서울고등학교에 등록되었습니다.
school2.addStudent("민수"); // 출력: 민수 학생이 부산중학교에 등록되었습니다.
// 학생 명단 출력
school1.listStudents(); // 출력: 서울고등학교의 학생 명단: 철수, 영희
school2.listStudents(); // 출력: 부산중학교의 학생 명단: 민수
원시값을 객체처럼 접근하면 생성되는 임시 객체를 의미
- 래퍼객체
- 자바스크립트 엔진은 원시값인 문자열, 숫자, 불린 값은 객체가 아니기때문에 프로퍼티나 메소드를 가질수 없는데, 마치 객체처럼 일시적으로 원시값을 연관된 객체로 변환해줌.
- 엔진은 암묵적으로 연관된 객체를 생성, 생성된 객체로 메소드 , 프로퍼티에 접근한뒤에 다시 원시값으로 돌린다.
- 원시값은 자바 스크립트 엔진에 의해 생성되는 래퍼 객체에 의해 마치 객체처럼 사용할수 있음
- 표준 빌트인 객체의 프로토 타입 메서드, 또는 프로퍼티를 참조할수 있음
- 따라서 굳이 생성자 함수를 new 연산자와 함께 호출하여 문자열, 숫자, 불린 인스턴스를 생성할 필요가 없으며, 권장하지도 않는다.
- 그러나 문자열, 숫자, 불린, 심벌 이외의 원시값인 null, undefined는 래퍼 객체를 생성하지 않는다.

const str = "hello";
console.log(str.toUpperCase());
/*자바스크립트의 프로토 체인
*1. 자바스크립트는 특정 프로퍼티에 접근할때 해당 객체에 프로퍼티가 없는것을 확인
*2. 내부 슬롯의 참조를 따라 상위 프로토타입의 프로퍼티를 순차적으로 검색
*3. 원시값은 생성자 함수로 생성된 객체가 아니므로 어느곳에서도 찾지못하고 임시적으로 래퍼 객체를 생성함
*/
'HELLO' 메소드를 호출할때 일시적으로 stirng 객체로 변환
console.log(typeof str); //string 메소드 호출후 원시값으로 돌아갔으므로 타입은 stirng임.
- 자바스크립트 엔진에 의해 어떤 객체보다도 먼저 생성되는 특수한 객체,
- 어떤 객체에도 속하지 않은 최상위 객체
- 의도적으로 생성할수 없으므로 생성자 함수가 제공되지 않는다
- 전역객체의 프로퍼티를 참조할때 window(or global)을 생략할 수 있다.
- 모든 자바스크립트 코드는 하나의 전역 객체를 공유한다.
→여러개의 script 태그를 통해 코드를 분리해도 하나의 전역을 공유함.
console.log(window);// 전역개체 출력
console.log(Object.keys(window)); // window 객체의 모든 속성 이름 출력
globalThis
전역객체의 프로퍼티
전역 객체의 프로퍼티의 종류
전역객체의 메소드
setTimeout
setInterval / clearInterval
const interval = setInterval(() => console.log("Ping!"), 1000);
clearInterval(interval); // 반복 취소
그밖의 메소드
선언하지 않은 식별자 이지만, 이 식별자 에 값을 할당하면 전역 객체의 프로퍼티가 되기 때문에 마치 선언된 전역 변수처럼 동작하는것을 의미.
var x = 10 //전역변수
function foo() {
y = 20 //선언하지 않은 식별자에 값을 할당 window.y =20
}
foo()
//선언하지 않은 식별자 y를 전역에서 참조할 수 있다.
console.log(x+y) //30
foo 함수가 호출되면 자바 엔진은 y 변수에 값을 할당하기 위해 스코프 체인을 통해 선언된 변수 인지 확인.
y 변수의 선언을 찾을수 없으므로 에러가 발생함.
하지만 엔진은 y =20을 window.y = 20으로 해석하여 전역객체에 프로퍼티를 동적 생성
(하지만 y는 단지 전역객체의 프로퍼티로 추가 되었을뿐 y는 변수가 아니므로,
호이스팅 또한 발생하지 않고, delete 연산자로 삭제할 수 없다)
"use strict" // 1. 파일의 최상단에 작성하여 파일 전체에 엄격모드 적용하기
function example() {
"use strict"; // 2. 함수 내에서만 엄격모드 적용학.
undeclaredVar = 42; // ReferenceError 발생
}
example();
//엄격모드를 설정하지 않았을때.
function anotherExample() {
undeclaredVar = 42; // 정상 실행 (엄격 모드 미적용)
}
anotherExample();
strictMode - Modern Javascript Deep Dive ‘20장 strictMode’ 참고