1桐早、值類型轉(zhuǎn)換
將值從一種類型轉(zhuǎn)換為另一種類型通常稱為類型轉(zhuǎn)換(type casting)驻子,這是顯式的情況进肯;隱 式的情況稱為強(qiáng)制類型轉(zhuǎn)換(coercion)。
也可以這樣區(qū)分:類型轉(zhuǎn)換發(fā)生在靜態(tài)類型語言的編譯階段腔呜,而強(qiáng)制類型轉(zhuǎn)換則發(fā)生在動態(tài)類型語言的運(yùn)行時(runtime)叁温。
“隱式強(qiáng)制類型 轉(zhuǎn)換”(implicit coercion)和“顯式強(qiáng)制類型轉(zhuǎn)換”的區(qū)別:我們能夠從代碼中看出哪些地方是顯式強(qiáng)制類型轉(zhuǎn)換,而隱式強(qiáng)制 類型轉(zhuǎn)換則不那么明顯核畴,通常是某些操作產(chǎn)生的副作用膝但。
例如:
var a = 42; // number
var b = a + ""; // 隱式強(qiáng)制類型轉(zhuǎn)換 string
var c = String( a ); // 顯式強(qiáng)制類型轉(zhuǎn)換 string
首先變量b強(qiáng)制類型是隱式的," + "運(yùn)算符的其中一個操作數(shù)是字符串膛檀,所以在此是字符串拼接锰镀,結(jié)果是數(shù)字42被強(qiáng)制轉(zhuǎn)換為字符串的42;
變量c則是通過String顯示的將a強(qiáng)制轉(zhuǎn)換為字符串咖刃;
2泳炉、抽象值操作
ToString、ToNumber 和 ToBoolean
2.1嚎杨、ToString
ToString負(fù)責(zé)處理非字符串到字符串的強(qiáng)制類型轉(zhuǎn)換
數(shù)組的默認(rèn) toString() 方法經(jīng)過了重新定義花鹅,將所有單元字符串化以后再用 "," 連接起 來:
var a = [1,2,3];
a.toString(); // "1,2,3"
toString() 可以被顯式調(diào)用,或者在需要字符串化時自動調(diào)用枫浙。
對大多數(shù)簡單值來說刨肃,JSON 字符串化和 toString() 的效果基本相同,只不過序列化的結(jié) 果總是字符串:
JSON.stringify( 42 ); // "42"
JSON.stringify( "42" ); // ""42"" (含有雙引號的字符串)
JSON.stringify( null ); // "null"
JSON.stringify( true ); // "true"
JSON.stringify(..) 在對象中遇到 undefined箩帚、function 和 symbol 時會自動將其忽略真友,在 數(shù)組中則會返回 null(以保證單元位置不變)。
例如:
JSON.stringify( undefined ); // undefined
JSON.stringify( function(){} ); // undefined
JSON.stringify( [1,undefined,function(){},4] ); // "[1,null,null,4]"
JSON.stringify( { a:2, b:function(){} } ); // "{"a":2}"
對包含循環(huán)引用的對象執(zhí)行 JSON.stringify(..) 會出錯紧帕。
toJSON() 應(yīng)該“返回一個能夠被字符串化的安全的 JSON 值”盔然,而不是“返回 一個 JSON 字符串”。