var num = 4;
num.toString();// 4
var nnum = new Number(4)
nnum.toString(); // 4
從瀏覽器里可以看出,這個(gè)num變量已經(jīng)和nnum已經(jīng)別無(wú)二致了。
但是這里又不同,這是怎么做到的?
我看了你對(duì)其他答案的評(píng)論,你希望看到比較權(quán)威的 ECMAScript 規(guī)范:
num.toString()
是一個(gè)屬性訪問運(yùn)算符 Property Accessors,具體規(guī)范在 https://www.ecma-internationa... 具體的分類是:
MemberExpression . IdentifierName
而 MemberExpression 的規(guī)范在 https://www.ecma-internationa... 里面列了很多,但是在這個(gè)例子中,屬于
PrimaryExpression
我們繼續(xù)跟蹤 PrimaryExpression,規(guī)范定義在 https://www.ecma-internationa...
而 num
屬于 IdentifierReference
如果寫 10.36.toString()
則屬于 Literal。
而 (10).toString()
中,(10)
屬于括號(hào)表達(dá)式。
所以在 num.toString()
中,num
屬于 MemberExpression,toString
屬于 IdentifierName,.
就是 Property Accessors。
- Let baseReference be the result of evaluating MemberExpression.
- Let baseValue be ? GetValue(baseReference).
- Let bv be ? RequireObjectCoercible(baseValue).
- Let propertyNameString be StringValue of IdentifierName.
- If the code matched by this MemberExpression is strict mode code, let strict be true, else let strict be false.
- Return a value of type Reference whose base value component is bv, whose referenced name component is propertyNameString, and whose strict reference flag is strict.
看到上面的 RequireObjectCoercible 了嗎?這就是你要的答案。
請(qǐng)參考JavaScript高級(jí)程序設(shè)計(jì) 第5章 5.6節(jié)基本包裝類型
為了便于操作基本類型值,ECMAScript 還提供了 3 個(gè)特殊的引用類型: Boolean 、 Number 和
String 。這些類型與本章介紹的其他引用類型相似,但同時(shí)也具有與各自的基本類型相應(yīng)的特殊行為。
實(shí)際上,每當(dāng)讀取一個(gè)基本類型值的時(shí)候,后臺(tái)就會(huì)創(chuàng)建一個(gè)對(duì)應(yīng)的基本包裝類型的對(duì)象,從而讓我們
能夠調(diào)用一些方法來操作這些數(shù)據(jù)。來看下面的例子。
var s1 = "some text";
var s2 = s1.substring(2);
這個(gè)例子中的變量 s1 包含一個(gè)字符串,字符串當(dāng)然是基本類型值。而下一行調(diào)用了 s1 的
substring() 方法,并將返回的結(jié)果保存在了 s2 中。我們知道,基本類型值不是對(duì)象,因而從邏輯上
講它們不應(yīng)該有方法(盡管如我們所愿,它們確實(shí)有方法)。其實(shí),為了讓我們實(shí)現(xiàn)這種直觀的操作,
后臺(tái)已經(jīng)自動(dòng)完成了一系列的處理。當(dāng)?shù)诙写a訪問 s1 時(shí),訪問過程處于一種讀取模式,也就是要
從內(nèi)存中讀取這個(gè)字符串的值。而在讀取模式中訪問字符串時(shí),后臺(tái)都會(huì)自動(dòng)完成下列處理。
(1) 創(chuàng)建 String 類型的一個(gè)實(shí)例;
(2) 在實(shí)例上調(diào)用指定的方法;
(3) 銷毀這個(gè)實(shí)例。
可以將以上三個(gè)步驟想象成是執(zhí)行了下列 ECMAScript 代碼。
var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null;
經(jīng)過此番處理,基本的字符串值就變得跟對(duì)象一樣了。而且,上面這三個(gè)步驟也分別適用于 Boolean
和 Number 類型對(duì)應(yīng)的布爾值和數(shù)字值。
var num = 4;
num.toString();// 4
var nnum = new Number(4)
nnum.toString(); // 4
num是一個(gè)原始類型的值,可以自動(dòng)當(dāng)作對(duì)象調(diào)用,即調(diào)用各種對(duì)象的方法和參數(shù)。這時(shí),JavaScript 引擎會(huì)自動(dòng)將原始類型的值轉(zhuǎn)為包裝對(duì)象實(shí)例,在使用后立刻銷毀實(shí)例。
使用new Number()時(shí),會(huì)將原始數(shù)據(jù)類型轉(zhuǎn)為對(duì)象,所以nnum instanceof Number輸出為true。
具體可以查看下包裝對(duì)象。
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問,美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。