---
title: "190708-TIL"
date: 2019-07-08
tags: ["TIL"]
url: https://sub2n.github.io/2019/07/08/190708-TIL/
---

# 190708-TIL

## Today I Learned

#### TEST

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