在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ JS中的字面量變量為什么會有方法?

JS中的字面量變量為什么會有方法?

var num = 4;
num.toString();// 4
var nnum = new Number(4)
nnum.toString(); // 4

clipboard.png

clipboard.png

從瀏覽器里可以看出,這個num變量已經(jīng)和nnum已經(jīng)別無二致了。

clipboard.png
但是這里又不同,這是怎么做到的?

回答
編輯回答
毀了心

基本類型在進行點操作時會被轉(zhuǎn)化為包裝類型。 這也就是為什么說JS中萬物皆對象的原因

2017年11月24日 12:43
編輯回答
薄荷糖

我看了你對其他答案的評論,你希望看到比較權威的 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

  1. Let baseReference be the result of evaluating MemberExpression.
  2. Let baseValue be ? GetValue(baseReference).
  3. Let bv be ? RequireObjectCoercible(baseValue).
  4. Let propertyNameString be StringValue of IdentifierName.
  5. If the code matched by this MemberExpression is strict mode code, let strict be true, else let strict be false.
  6. 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 了嗎?這就是你要的答案。

2018年5月29日 05:31
編輯回答
獨特范

自動裝箱了解一下

2017年2月15日 01:53
編輯回答
心夠野

請參考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ù)字值。
2017年2月10日 10:10
編輯回答
獨特范
var num = 4; // num 為基本類型number
num.toString();// 4   Number(num).toString()  包裝器
var nnum = new Number(4) // 顯示定義一個Number對象
nnum.toString(); // 4

typeof num; // number
typeof nnum; // object
2018年5月24日 23:20
編輯回答
局外人
var nnum = new Number(4)
nnum.toString()

這里對Number對象實例化了一個對象,因此nnum具備該對象所繼承/自身定義的屬性和方法。

var num = 4; 
num.toString();

實際上每當讀取一個基本類型時,都會創(chuàng)建一個基本包裝類型的類對象,并在操作完方法后賦值給變量并將創(chuàng)建的對象銷毀,可以了解下基本包裝類型

2017年10月8日 08:58
編輯回答
雅痞
var num = 4;
num.toString();// 4
var nnum = new Number(4)
nnum.toString(); // 4

num是一個原始類型的值,可以自動當作對象調(diào)用,即調(diào)用各種對象的方法和參數(shù)。這時,JavaScript 引擎會自動將原始類型的值轉(zhuǎn)為包裝對象實例,在使用后立刻銷毀實例。
使用new Number()時,會將原始數(shù)據(jù)類型轉(zhuǎn)為對象,所以nnum instanceof Number輸出為true。
具體可以查看下包裝對象。

2018年1月17日 09:39