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

JS中的字面量變量為什么會(huì)有方法?

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

clipboard.png

clipboard.png

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

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

回答
編輯回答
毀了心

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

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

我看了你對(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。

  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
編輯回答
獨(dú)特范

自動(dòng)裝箱了解一下

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

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

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

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

var num = 4; 
num.toString();

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

2017年10月8日 08:58
編輯回答
雅痞
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ì)象。

2018年1月17日 09:39