>  기사  >  웹 프론트엔드  >  Javascript 암시적 변환을 사용하는 방법은 무엇입니까? (코드 예)

Javascript 암시적 변환을 사용하는 방법은 무엇입니까? (코드 예)

不言
不言앞으로
2019-01-11 11:07:162582검색

이 글의 내용은 Javascript 암시적 변환을 사용하는 방법에 관한 것입니다. (코드 샘플)에는 특정 참조 값이 있습니다. 도움이 필요한 친구가 참조할 수 있기를 바랍니다.

두 변수가 같은지 확인하는 것은 프로그래밍에서 매우 중요한 작업입니다.
문자열, 숫자, 불리언이 같은지 비교할 때 문제는 상대적으로 간단합니다. 그러나 객체를 비교하는 경우 문제는 복잡해집니다. ECMAScript의 원래 항등 및 부등 연산자는 비교를 수행하기 전에 객체를 유사한 유형으로 변환했습니다. 나중에 일부 사람들은 이러한 전환이 합리적인지에 대해 의문을 제기했습니다.
마지막으로 ECMAScript의 솔루션은 두 가지 연산자 세트를 제공하는 것입니다.
등식과 부등식 - 먼저 변환한 다음 비교하고, 합동과 부등식 - 변환 없이 비교만 합니다.
여기에서는 평등에 대해서만 논의합니다.

"=="가 같을 때 암시적 변환

"==" 연산자의 경우 일반적으로 암시적 변환(캐스팅)이 먼저 수행된 다음 동등성을 비교합니다.

암시적 변환 규칙:

1. 피연산자 중 하나가 부울 값인 경우 동등성을 비교하기 전에 숫자 값으로 변환됩니다. false는 0으로 변환되고 true는 1로 변환됩니다.

2. 한 피연산자는 문자열이고 다른 피연산자는 숫자 값인 경우 동등성을 비교하기 전에 문자열을 숫자 값으로 변환합니다.
문자열을 숫자 값으로:

(1) 숫자 유형 문자열은 해당 십진수 값으로 변환됩니다.
(2) 빈 문자열은 0으로 변환됩니다.
(3) 나머지는 NaN으로 변환됩니다(NaN은 자신을 포함하여 어떤 값과도 동일하지 않습니다).

3. 객체와 다른 피연산자가 없으면 객체의 valueOf() 메서드를 호출하고 얻은 기본 유형 값을 사용하여 이전 규칙에 따라 비교합니다.

간단한 예를 통해 JS의 기본 변환 규칙을 살펴보겠습니다.

    // 根据隐式转换规则第三条 调用对象的 valueOf 方法
    [].valueOf() // []

    // 这时就变成 [] == false ,又回到原来的情况,这时JS底层又是怎么处理的呢?
    // 其实 JS 的底层在调用 valueOf 得到的返回结果如果不是原始值时,就会调用对象的 toString 方法将对象转换成字符串。对于这个过程我们可以通过一下的例子来验证。

    [].valueOf() // []
    [].toString() // ''
    //上面是 这两个方法的 默认行为,在下面的例子中我们不改变默认行为
    [].__proto__.valueOf = () => { console.log('valueOf'); return []; }
    [].__proto__.toString = () => { console.log('toString'); return ''; }
    [] == false
    // 运行的结果为 valueOf toString true
    // 这样就验证了上述的说明


      // 我们还可以通过下面的方式,从侧面在次验证 JS底层默认的转换行为

    [].__proto__.valueOf = () => { console.log('valueOf'); return ''; }
    [].__proto__.toString = () => { console.log('toString'); return ''; }
    [] == false
    // valueOf true

    [].__proto__.valueOf = () => { console.log('valueOf'); return []; }
    [].__proto__.toString = () => { console.log('toString'); return []; }
    [] == false
    // JS 报错 Uncaught TypeError: Cannot convert object to primitive value

이제 예를 살펴보겠습니다. 빈 객체가 false와 같지 않은 이유는 무엇인가요? 일반적인 관점에서 배열은 객체입니다. 빈 배열이 false인 이유는 무엇이며, 빈 객체가 false인 이유는 무엇입니까?

    //现在我们可以参照上面隐式转换的过程,对空对象手动的执行这个过程,结果如下
    ({}).valueOf() // {}
    ({}).toString() // '[object Object]'

    // 这时我们发现 空对象 与 空数组默认行为的区别了,在 toString 方法上,由于数组会对继承自对象的 toString 方法进行重写,将数组中的每个元素通过 ',' 链接成一个字符串
    // 这时就变成了 '[object Object]' == false 
    // 根据规则第二条,得到最后结果 false

암시적 변환에 대한 특수 규칙:

  1. null과 정의되지 않음은 동일합니다.

  2. null 및 정의되지 않음은 동등성을 비교하기 전에는 다른 값으로 변환될 수 없습니다.

  3. 피연산자 중 하나가 NaN이면 항등 연산자는 false를 반환하고, 불평등 연산자는 true를 반환합니다.

  4. 두 피연산자가 모두 객체인 경우 동일한 객체인지 비교하세요. (참조타입의 주소가 같은지 비교)

    null == undefined  // true
    NaN == NaN         // false
    NaN != NaN         // true
    false == 0         // true
    undefined == 0     // true
    null == 0          // true

위 내용은 Javascript 암시적 변환을 사용하는 방법은 무엇입니까? (코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제