Javascript中未定义和未定义之间的区别

时间:2010-08-05 23:57:23

标签: javascript

请参阅http://jsfiddle.net/FDhQF/1/了解一个简单的例子。

未定义的内容与Javascript中未定义的内容之间有什么区别?例如,尝试访问未定义的对象的属性(实际上,尝试访问变量)将返回undefined。但你也可以设置= undefined。当你这样做,尝试访问它仍然返回undefined,但指针仍然存在。如上所示,一个例子是如何迭代对象仍然遍历您已经(重新)声明为未定义的属性。看起来有两种不同的未定义。任何人都可以对这种情况有所了解吗?

2 个答案:

答案 0 :(得分:41)

访问未在对象上定义的属性和包含原始undefined值的属性,两者都将返回undefined

例如:

var obj = {
  a: undefined
};

obj.a; // undefined
obj.b; // undefined

区别在于a是自己的属性,b不是:

obj.hasOwnProperty('a'); // true
obj.hasOwnProperty('b'); // false

在第一种情况下,a是一个自己的属性,即使它包含undefined作为其值。在第二种情况下,b不是自己的属性,访问obj.b将在原型链中查找名为b的属性。

当原型链结束时(当它到达具有null [[Prototype]]的对象时),属性查找结束并显式返回undefined

您应该知道hasOwnProperty方法仅检查对象(自己的属性)上是否存在物理属性,但我们还有继承的属性,对于这种情况,我们可以使用in operator,例如:

function Test () {}
Test.prototype.a = 'foo'; // instances of Test will inherit from Test.prototype

var obj = new Test(); // { a="foo",  b="bar"}
obj.b = 'bar';

obj.hasOwnProperty('a');  // false
'a' in obj;               // true
obj.a;                    // 'foo'

obj.hasOwnProperty('b');  // true

如您所见,obj继承自Test.prototypea属性不是自有属性,但可通过原型链获取。这就是hasOwnProperty返回falsein运算符返回true的原因。

您可以通过[[Get]]内部操作

查看内部属性的解析方式

备注:

  • 在ECMAScript 3(语言标准最广泛实施的版本)上访问undefined作为标识符不被认为是安全的,因为它不是语言关键字(例如null) )只是全局对象的一个​​属性,它可以在这个版本的Spec。上写入,这意味着如果有人替换它的值(例如window.undefined = 'LOL';),它将破坏你的代码。

可以使用typeof operator作为@strager提及,例如:

if (typeof obj.prop == 'undefined') { /*....*/ }

此运算符始终返回一个字符串(使用== :)是安全的,其值取决于其操作数的类型,可能的值描述为here

解决此问题的另一种常见方法是声明您自己的undefined变量,该变量在函数范围内可用,例如,某些库使用以下模式:

(function(undefined) {
  // code here
})();

该函数有一个名为undefined的参数,它立即执行而不传递任何值(最后一对或者parens进行调用)。

也许值得一提的是,undefined global property最终在ECMAScript 5上描述为不可写(不可变,以及不可枚举且不可配置 - 不可删除 - )。

  • 直接从对象实例使用hasOwnProperty方法也不被视为 safe ,因为如果某个对象具有相同名称的属性,则原始方法将为阴影。例如:

    var obj = { hasOwnProperty: function () { /* evil code :) */ } };
    

如果你打电话:

    obj.hasOwnProperty('prop'); 

在对象上定义的方法将被执行(你不会想要这个,因为你确切地知道你要调用哪个方法...),因为它 shadow 来自{ {1}},但可以通过以下方式安全地调用:

Object.prototype

答案 1 :(得分:1)

Here是对“未定义”的一个很好的解释。然而,要点是将某些东西设置为“未定义”并不是UN定义它,因为“undefined”实际上是一个原始值,当一个变量(或属性)没有赋值时使用它。