ToString
基本類型值的字符串化規(guī)則為:null 轉(zhuǎn)換為 "null",undefined 轉(zhuǎn)換為 "undefined",true 轉(zhuǎn)換為 "true"。數(shù)字的字符串化則遵循通用規(guī)則,極小和極大的 數(shù)字使用指數(shù)形式:
// 1.07 連續(xù)乘以七個(gè) 1000 var a = 1.07 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000; // 七個(gè)1000一共21位數(shù)字
a.toString(); // "1.07e21"
對(duì)普通對(duì)象來(lái)說(shuō),除非自行定義,否則 toString()(Object.prototype.toString())返回 內(nèi)部屬性 [[Class]] 的值
然而前面我們介紹過(guò),如果對(duì)象有自己的 toString() 方法,字符串化時(shí)就會(huì)調(diào)用該方法并 使用其返回值。
數(shù)組的默認(rèn) toString() 方法經(jīng)過(guò)了重新定義,將所有單元字符串化以后再用 "," 連接起 來(lái):
var a = [1,2,3];
a.toString(); // "1,2,3"
toString() 可以被顯式調(diào)用,或者在需要字符串化時(shí)自動(dòng)調(diào)用
JSON 字符串化
工具函數(shù) JSON.stringify(..) 在將 JSON 對(duì)象序列化為字符串時(shí)也用到了 ToString。
請(qǐng)注意,JSON 字符串化并非嚴(yán)格意義上的強(qiáng)制類型轉(zhuǎn)換,因?yàn)槠渲幸采婕?ToString 的相 關(guān)規(guī)則,所以這里順帶介紹一下。
對(duì)大多數(shù)簡(jiǎn)單值來(lái)說(shuō),JSON 字符串化和 toString() 的效果基本相同,只不過(guò)序列化的結(jié) 果總是字符串:
JSON.stringify( 42 ); // "42"
JSON.stringify( "42" ); // ""42"" (含有雙引號(hào)的字符串)
JSON.stringify( null ); // "null"
JSON.stringify( true ); // "true"
所有安全的 JSON 值(JSON-safe)都可以使用 JSON.stringify(..) 字符串化。安全的 JSON 值是指能夠呈現(xiàn)為有效 JSON 格式的值。
為了簡(jiǎn)單起見(jiàn),我們來(lái)看看什么是不安全的 JSON 值。undefined、function、symbol (ES6+)和包含循環(huán)引用(對(duì)象之間相互引用,形成一個(gè)無(wú)限循環(huán))的對(duì)象都不符合 JSON 結(jié)構(gòu)標(biāo)準(zhǔn),支持 JSON 的語(yǔ)言無(wú)法處理它們。
JSON.stringify(..) 在對(duì)象中遇到 undefined、function 和 symbol 時(shí)會(huì)自動(dòng)將其忽略,在 數(shù)組中則會(huì)返回 null
例如: