強制類型轉換 將值從一種類型轉換為另一種類型通常稱為類型轉換,這是顯式的情況。隱式的情況被稱為強制類型轉換 在書中,作者還提出一種區分方式: 類型轉換髮生在靜態類型語言的編譯階段,強制類型轉換髮生在動態類型語言的運行時。 JS天生的動態類型語言,所以JS中統一講強制類型轉換。 一、JS中的強制類型轉 ...
強制類型轉換
將值從一種類型轉換為另一種類型通常稱為類型轉換,這是顯式的情況。隱式的情況被稱為強制類型轉換
在書中,作者還提出一種區分方式:
類型轉換髮生在靜態類型語言的編譯階段,強制類型轉換髮生在動態類型語言的運行時。
JS天生的動態類型語言,所以JS中統一講強制類型轉換。
一、JS中的強制類型轉換
首先看如下所示代碼:
var a = 42;
var b = a + ''; // 隱式強制類型轉換
var c = String(a); // 顯式強制類型轉換
相較於,第三行代碼使用String對變數a進行封裝而言,第二行代碼的類型轉換並非那麼明顯,更像是'+'操作符的副作用,所以我們把這種情況稱為隱式強制類型轉換,而顯式的通過原生函數封裝的方式則稱為顯式強制類型轉換。當然,這隻是作者的一種觀點而已,但是這種觀點對於區分這兩種類型轉換還是有好處的。
二、JSON.stringify()
如果要將對象字元串化,可以使用JSON.stringify()。這個方法可以帶參數,參數可以是以下兩種情況:
- 參數是一個字元串數組,數組元素是要執行序列化的對象的屬性名稱:
var a = {
b: 1,
c: '1',
d: [1,2,3]
};
JSON.stringify(a, ['b', 'c']); // "{"b":1,"c":"1"}"
- 參數是一個函數,這個函數有兩個參數,key和value,這個函數會首先對要序列化的對象自身調用一次,然後對對象的每個屬性調用一次,然後如果對象的屬性值是可迭代的,會繼續對屬性值中的每個屬性再依次調用。
var a = {
b: 1,
c: [1,23,3]
};
JSON.stringify(a, function(k, v){
console.log('key:',k,' value:',v);
return v;
})
列印輸出如下:
key: value: {b: 1, c: Array(3)}
key: b value: 1
key: c value: (3) [1, 23, 3]
key: 0 value: 1
key: 1 value: 23
key: 2 value: 3
JSON.stringify的執行結果:
"{"b":1,"c":[1,23,3]}"
JSON.stringify還有第三個參數,可以指定縮進符,讓生成的字元串更容易被閱讀:
JSON.stringify(a, null, 2);
輸出結果:
"{
"b": 1,
"c": [
1,
23,
3
]
}"
預設是空格縮進,所以2表示縮進兩個空格,你也可以傳入別的字元。
三、假值對象
這一點牽扯到了其他值向布爾值的強制類型轉換。日常開發中我們經常用到如下所示類型的代碼:
var a = '111';
if (a) {
...
}
if語句對a做了一個隱式強制類型轉換,我們知道空字元串會被轉換為false,非空就是true,包括'0'這種情況。
ES規範列舉如下幾種會轉為假值的值:
- undefined
- null
- false
- +0, -0, NaN
- ''
除了這幾種值,我們可以認為別的情況都會被轉為true。包括空對象{}。但是,還存在一種假值對象,會被轉為false。
作者舉了一個document.all的類數組對象,會被轉為false。現實情況確實是這樣。但是似乎這種假值對象並不是很多,多數作為坑存在,我覺得知道有這麼一個東西存在就可以了。
四、parseInt()和Number()
- paeseInt():解析字元串中的數字
- Number():將字元串強制類型轉換為數字
解析允許字元串中含有非數字字元,解析從左到右,遇到第一個非數字字元停止,返回第一個非數字字元之前的所有數字。
轉換不允許字元串含有非數字字元,否則返回NaN。
這兩種方式各有各的使用場景。
五、||和&&
在JS中,||和&&這兩個運算符有一些特殊,如果接觸過java、C等語言。我們可能會想當然的把它們稱作邏輯運算符,返回值為true或false。但是在JS中,這兩個運算符的返回值並不全是true和false,而是返回兩個操作數中的一個。
var a = 1;
var b = "2";
var c = {};
var d = true;
a || b; // 1
a && b; // "2"
b || c; // "2"
b && c; // {}
c || d; // {}
c && d; // true
在JS中,||和&&操作符會首先對第一個操作數執行判斷,如果值不是布爾值,首先執行強制類型轉換:
- 對“||”而言,如果第一個操作數強制類型轉換後為true,則直接返回第一個操作數,否則,直接返回第二個操作數。
- 對“&&”而言,如果第一個操作數強制類型轉換後為false,則直接返回第一個操作數,否則,直接返回第二個操作數。
所以,現在我們就能更好的理解如下所示的這種代碼的執行機制到底是怎麼回事了:
var a = '1';
var b = '2';
if (a && b) {
...
}
首先,(a && b)
這個表達式我們知道返回值是'2',然後if語句對這個結果執行了隱式強制類型轉換,轉換後的結果為true。
六、寬鬆相等和嚴格相等
在瞭解了強制類型轉換後,我們也就能對==
和===
有一個更清晰的理解。
==
允許在相等比較中進行強制類型轉換,而===
不允許。