yorickshan
6/26/2019 - 1:27 PM

对象属性的判断和遍历

for in Object.prototype.hasOwnProperty() Object.prototype.isPrototypeOf() Object.prototype.getOwnPropertyNames() Object.prototype.keys() Object.getOwnPropertySymbol() JSON.stringify()

Object.prototype.hasOwnProperty

检测一个对象是否含有特定的自身属性

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

检查一个对象是否存在一另一个对象的原型链上

Object.prototype.isPrototypeOf(o); // true

in

检查它自身(或其原型链)是否包含具有指定名称的属性

// 数组
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

for...in

Object.prototype.getOwnPropertyNames()

返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组

Object.getOwnPropertyNames(o); // ["prop"]

Object.prototype.getOwnPropertySymbols()

返回一个给定对象自身的所有 Symbol 属性的数组

Object.getOwnPropertySymbols(o); // []

Object.prototype.keys()

返回一个由一个给定对象的自身可枚举属性组成的数组

数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致

如果对象的键-值都不可枚举,那么将返回由键组成的数组

Object.keys(o); // ["prop"]

JSON.stringify()