자바 스크립트 : 타입 변환

스트랫


자바 스크립트 형식 변환 구덩이되었습니다 있지만, 사실 그것은 또한 코드의 양을 줄일 수 있습니다.

ToPrimitive


Symbol.toPrimitive은 이 물체가 원래의 값으로 변환 된 개체의 속성의 값의 함수로 존재하며, 내장 된 기호 값이 함수가 호출됩니다.

이 함수가 호출 될 때, 문자열 매개 변수 전달되는 hint원래의 값으로 변환 할 것으로 예상되는 유형을 나타내는합니다. hint값 파라미터이며 "number", "string""default"중 하나.

// 一个没有提供 Symbol.toPrimitive 属性的对象,参与运算时的输出结果
let obj1 = {};
console.log(+obj1);     // NaN
console.log(`${obj1}`); // "[object Object]"
console.log(obj1 + ""); // "[object Object]"

// 接下面声明一个对象,手动赋予了 Symbol.toPrimitive 属性,再来查看输出结果
let obj2 = {
  [Symbol.toPrimitive](hint) {
    if (hint == "number") {
      return 10;
    }
    if (hint == "string") {
      return "hello";
    }
    return true;
  }
};
console.log(+obj2);     // 10      -- hint 参数值是 "number"
console.log(`${obj2}`); // "hello" -- hint 参数值是 "string"
console.log(obj2 + ""); // "true"  -- hint 参数值是 "default"

위, toPrimitive 힌트 전환 과정에서 볼 수 있듯이 매개 변수에 의존한다 :

  • number: valueOf () → toString () → 형식 오류
  • string: valueOf () → 형식 오류 → toString ()
  • default: 같은 수

사물 반환 값
정렬 객체 자체의 배열을 돌려줍니다.
부울 부울 값입니다.
날짜 밀리 초 UTC의 1 카운트 1 월 1970 년 자정의 시작 부분에서 저장 시간.
기능 자체 기능을 수행합니다.
번호 숫자 값.
목적 개체 자체. 이 값이 기본값입니다.
문자열 값.
상징 기호 자체
수학 및 오류 개체는 valueOf 메소드이 없습니다.

사물 반환 값
정렬 [1, 2, 3] => "1,2,3"
부울 거짓 => "거짓"
날짜 문자열 UTC를 돌려줍니다.
기능 소스 코드의 현재 함수를 나타내는 문자열을 반환합니다.
번호 현재의 값을 나타내는 문자열을 반환합니다.
목적 "[개체 개체]"
문자열 자체.
상징 "상징()"

참고 : [null].toString()뿐만 아니라 [undefined].toString()모두가 빈 문자열을 반환합니다 "".

ToBoolean


ES5 9.2 사양 이스탄불 캐스트 (ToBoolean) 값이 false (거짓)가있을 것입니다 만 다음에 나열된, 나머지는 (참) 진정한 가치입니다 :

  • 정의되지 않은
  • 없는
  • 그릇된
  • + 0, -0, NaN가
  • ''(빈 문자열)
/*
 以下 a、b、c 存储的是指向对象的指针,并非假值
*/
let a = new Number(0);
let b = new Boolean(false);
let c = new String('');

Boolean(a) // true
Boolean(b) // true
Boolean(c) // true

Boolean(0) // false
Boolean(false) // false
Boolean('') // false

ToNumber


사물 반환 값
정의되지 않은 NaN의
없는 0
부울 진정한 => 1, 거짓 => 0
번호 그들의 복귀
그것은 해결할 수없는 StringNumericLiteral를 , 모두 NaN이를 반환
목적 ToPrimitive ( 입력 인수 , 힌트 번호)

注: StringNumericLiteral

캐스트 연산자


플러스 (+) 기호

+단독 단항 연산자 같이, 우회전 번호 피연산자 타입 강제, 즉 오른쪽 피연산자 ToNumber 사용 ().

+1 // 1
+'1.2' // 1.2
+[] // 0
+[1, 2, 3] // NaN
+{} // NaN

느낌표 (!)

!부대가 오른쪽 피연산자 유형 부울로 설정하고, 역 허위 사실 오른쪽 피연산자의 사용이! ToBoolean합니다 ().

!true // false
!0 // true
![] // false
!'' // true
!undefined // true
!null // true

!!true // true
!!undefined // false
!!null // false

네 사업자


다음과 같은 규칙을 추가 :

  1. 여기서 문자열 작업의 하나 인 문자열은 다른 변환됩니다.

    1 + '1' // '11'
    42 + '' // '42'
  2. 하나는 문자열이나 숫자가 아닌 경우, 문자열이나 숫자로 변환됩니다.

    false + true // 1
    3 + [1, 2, 3] // '31,2,3'
    ([] + {}) // '[object Object]'
    
    /* {} + [] 的结果为 0, 是因为从左往右解析,{} 为一个代码块,+[] 被解析为将 [] 转为 number, 即 0。*/
    {} + [] // 0
    ({} + []) // "[object Object]"

    참고 :

    /* 会出现以下情况,是因为 + 'b' 解释为 ToNumber('b') */
    'a' + + 'b' // "aNaN"

또한 작업 이외의 작업을 위해, 양측 번호 동작으로 변환한다.

1 * '2' // 2
[] * {} // NaN
1 * [1, 2, 3] // NaN

let obj = {
    valueOf: () => {
        return 1
    }
}

obj * 2 // 2

==와 ===


의 경우 ==(상대적으로 동일), ===(절대적으로 동일), 도서 및 블로그의 대부분이 이전의 해석 만 값이 동일 확인하고,이 잘못된 사실, 올바른 해석이 동일해야하는 후자의 값을 확인 : 전 비교할 때 캐스트를 허용, 후자는 허용되지 않습니다 .

11.9.3 ES5 사양은 상대적으로 동등의 동작, 그것은 콘크리트의 모든 유형이 다음과 같은 경우로 나눌 수 있습니다 커버 정의

  1. 양측 동일한 유형

    유형 결과
    정의되지 않은 참된
    없는 참된
    번호 그 중 하나가 1 인 경우 NaN3를가 반환 false로 . x 및 y의 값이 동일한 경우 2. 반환 true로 , 그렇지 않으면 거짓 . 당사자 중 하나 인 경우 3. +0 이나 -0 과 다른 하나는 0 또는 -0 반환 true로 .
    양측은 정확히 같은 문자 순서입니다 반환 true로 . 그렇지 않으면 반환 거짓 .
    부울 양측은 또는 거짓 반환 , 그렇지 않으면 거짓 .
    목적 양측은 같은 객체를 참조하고, 반환 true로 . 그렇지 않으면 반환 거짓
    NaN == NaN // false
    -0 == +0 // true
  2. 널 (null) 与 정의되지 않은

    null == undefined // true
  3. 문자열과 숫자

    문자열은 디지털 비교됩니다, 즉 ToNumber(字符串) == 数字.

    10 == '10' // true
    10 == 'a' // false
    /* 十六进制 '0xa' => 十进制 10 */
    10 == '0Xa' // true
  4. 부울 유형과 다른 유형

    부울 유형은 다른 유형에 비해 다음 디지털로 변환 될 것입니다,ToNumber(布尔类型) == 其他类型

    0 == false // true
    '1' == true // true
    null == false // false
    undefined == false // false
  5. 비 객체 유형 및 객체 유형

    다음 원래 형식 개체 형식으로 변환 될 것이다 비교 ToPrimitive(对象类型) == 非对象类型

    [1] == 1 // true
    [1, 2] == 1 // false
    
    /* b.toString() 返回 '111' */
    let a = '111';
    let b = Object(a);
    a == b // true
    
    /* null 与 undefined 不能被封装为 object, 即 Object(null) 的返回结果与 Object() 的一样 */
    let c = null;
    let d = Object(c);
    c == d // false
    
    let e = undefined;
    let f = Object(e);
    e == f // false

이 어려운 경우 이해하기


  1. [] == ![]

    [] == ![] // true
    
    /*
    第一步: !的优先级比 == 高,所以 ![] 解析为 !Boolean([]),结果为 true.
    现在: [] == true
    
    第二布: 布尔类型与其他类型进行比较,解析为 ToNumber(true), 结果为 0.
    现在: [] == 0
    
    第三步: 对象类型与非对象类型进行比较,解析为 ToPrimitive([], 'number'),结果为 0.
    现在: 0 == 0 // true
    */
  2. [null] == ''

    [null] == '' // true
    [undefined] == '' // true
    
    /*
    [null].toString() 以及 [undefined].toString() 均返回空字符串 ''
    因为 null 与 undefined 均没有 toString 和 valueOf 方法。
    */
  3. 0 == '\n'

    0 == '\n' // true
    0 == '\t\r\n' // true
    
    /*
    上述语句被解析为 ToNumber('\n'), 返回结果为 0.
    */

    具体解释:'\n\t\r' == 0 is true?

备注


理解了类型转换,你会发现并非一定要抛弃==去使用===

추천

출처www.cnblogs.com/guolao/p/11364779.html