indexOf 但对于对象?
indexOf but for objects?
我想查看一个对象并将它的每个现有属性分配给一个变量。
有 4 个可能的属性。有些对象有全部 4 个。有些可能只有两个。
如何检查特定的 属性 是否存在?是否有等效于数组的 indexOf() 而不是对象?
使用in
关键字:
"key" in object
哪个 returns true
或 false
,取决于对象或其原型链中的任何东西是否具有 属性.
您也可以使用 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`
我想查看一个对象并将它的每个现有属性分配给一个变量。
有 4 个可能的属性。有些对象有全部 4 个。有些可能只有两个。
如何检查特定的 属性 是否存在?是否有等效于数组的 indexOf() 而不是对象?
使用in
关键字:
"key" in object
哪个 returns true
或 false
,取决于对象或其原型链中的任何东西是否具有 属性.
您也可以使用 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`