首頁 >web前端 >js教程 >Javascript隱式轉換怎麼用? (程式碼範例)

Javascript隱式轉換怎麼用? (程式碼範例)

不言
不言轉載
2019-01-11 11:07:162653瀏覽

本篇文章帶給大家的內容是關於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

以上是Javascript隱式轉換怎麼用? (程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除