Today I Learned
TEST
Wrapper Object
1
2
3
4'string'.length; // 6
const s = 'super'
String.prototype.sayHi() = () => { console.log('Hi') };
s.sayHi(); // 'Hi문자열을 객체처럼 사용할 경우 JavaScript 엔진이 순간 String 생성자 함수로 wrapping 한다.
Property Key
- Property Key 동적 생성
1
2
3
4
5
6
7
8
9var obj = {};
var key = 'hello';
// ES5: 프로퍼티 키 동적 생성
obj[key] = 'world';
// ES6: 프로퍼티 키 동적 생성
// var obj = { [key]: 'world' };
console.log(obj); // {hello: "world"}- Property Key는 문자열이나 symbol 값 이외의 값을 사용하면 암묵적 타입 변환을 통해 문자열이 된다. 예를 들어, 프로퍼티 키로 숫자 리터럴을 사용하면 따옴표는 붙지 않지만 내부적으로는 문자열로 변환된다.
- Property Key로 객체를 사용해도 error가 나지 않고 들어감. 배열도 마찬가지
- 객체는
[object Object]
라는 String으로 변환된다. obj[string]이 되어야하기 때문에[]
내부는 문자열로 강제 형변환된다.
1
2
3
4
5
6
7
8
9const a = {};
const b = { key: 'b' };
const c = { key: 'c' };
// 두 객체 모두 Property key로 쓰일 때 문자열 [object Object]로 변환되어 같은 key가 된다.
a[b] = 123;
a[c] = 456;
console.log(a[b]);- Property Key를 중복 선언하면 나중에 선언한 Property가 이전 것을 덮어씀
call, apply method는 함수에 this를 전달하고 호출하지만 bind는 this를 전달한 함수를 return한다.
Function literal과 Function declaration statement의 차이
- 함수 이름이 있는 함수 선언문은 자바스크립트 엔진이 함수명과 동일한 식별자를 생성하고 생성한 함수 객체를 할당한다.
- 함수 이름이 필수가 아닌 함수 리터럴은 그저 평가되어 함수 객체를 생성한다. 이를 괄호로 감싸면 에러 없이 함수 객체가 된다.
1
2
3
4// 즉시 실행 함수로 함수 리터럴을 사용하는 경우
(function () {
...
})()