數據類型轉換
1. 引入一題目 [] == ![]結果是什么?[] == []結果又是如何呢?
[] == ![]
解析: 轉換順序問題TODO
== 中,左右兩邊都需要轉換為數字然后進行比較。
[] 轉換為數字為0。
![] 首先是轉換為布爾值,由于[]作為一個引用類型轉換為布爾值為true,
因此![]為false,進而在轉換成數字,變為0。
0 == 0 , 結果為true
[] == []
[] == [] ,結果為false? why? 引用和引用比,看地址是否是同一個;所以為false;
引入第二 {} + false; false + {}結果分別是什么?
{} + false
{} 在最開始會被解釋為代碼塊,所以輸出0;
false + {}
輸出 "false[object Object]"
2. JS中類型轉換有哪幾種?
JS中,類型轉換只有三種:
- 轉換成數字
- 轉換成布爾值
- 轉換成字符串
轉換具體規則如下:
注意"Boolean 轉字符串"這行結果指的是 true 轉字符串的例子
類型轉換.png
3. == 和 ===有什么區別?
===叫做嚴格相等,是指:左右兩邊不僅值要相等,類型也要相等,例如'1'===1的結果是false,因為一邊是string,另一邊是number。
復制代碼
==不像===那樣嚴格,對于一般情況,只要值相等,就返回true,但==還涉及一些類型轉換,它的轉換規則如下:
- 兩邊的類型是否相同,相同的話就比較值的大小,例如1==2,返回false
- 判斷的是否是null和undefined,是的話就返回true
- 判斷的類型是否是String和Number,是的話,把String類型轉換成Number,再進行比較
- 判斷其中一方是否是Boolean,是的話就把Boolean轉換成Number,再進行比較
- 如果其中一方為Object,且另一方為String、Number或者Symbol,會將Object轉換成字符串,再進行比較
console.log({a: 1} == true);//false
console.log({a: 1} == "[object Object]");//true
復制代碼
4. 對象轉原始類型是根據什么流程運行的?
對象轉原始類型,會調用內置的[ToPrimitive]函數,對于該函數而言,其邏輯如下:
- 如果Symbol.toPrimitive()方法,優先調用再返回
- 調用valueOf(),如果轉換為原始類型,則返回
- 調用toString(),如果轉換為原始類型,則返回
- 如果都沒有返回原始類型,會報錯
var obj = {
value: 3,
valueOf() {
return 4;
},
toString() {
return '5'
},
[Symbol.toPrimitive]() {
return 6
}
}
console.log(obj + 1); // 輸出7
復制代碼
5. 如何讓if(a == 1 && a == 2)條件成立?
其實就是上一個問題的應用。
var a = {
value: 0,
valueOf: function() {
this.value++;
return this.value;
}
};
console.log(a == 1 && a == 2);//true