use*_*672 20 javascript hasownproperty
在我看来,有四种不同的方法可以确定给定的对象(例如foo)是否具有bar定义的给定属性(例如):
if (foo.hasOwnProperty(bar)) {if ('bar' in foo) {if (typeof foo.bar !== 'undefined') {if (foo.bar === undefined) {要确定对象中是否存在名为" bar"的属性foo,这些语句中的所有三个都是等效的吗?是否有任何我不知道的sublte语义会使这三个语句中的任何一个不同?
ken*_*ytm 17
不,他们是完全不同的.例:
foo = {bar: undefined};
Object.prototype.baz = undefined;
Object.prototype.bing = "hello";
Run Code Online (Sandbox Code Playgroud)
然后:
(typeof foo.bar != "undefined") === false
('bar' in foo) === true
(foo.hasOwnProperty('bar')) === true
(typeof foo.baz != "undefined") === false
('baz' in foo) === true
(foo.hasOwnProperty('baz')) === false
(typeof foo.bing != "undefined") === true
('bing' in foo) === true
(foo.hasOwnProperty('bing')) === false
Run Code Online (Sandbox Code Playgroud)
逻辑明智的:
foo.hasOwnProperty('bar') 暗示 'bar' in footypeof foo.bar != "undefined" 暗示 'bar' in fooAda*_*man 10
这些都是不同的:
foo.hasOwnProperty('bar')告诉您是否foo具有该属性并且不在原型链中执行查找.
'bar' in foo检查原型链,当它bar在链中的任何对象中找到属性时返回true .
typeof foo.bar != 'undefined'如果foo或者原型链中的任何对象具有属性bar且值不是,则返回true undefined.
这是一个演示这些差异的示例:
var foo1 = { 'bar1': 10, 'bar2': undefined };
function ctor() {}
ctor.prototype = foo1;
var foo2 = new ctor();
foo2.bar3 = 20;
console.log(foo2.hasOwnProperty('bar1')); // false
console.log(foo2.hasOwnProperty('bar2')); // false
console.log(foo2.hasOwnProperty('bar3')); // true
console.log(foo2.hasOwnProperty('bar4')); // false
console.log('bar1' in foo2); // true
console.log('bar2' in foo2); // true
console.log('bar3' in foo2); // true
console.log('bar4' in foo2); // false
console.log(typeof foo2.bar1 != 'undefined'); // true
console.log(typeof foo2.bar2 != 'undefined'); // false
console.log(typeof foo2.bar3 != 'undefined'); // true
console.log(typeof foo2.bar4 != 'undefined'); // false
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1027 次 |
| 最近记录: |