for in Object.prototype.hasOwnProperty() Object.prototype.isPrototypeOf() Object.prototype.getOwnPropertyNames() Object.prototype.keys() Object.getOwnPropertySymbol() JSON.stringify()
检测一个对象是否含有特定的自身属性
o = new Object();
o.prop = 'exists';
o.hasOwnProperty('prop'); // 返回 true
o.hasOwnProperty('toString'); // 返回 false
o.hasOwnProperty('hasOwnProperty'); // 返回 false
// 遍历一个对象的所有自身属性
var buz = {
fog: 'stack'
};
for (var name in buz) {
if (buz.hasOwnProperty(name)) {
alert("this is fog (" + name + ") for sure. Value: " + buz[name]);
}
else {
alert(name); // toString or something else
}
}
// JavaScript 并没有保护 hasOwnProperty 属性名,因此某个对象是有可能存在使用这个属性名的属性
// 使用外部的 hasOwnProperty 获得正确的结果是需要的
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // 始终返回 false
// 如果担心这种情况,可以直接使用原型链上真正的 hasOwnProperty 方法
({}).hasOwnProperty.call(foo, 'bar'); // true
// 也可以使用 Object 原型上的 hasOwnProperty 属性
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true
检查一个对象是否存在一另一个对象的原型链上
Object.prototype.isPrototypeOf(o); // true
检查它自身(或其原型链)是否包含具有指定名称的属性
// 数组
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
0 in trees // 返回true
3 in trees // 返回true
6 in trees // 返回false
"bay" in trees // 返回false (必须使用索引号,而不是数组元素的值)
"length" in trees // 返回true (length是一个数组属性)
Symbol.iterator in trees // 返回true (数组可迭代,只在ES2015+上有效)
// 内置对象
"PI" in Math // 返回true
// 自定义对象
var mycar = {make: "Honda", model: "Accord", year: 1998};
"make" in mycar // 返回true
"model" in mycar // 返回true
// 继承属性
"toString" in {}; // 返回true
"toString" in o; // 返回true
返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组
Object.getOwnPropertyNames(o); // ["prop"]
返回一个给定对象自身的所有 Symbol 属性的数组
Object.getOwnPropertySymbols(o); // []
返回一个由一个给定对象的自身可枚举属性组成的数组
数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致
如果对象的键-值都不可枚举,那么将返回由键组成的数组
Object.keys(o); // ["prop"]