本文提到的對象到字符串和數(shù)字的轉(zhuǎn)換規(guī)則只適用于本地對象慨丐。什么是本地對象呢?本地對象也叫做內(nèi)置對象泄私,也就是JS標準規(guī)范定義的對象或類房揭。比如Array
, object
, function
, data
, global
。還有一類對象即宿主對象挖滤,顧名思義崩溪,宿主,宿主斩松,就要有一個寄生的對象和環(huán)境伶唯,在JS中宿主對象都是寄生在瀏覽器中的。在瀏覽器中才存在的對象惧盹。比如event
乳幸,BOM 和DOM對象皆是。
本地對象都繼承了倆個轉(zhuǎn)換方法钧椰,toString()
與valueOf()
粹断。
對象到字符串的轉(zhuǎn)換過程
toString()方法用在對象上面,比如function
, array
,object
嫡霞,返回的值都差不多瓶埋,都是返回這個對象的源碼。但是是以字符串表示的形式诊沪。例如:
var a = [1,2]; var b = a.toString(); console.log(b); typeof b; //1,2 //"string"
函數(shù)類返回的結果也類似养筒,可以從下面的實例中看出來:
var fun = function() { return "hello world!"; } var obj = fun.toString(); console.log(obj); typeof obj; //function () { return "hello world!"; } //"string"
valueOf存在任意原始值,它就默認將對象轉(zhuǎn)換為表示它的原始值端姚。如果是復合值呢晕粪,和toString方法一樣,即返回本身渐裸。但是還是和toString()方法有區(qū)別巫湘,tostring返回的是以字符串形式表示,valueOf()返回的是以對象的形式表示:
var arr = [true, "string"]; var obj = arr.valueOf(); console.log(obj); typeof obj; // [true, "string"] //"object"
var a = {}; a.toString(); a.valueOf(); //"[object Object]" //Object {}
對象是空對象時昏鹃,不管是toString方法或者valueof返回的形式有點讓人很迷惑尚氛,toString()看上去更上一個對象的表示,不過對他們用typeof以查看就清楚了然了洞渤,toString返回的確是一個字符串表示的對象形式怠褐,而valueof返回的才是真正的對象。
var b = a.toString(); var c = a.valueOf(); console.log(typeof b); //string console.log( typeof c) //object
如果讓對象和進行比較呢 您宪?又會發(fā)生什么,比如:
var a = {}; var c = a.toString(); console.log(a==c); // true
這里在進行比較的時候奈懒,我們可以看到奠涌,a在執(zhí)行了toString方法之后,就是一個字符串磷杏,但是在比較的時候溜畅,既字符串和對象比較的時候,返回的是true极祸,a是一個對象慈格,在比較時發(fā)生了隱式的類型轉(zhuǎn)換。遵循對象到字符串先調(diào)用tostring的方法遥金。那如果我們手動把a用valueOf轉(zhuǎn)換一下呢浴捆。 比如:
var d = a.valueOf(); console.log(d==c); // true
console.log(c); // [object Object] console.log(d); // Object {} console.log(d===c);
情況還是和上面是一樣的,但是如果不想他們進行自動轉(zhuǎn)換就要使用嚴格相等了稿械,這樣的情況下选泻,我們可以很清楚的看到返回的false。
console.log(d===c); // false
數(shù)組的在執(zhí)行了之上的過程也是一樣的美莫。在此就不贅述了页眯。
總結
對象到字符串的轉(zhuǎn)換
首先調(diào)用toString方法,只有當toString不返回一個原始值的時候厢呵,才會調(diào)用valueOf()窝撵。toString方法但是基本上所有對象都返回字符串。所以對象到字符串形式的轉(zhuǎn)換基本都是使用toString方法襟铭。
倆個方法都不返回原始值時碌奉,會拋出錯誤。
對象到數(shù)字的轉(zhuǎn)換過程
首先調(diào)用的valueOf(),如果返回原始值寒砖,將原始值轉(zhuǎn)換為數(shù)字并返回赐劣。valueOf,基本上所有的 對象返回的都是對象入撒,雖然先使用valueOf隆豹,但是實際上也是使用的toString的方法椭岩。
我們明白了這些規(guī)則有什么用茅逮?比如為什么空數(shù)組轉(zhuǎn)換為數(shù)字是?單個數(shù)組的元素為數(shù)字的同樣轉(zhuǎn)換為一個數(shù)字
判哥,比如:
var rr = [], dd = 2; console.log(rr < dd); // true
為什么返回true,因為在執(zhí)行比較的時候献雅,是對象和數(shù)字的比較,需要先把對象轉(zhuǎn)換數(shù)字塌计,先把rr對象進行隱式的類型轉(zhuǎn)換挺身,調(diào)用valueOf方法,但是返回的是一個對象锌仅,所以調(diào)用toString章钾,toString方法返回的是一個空的字符串墙贱,空的字符串直接轉(zhuǎn)換為0;JS引擎在內(nèi)部運算的時候,我的理解是隱形的執(zhí)行了這些元算贱傀;
var gg = rr.toString(); Number(gg); //0
運算符惨撇,及其他比較大小的運算符時,都會做對象到原始值的轉(zhuǎn)換府寒,對象到原始值的轉(zhuǎn)換基本都是對象到數(shù)字的轉(zhuǎn)換魁衙,但是要除去日期對象的特殊情形,日期對象 到原始值轉(zhuǎn)換規(guī)則為對象到字符串模式株搔。本篇文章是對《JS權威指南》第三章對象到原始值的轉(zhuǎn)換的一個讀書筆記剖淀。如果有什么的描述的不對,敬請指正纤房!