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 和 undefined 是相称的。
  2. 要比较相称性之前,不能将 null 和 undefined 转换成其他任何值。
  3. 假如有一个操纵数是 NaN,则相称操纵符返回 false,而不相称操纵符返回 true。
  4. 假如两个操纵数都是对象,则比较它们是不是是同一个对象。(比较援用范例的地点是不是雷同)
    null == undefined  // true
    NaN == NaN         // false
    NaN != NaN         // true
    false == 0         // true
    undefined == 0     // true
    null == 0          // true
    原文作者:无量天尊
    原文地址: https://segmentfault.com/a/1190000017845348
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞