JavaScript:是否定义了成员?

use*_*672 20 javascript hasownproperty

在我看来,有四种不同的方法可以确定给定的对象(例如foo)是否具有bar定义的给定属性(例如):

  1. if (foo.hasOwnProperty(bar)) {
  2. if ('bar' in foo) {
  3. if (typeof foo.bar !== 'undefined') {
  4. 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 foo
  • typeof foo.bar != "undefined" 暗示 'bar' in foo
  • 但这些是你可以得出的唯一推论; 正如上述反例所示,其他任何影响都不是普遍存在的.


Ada*_*man 10

这些都是不同的:

  1. foo.hasOwnProperty('bar')告诉您是否foo具有该属性并且不在原型链中执行查找.

  2. 'bar' in foo检查原型链,当它bar在链中的任何对象中找到属性时返回true .

  3. 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)