2013-03-20 65 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;除了声明一个变量之外别无其他。默认情况下它是'未定义的'。

相关问题