indexOf 但对于对象?

indexOf but for objects?

我想查看一个对象并将它的每个现有属性分配给一个变量。

有 4 个可能的属性。有些对象有全部 4 个。有些可能只有两个。

如何检查特定的 属性 是否存在?是否有等效于数组的 indexOf() 而不是对象?

使用in关键字:

"key" in object

哪个 returns truefalse,取决于对象或其原​​型链中的任何东西是否具有 属性.

您也可以使用 object.hasOwnProperty("key"),如果对象具有 key 作为其自身的 属性,那么它只会是 true,而不是它的原型。示例:

var object = {};
"toString" in object; // true
object.hasOwnProperty("toString"); // false

请注意(根据@dandavis 的评论),如果 object 有一个名为 hasOwnProperty 的自定义 属性,这会受到阻碍;要解决此问题,请使用 hasOwnProperty.call(object, "key")。示例:

var a = {hasOwnProperty: Boolean};
a.hasOwnProperty('name'); // true
hasOwnProperty.call(a, 'name'); // false

var obj = {
  foo: 1,
  bar: 2,
  baz: 3
}

Object.keys(obj).forEach(function(key) {
  window[key] = obj[key]
})

console.log(foo, bar, baz)

或者在 ES2015 中

const obj = {
  foo: 1,
  bar: 2,
  baz: 3
}

function assignPrivateVars() {
  let {foo, bar, baz} = obj;
  console.log(foo, bar, baz);
}

assignPrivateVars();

如果您只对直接在对象上设置的属性感兴趣(无法通过原型链访问),那么 hasOwnProperty 将提供一个布尔值 true,如果对象具有指定的 属性.

例如:如果 testObject.propertyToCheckFor 存在,testObject.hasOwnProperty('propertyToCheckFor') 将 return true,否则将是 false

查看以下代码以获得更扩展的示例:

var obj1 = {
  a: 1
};
var obj2 = {
  a: 1,
  b: 2
};
var obj3 = {
  b: 2,
  c: 3
};
var obj4 = {
  a: 1,
  b: 2,
  c: 3
};


// For dispaly purposes
document.write('<pre>' + JSON.stringify({
  obj1: {
    hasA: obj1.hasOwnProperty('a'),
    hasB: obj1.hasOwnProperty('b'),
    hasC: obj1.hasOwnProperty('c')
  },
  obj2: {
    hasA: obj2.hasOwnProperty('a'),
    hasB: obj2.hasOwnProperty('b'),
    hasC: obj2.hasOwnProperty('c')
  },
  obj3: {
    hasA: obj3.hasOwnProperty('a'),
    hasB: obj3.hasOwnProperty('b'),
    hasC: obj3.hasOwnProperty('c')
  },
  obj4: {
    hasA: obj4.hasOwnProperty('a'),
    hasB: obj4.hasOwnProperty('b'),
    hasC: obj4.hasOwnProperty('c')
  }
}, null, 2) + '</pre>');

您可以使用解构赋值。如果未定义值,变量将设置为 undefined。您还可以检查变量是否在解构后定义,然后通过引用 delete 变量。

var data = {a:1, b:2, c:3};

var {a, b, c, d} = data; // `d`: `undefined`