同时访问未在对象上定义的属性和包含基元的属性
undefined
价值,会回报你
未定义
例如:
var obj = {
a: undefined
};
obj.a; // undefined
obj.b; // undefined
不同的是
a
b
不是:
obj.hasOwnProperty('a'); // true
obj.hasOwnProperty('b'); // false
在第一种情况下
一
未定义
作为它的价值。在第二种情况下,
不是自己的财产,访问
obj.b
将查找名为
b
当原型链结束时(当它到达具有
null
[[Prototype]]
),属性查找结束,然后
未定义
显式返回。
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
一
属性不是
自有财产
拥有自己的财产
退货
false
以及
在里面
操作员返回
true
.
[[Get]]
内部操作
笔记:
-
因为标识符在ECMAScript 3(语言标准的最广泛实现版本)上被认为是不安全的,因为它不是语言关键字(例如
无效的
例如)只是全局对象的一个属性,它在这个版本的规范上是可写的,这意味着如果有人替换它的值(例如。
window.undefined = 'LOL';
这个
typeof
operator
可以使用@strager提到的,例如:
if (typeof obj.prop == 'undefined') { /*....*/ }
这个操作符总是返回一个字符串(使用起来很安全)
==
:),并且其值取决于其操作数的类型,可能的值如下所示
here
.
解决这个问题的另一个常见方法是声明自己的
变量,在函数范围内可用,例如,某些库使用以下模式:
(function(undefined) {
// code here
})();
函数有一个名为
未定义
也许值得一提的是
undefined
global property
最后在ECMAScript 5中被描述为不可写(不可变、不可枚举和不可配置-不可删除-)。
-
使用
拥有自己的财产
直接来自对象实例的方法也不被视为
,因为如果某个对象具有同名的属性,则原始方法将被隐藏。例如:
var obj = { hasOwnProperty: function () { /* evil code :) */ } };
obj.hasOwnProperty('prop');
将执行在对象上定义的方法(您不希望这样做,因为您确切地知道要调用哪个方法……),因为
阴影
Object.prototype
但是,可以通过以下方式安全地调用它:
Object.prototype.hasOwnProperty.call(obj, 'prop');