toString() 및 Object.prototype.toString.call()

6713 단어

1.toString()


우리 먼저 데모를 보자.
var t1 = {a: 1};
var t2 = [1,2];
var t3 = 'str';
console.log(t1.toString())  //"[object Object]"
console.log(t2.toString())  //"1,2"
console.log(t3.toString())  // "str"

위의 예에서 우리는 대상, 그룹, 문자열 세 가지 유형을 정의하여 toString 방법을 호출했지만 결과는 완전히 다르다.이상하다
예를 들면,
  • 수조는 문자열 목록
  • 을 되돌려줍니다
  • 문자열은 문자열 복사본(즉 그대로 출력)
  • 을 반환합니다.
  • 대상은 그 유형을 반영할 수 있을 것 같은 문자열
  • 을 되돌려줍니다
    그래서 결과적으로 유형에 따라 toString의 방법과 기능이 다른 것 같다(이름은 토스트링이지만).
    대상의 원형과 기본 포장 유형을 알고 계신 분들은 모두 알고 계십니다. 위의 예에서 다음과 같습니다.
  • t1은 Object를 호출합니다.prototype의 방법
  • t2에서 Array를 호출했습니다.prototype의 방법
  • t3은 String을 사용합니다.prototype의 방법
  • t2도 대상이지만 원형 체인의 1층인 Array.prototype toString 은 직접 계승하고 Array.prototype.__proto__ Object.prototype toString 을 찾지 않기 때문에 서로 다른 유형의 원형 체인식은 많든 적든 토스트링 방법을 다시 썼기 때문에 기능용도가 다르다.
    다음에 서로 다른 유형의 toString () 방법을 호출하는 방법을 다시 한 번 분석해 봅시다. 반환 값은 어떤 차이가 있습니까?

    1.1.문자열string (즉 new String에서 나온 기본 포장 형식을 호출하는 방법)


    문자열의 사본 (즉 그대로 출력) 을 되돌려줍니다.
    var str = "a";
    str.toString(); //"a"
    String.prototype.toString.call(str) // "a"
    

    1.2.숫자 number (즉 new Number에서 나오는 기본 포장 유형을 호출하는 방법)


    문자열 형식의 수치를 되돌려줍니다
    var num = 520;
    num.toString(); //"520"
    Number.prototype.toString.call(num) // "a"
    

    1.3.부울 값boolean (즉 new Boolean에서 나오는 기본 포장 형식을 호출하는 방법)


    문자열 "true"또는 "false"를 반환합니다.
    var boo = true;
    boo.toString(); //"true"
    Boolean.prototype.toString.call(boo); //"true"
    

    1.4.유일무이한 값symbol(즉 구조 함수 Symbol을 호출하여 생성하는 실례적인 방법입니다. 여기 호출은 일반적인 구조 함수와 다르며 new가 필요하지 않습니다. 직접 호출하십시오)


    반환 문자열 "Symbol()"
    var symbol = Symbol();
    symbol.toString(); //"Symbol()"
    Symbol.prototype.toString.call(symbol); //"Symbol()"
    

    1.5.null 및 undefined


    null과undefined는 상응하는 구조 함수가 없기 때문에 tostring () 방법을 호출할 수 없습니다. 즉, 속성과 방법에 접근할 수 없고 기본 형식일 뿐입니다.

    16. 객체 object(Object.prototype을 호출하는 방법)


    type이 대상인 [object type]을 반환합니다.
    var t1 = {a: 1};
    t1.toString()  //"[object Object]"
    Object.prototype.toString.call(t1); //"[object Object]"
    

    1.7.배열 Array(즉, Array.prototype을 호출하는 방법)


    그룹의 모든 값의 문자열 형식으로 연결된 쉼표로 구분된 문자열을 되돌려줍니다
    var array = [1, 's', true, {a: 2}];
    array.toString();//"1,s,true,[object Object]"
    Array.prototype.toString.call(array);//"1,s,true,[object Object]"
    

    1.8.함수 function(Function.prototype 호출 방법)


    함수를 반환하는 코드
    function foo(){
        console.log(1');
    };
    foo.toString();
    
    
    
    Function.prototype.toString.call(foo);
    
    
    
    

    그래서:
    Object.toString();
    //"function Object() { [native code] }"
    Function.toString();
    //"function Function() { [native code] }"
    Array.toString();
    //"function Array() { [native code] }"
    ....
    

    ... 때문에
    Array.__proto__===Function.prototype  //true
    Object.__proto__===Function.prototype  //true
    Function.__proto__===Function.prototype  //true
    

    1.9.날짜 Date(Date.prototype 호출 방법)


    시간대 정보가 있는 날짜와 시간을 되돌려줍니다
    var date = new Date();
    date.toString();
    //"Fri May 11 2018 14:55:43 GMT+0800 ( )"
    Date.prototype.toString.call(date);
    //"Fri May 11 2018 14:55:43 GMT+0800 ( )"
    

    1.10.정규 표현식(RegExp.prototype 호출 방법)


    정규 표현식의 문자열 형식을 되돌려줍니다
    var re = /cat/g;
    re.toString();// "/cat/g"
    RegExp.prototype.toString.call(re);// "/cat/g"
    

    1.11.전역 객체 window

    [object window]으로 돌아가기
    window.toString(); //"[object Window]"
    Object.prototype.toString.call(window); //"[object Window]"
    

    윈도는 js의 특수한 대상이다. 윈도는 구조 함수가 아니다. 즉, 윈도가 없다는 것이다.prototype 원형 대상에 toString () 방법을 다시 쓰는 방법은 원형 체인을 따라 Object를 호출합니다.prototype.toString().

    2.Object.prototype.toString.call( )


    위에서 우리는 직접 호출과call 호출 두 가지 방식을 통해 toString 방법 테스트를 진행한다.우리는 Object가 되돌아오는 결과가 [object type]인 것을 알고 있으며, 그 중에서 type을 대상으로 하는 유형은 `이므로, 그 되돌아오는 대상의 기능에 따라 유형을 판단할 수 있다.
    Object.prototype.toString.call({});
    
    Object.prototype.toString.call([]);
    
    Object.prototype.toString.call(function(){});
    
    Object.prototype.toString.call('');
    
    Object.prototype.toString.call(1);
    
    Object.prototype.toString.call(true);
    
    Object.prototype.toString.call(null);
    
    Object.prototype.toString.call(undefined);
    
    Object.prototype.toString.call();
    
    Object.prototype.toString.call(new Date());
    
    Object.prototype.toString.call(/at/);
    
    

    3. 직접 호출

    toString();
    
    
    (function(){
        console.log(toString());
    })();
    
    

    즉, Tostring () 방법을 직접 호출하는 것은
    Object.prototype.toString.call();
    
    Object.prototype.toString.call(undefined);
    
    

    즉: Tostring () 방법을 직접 호출하는 것은 전역 역할 영역에서 Tostring () 방법을 호출하는 것으로 이해할 수 없습니다. 즉 window입니다.toString()
    그래서 직접 Tostring () 을 호출하면 변형된undefined일 것입니다.string () 방법 (여기에서 말한 것은 실제 undefined는 방법이 없고 호출이 잘못될 수 있다는 것과 같다.)

    4.toString.call/apply(유형)


    자주 토스트링을 써요.Object 대신 call/apply (유형) 를 사용하십시오.prototype.toString.call/apply(유형) 사용은 사실 엄격하지 않아서 문제를 일으키기 쉽다. 아래와 같다.
    function toString(){
        console.log(1")
    }
    toString();//1
    toString.call({});//1
    toString.call([]);//1
    

    우리가 tostring () 방법을 사용자 정의할 때 tostring () 방법을 직접 호출하면 Object 종류의 tostring () 방법을 기본으로 사용하지 않고 사용자 정의 방법을 사용합니다. 이렇게 하면 우리가 원하는 결과를 얻을 수 없기 때문에 가능한 한 Object를 사용해야 합니다.prototype.toString.call/apply (유형).

    5.유형


    토스트링 () 방법과 같이 Object의 서로 다른 하위 유형은 toLocaleString()、valueOf() 을 다시 썼습니다. 여기서 제가 말하고 싶은 것은 대상 하위 유형이 어떻게 다시 쓰든지 간에 우리가 이 방법들이 어디에서 왔고 어떻게 호출되었는지 알면 이 방법들이 호출된 후에 생성된 결과를 잘 이해할 수 있습니다!
    결국 JS의 대상과 원형에 대한 이해는 정말 중요하다!

    6. 참조


    Object에서prototype.toString.call () 는 toString () 방법에 대한 사고를 불러일으킨다

    좋은 웹페이지 즐겨찾기