2013-03-20 80 views
-2

作爲一個初學者,與現有代碼的工作,我遇到了以下幾點:爲什麼要將變量聲明爲新對象?

var foo = {}; 

我相信這是等同於:

var foo = new Object(); 

我的印象是,任何變量是自動下一個對象,那麼具體編碼的目的是什麼,而不是隻聲明一個空變量:

var foo; 

回答

5

I was under the impression that any variable was automatically an Object

這是一個錯誤的印象。如果您聲明一個變量並沒有爲它分配一個值,它被初始化爲undefined(如提in the spec和描述in detail),這是不是一個對象(這是一個原始值):

var foo; 
console.log(foo); // undefined 

如果你要試圖設置未定義的變量的屬性,你會得到一個類型錯誤:

var foo; 
foo.example = "hello"; // TypeError: Cannot set property 'example' of undefined 

但是,如果您分配一個空對象變量,上面的代碼就會成功:

var foo = {}; // Now refers to an empty object (equivalent to `new Object()`) 
foo.example = "hello"; 
console.log(foo); // '{example:"hello"}' 

我相信你的理解可能源於常見的誤解,即「JavaScript中的所有內容都是對象」。 這不是真的。 JavaScript中的很多東西都是對象,但原始值不是。例如:

var a = "hello"; // String primitive, not an object 
var b = new String("hello"); // String instance, object 
var c = 10; // Number primitive, not an object 
var d = true; // Boolean primitive, not an object 
var e; // Undefined value, not an object 
var f = null; // Null value, not an object 
+0

好的答案..如果我們初始化成爲對象的變量? – sasi 2013-03-20 10:27:54

+0

@sasi - 如果將一個對象分配給該變量,則它引用一個對象。如果你指定了其他的東西(例如字符串文字),那麼它會引用它。 – 2013-03-20 10:29:31

+0

該規範的引用有點混亂,我認爲[變量語句]部分(http://ecma-international.org/ecma-262/5.1/#sec-12.2)更容易一些。 – RobG 2013-03-20 10:31:54

-1

變種富=新的對象()也給出了新的對象可被用於操縱對象繼承和調用由定義標準對象功能的JavaScript

在這裏看到有關細節的原型屬性你如何操縱object.protype:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/prototype

+1

功能有原型。對象具有構造函數。構造函數是函數。 {}和新的Object()是相同的。使用文字({})語法。 var f = {}; f.constructor; // function Object(){} f.constructor.prototype // Object {} – Geuis 2013-03-20 10:41:49

+1

對不起,我不想 – 2013-03-20 11:47:41

0

詹姆斯的答案是正確的。如果他太投入過多的信息(如果是的話,稍後再提及它),下面是一個快速總結。

你在這是正確的:var foo = {}和var foo = new Object()不僅是等價的,結果是相同的。只使用對象文字。 (忽略新的Object(),新的Array()等)。

var foo;除了聲明一個變量之外別無其他。默認情況下它是'未定義的'。

相關問題