请参阅http://jsfiddle.net/FDhQF/1/了解一个简单的例子。
未定义的内容与Javascript中未定义的内容之间有什么区别?例如,尝试访问未定义的对象的属性(实际上,尝试访问变量)将返回undefined
。但你也可以设置= undefined
。当你这样做,尝试访问它仍然返回undefined,但指针仍然存在。如上所示,一个例子是如何迭代对象仍然遍历您已经(重新)声明为未定义的属性。看起来有两种不同的未定义。任何人都可以对这种情况有所了解吗?
答案 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.prototype
,a
属性不是自有属性,但可通过原型链获取。这就是hasOwnProperty
返回false
而in
运算符返回true
的原因。
您可以通过[[Get]]
内部操作
备注:强>
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”实际上是一个原始值,当一个变量(或属性)没有赋值时使用它。