var num = 4;
num.toString();// 4
var nnum = new Number(4)
nnum.toString(); // 4
從瀏覽器里可以看出,這個num變量已經(jīng)和nnum已經(jīng)別無二致了。
但是這里又不同,這是怎么做到的?
我看了你對其他答案的評論,你希望看到比較權威的 ECMAScript 規(guī)范:
num.toString() 是一個屬性訪問運算符 Property Accessors,具體規(guī)范在 https://www.ecma-internationa... 具體的分類是:
MemberExpression . IdentifierName
而 MemberExpression 的規(guī)范在 https://www.ecma-internationa... 里面列了很多,但是在這個例子中,屬于
PrimaryExpression
我們繼續(xù)跟蹤 PrimaryExpression,規(guī)范定義在 https://www.ecma-internationa...
而 num 屬于 IdentifierReference
如果寫 10.36.toString() 則屬于 Literal。
而 (10).toString() 中,(10) 屬于括號表達式。
所以在 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 了嗎?這就是你要的答案。
請參考JavaScript高級程序設計 第5章 5.6節(jié)基本包裝類型
為了便于操作基本類型值,ECMAScript 還提供了 3 個特殊的引用類型: Boolean 、 Number 和
String 。這些類型與本章介紹的其他引用類型相似,但同時也具有與各自的基本類型相應的特殊行為。
實際上,每當讀取一個基本類型值的時候,后臺就會創(chuàng)建一個對應的基本包裝類型的對象,從而讓我們
能夠調(diào)用一些方法來操作這些數(shù)據(jù)。來看下面的例子。
var s1 = "some text";
var s2 = s1.substring(2);
這個例子中的變量 s1 包含一個字符串,字符串當然是基本類型值。而下一行調(diào)用了 s1 的
substring() 方法,并將返回的結(jié)果保存在了 s2 中。我們知道,基本類型值不是對象,因而從邏輯上
講它們不應該有方法(盡管如我們所愿,它們確實有方法)。其實,為了讓我們實現(xiàn)這種直觀的操作,
后臺已經(jīng)自動完成了一系列的處理。當?shù)诙写a訪問 s1 時,訪問過程處于一種讀取模式,也就是要
從內(nèi)存中讀取這個字符串的值。而在讀取模式中訪問字符串時,后臺都會自動完成下列處理。
(1) 創(chuàng)建 String 類型的一個實例;
(2) 在實例上調(diào)用指定的方法;
(3) 銷毀這個實例。
可以將以上三個步驟想象成是執(zhí)行了下列 ECMAScript 代碼。
var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null;
經(jīng)過此番處理,基本的字符串值就變得跟對象一樣了。而且,上面這三個步驟也分別適用于 Boolean
和 Number 類型對應的布爾值和數(shù)字值。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。