本篇文章帶給大家的內容是關於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
隱含轉換的特殊規則:
#null 和 undefined 是相等的。
要比較相等性之前,不能將 null 和 undefined 轉換成其他任何值。
如果有一個運算元是 NaN,則相等運算子傳回 false,而不相等運算子傳回 true。
如果兩個運算元都是對象,則比較它們是不是同一個物件。 (比較引用類型的位址是否相同)
null == undefined // true NaN == NaN // false NaN != NaN // true false == 0 // true undefined == 0 // true null == 0 // true
以上是Javascript隱式轉換怎麼用? (程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!