indexOf,但用于对象

indexOf but for objects?

本文关键字:对象 用于 indexOf      更新时间:2023-09-26

我想查看一个对象,并将其存在的每个属性分配给一个变量。

有4种可能的属性。有些物体有全部4个。有些人可能只有两个。

如何检查一个特定的属性是否存在?是否有一个等效的indexOf()数组,但对象代替?

使用in关键词:

"key" in object

返回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

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

例如:如果testObject.propertyToCheckFor存在,则testObject.hasOwnProperty('propertyToCheckFor')返回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>');

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();

可以使用解构赋值。如果没有定义value,变量将被设置为undefined。你也可以在解构delete变量后通过引用检查变量是否被定义。

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