2016-02-28 75 views
6

如果我們添加了一個方法,以數函數(或布爾或字符串)這樣爲什麼一個原始變量就像一個對象?

Number.prototype.sayMyNumber = function(){ 
    return "My number is " + this; 
} 

,然後創建若干對象將其分配給一個變量

var num1 = new Number(34); 
num1.sayMyNumber(); // it says "My number is 34" 

這是精細和預期,因爲我們創建'Number'對象。

同樣,如果我要創建一個原始變量

num2 = 34; 
num2.sayMyNumber(); // it says "My number is 34" 

出人意料的是,NUM2也有一個方法sayMyNumber(),即使我們沒有明確創建一個Number對象。

然後我試圖像這樣,

34.sayMyNumber(); // error, this does not work 

爲什麼NUM2工作?

更新

這是一個後續問題,我問在註釋部分,我把它這裏更好的可視性

下面的答案提到NUM2被認爲是一個「數'內部對象。這使我更加困惑。

typeof num1 === "number" // returns false 
typeof num2 === "number" // returns true 

typeof num1 === "object" // returns true 
typeof num2 === "object" // returns false 

這不是說num2不是「對象」嗎? 如果它不是一個「對象」,那麼這怎麼會是「數字」的實例?

+2

在'34.sayMyNumber()'點被視爲導致錯誤的**小數點**。如果你想在這種情況下強制方法調用,你必須使用parens。 'num2'工作原因導致JS中的任何數字都是'Number'實例,即使它被定義爲文字 – hindmost

+0

甚至當我像這樣寫'(2).sayMyNumber()'時它也不起作用。不知道這是否與上面 –

+0

一樣誠實(whatever_number).yourFunction()的作品 –

回答

-3

對於這兩種,

var num1 = new Number(34); 
num2 = 34; 

要分配"Number"類型值都num1num2變量。所以它稱爲原型,它連接到"Number"

但調用34.sayMyNumber有語法錯誤和非法的聲明。

如果任何人有這個問題請參考... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number

+0

有人可以解釋爲什麼downvotes?如果在這裏出現錯誤,我會修復... –

+1

'num1'和'num2'確實有不同的類型。 – Bergi

+0

我已經提到了類型值...並且mozillaa說「正在創建的對象的數值...」新的Number(value); 如果參數不能轉換爲數字,則返回NaN。 在非構造函數上下文中(即沒有new運算符),可以使用Number來執行類型轉換... https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/ Global_Objects/Number ... –

-3

JavaScript的基元和對象之間的要挾。在這種情況下,數字值被強制轉換爲Number對象,以便訪問該原型方法sayMyNumber。實際上,通過這種方式,原語可以訪問由它們各自的對象構造函數定義的所有屬性和方法。但是,它們與對象不同,因爲它們是不可變的。

因此,(34).sayMyNumber();作品;這樣做(34).toFixed()(34).toPrecision()

至於34.sayMyNumber();,作爲最後面指出的那樣,是一個語法錯誤。

+1

數字肯定不會像對象一樣對待。 – Bergi

3

原始類型數字具有相應的對象表示形式,您可以使用new Number創建對應的對象表示形式。這是一個對象,因此與原始類型數字數據類型不同。

如果您致電Number(34)(不含new),則不會創建對象,但Number函數會執行類型轉換,以實現原始數值。

var num1 = new Number(34); // object 
var num2 = 34; // primitive 

當您在原始數num2撥打sayMyNumber(),JavaScript的內部轉換原始暫時爲其等效的對象版本。並且因爲您添加了sayMyNumber()Number.prototype您可以訪問此功能。

原因34.sayMyNumber()不起作用是因爲當JavaScript引擎解析你的源代碼時,它必須解釋一個點在給定上下文中的含義。在34.sayMyNumber()的情況下,點可能不明確。這是否意味着小數點分隔符?或者它是否意味着對象成員訪問? JavaScript選擇將所有整數後面跟一個點解釋爲表示浮點數的一部分。但是由於沒有這樣的數字34.sayMyNumber(),它會引發一個SyntaxError。 Read more here

+0

當typeof不同時,它們如何相同?typeof num1 =「object」和'typeof num2 =「number」? –

+0

您是不是指'var num1 = Number(34)'。一個'Number'不是一個對象,所以'new'沒有意義。 – doug65536

+0

你是對的@ doug65536。我只是複製了OP的代碼行,並沒有想到'new'。 – swenedo

相關問題