Object.getOwnPropertyNames vs Object.keys
Object.getOwnPropertyNames vs Object.keys
在javascript中Object.getOwnPropertyNames
和Object.keys
的区别是什么?如能提供一些例子,我将不胜感激。
有一点区别。Object.getOwnPropertyNames(a)
返回对象a
的所有自己的属性。Object.keys(a)
返回所有可枚举的自身属性。这意味着,如果你在定义对象属性时没有将其中一些属性设置为enumerable: false
,这两个方法将会给你相同的结果。
很容易测试:
var a = {};
Object.defineProperties(a, {
one: {enumerable: true, value: 1},
two: {enumerable: false, value: 2},
});
Object.keys(a); // ["one"]
Object.getOwnPropertyNames(a); // ["one", "two"]
如果您在定义属性时没有提供属性属性描述符(意味着您没有使用Object.defineProperties
),例如:
a.test = 21;
则该属性将自动变为可枚举的,并将出现在两个方法的返回数组中。
另一个不同之处在于,在数组Object.getOwnPropertyNames
的情况下,方法将返回一个额外的属性length
。
var x = ["a", "b", "c", "d"];
Object.keys(x); //[ '0', '1', '2', '3' ]
Object.getOwnPropertyNames(x); //[ '0', '1', '2', '3', 'length' ]
创建对象时的文字表示法与构造函数。有件事让我困惑。
const cat1 = {
eat() {},
sleep() {},
talk() {}
};
// here the methods will be part of the Cat Prototype
class Cat {
eat() {}
sleep() {}
talk() {}
}
const cat2 = new Cat()
Object.keys(cat1) // ["eat", "sleep", "talk"]
Object.keys(Object.getPrototypeOf(cat2)) // []
Object.getOwnPropertyNames(cat1) // ["eat", "sleep", "talk"]
Object.getOwnPropertyNames(Object.getPrototypeOf(cat2)) // ["eat", "sleep", "talk"]
cat1 // {eat: function, sleep: function, talk: function}
cat2 // Cat {}
// a partial of a function that is used to do some magic redeclaration of props
function foo(Obj) {
var propNames = Object.keys(Obj);
// I was missing this if
// if (propNames.length === 0) {
// propNames = Object.getOwnPropertyNames(Obj);
// }
for (var prop in propNames) {
var propName = propNames[prop];
APIObject[propName] = "reasign/redefine or sth";
}
}
所以在我的例子中,foo
函数不能工作,如果我给它cat2类型的对象。
还有其他的方法可以创建对象所以也可以有其他的扭结
如前所述,.keys
不返回不可枚举的属性。
关于示例,其中一个陷阱案例是Error
对象:它的一些属性是不可枚举的。
所以当console.log(Object.keys(new Error('some msg')))
生成[]
时,console.log(Object.getOwnPropertyNames(new Error('some msg')))
生成["stack", "message"]
console.log(Object.keys(new Error('some msg')));
console.log(Object.getOwnPropertyNames(new Error('some msg')));
另一个区别是(至少对于nodejs)"getOwnPropertyNames"函数不能保证键的顺序,这就是为什么我通常使用"keys"函数:
Object.keys(o).forEach(function(k) {
if (!o.propertyIsEnumerable(k)) return;
// do something...
});
- 函数未在Object.keys或Object.getOwnPropertyNames下列出,但可以调用
- JSON.stringify和Object.keys在同一个对象上产生不同的结果
- 为什么 Object.keys() 和 for ..在不同的
- 如何避免在object.keys中不存在obj时发生错误
- 对非对象调用了gulp jscs Object.keys
- 为什么Object.keys显示id为key
- array.sort() 是否就地,即使在 Object.keys() 上操作也是如此
- 了解 JavaScript 中的 Object.keys
- Object.keys(obj).length 返回字符总和而不是记录总数
- Object.keys 在 Angularjs2 中不起作用
- Dojo Equivalent for Object.keys
- Object.keys 等效的 lodash 方法
- 使用 Object.keys() 获取字典的键
- Object.keys,如何在mongodb中获取键列表
- 如何将烦人的“for”循环转换为“Object.keys”例程或类似例程(JSLint)
- 令人费解的未捕获类型错误:在非对象上调用了 Object.keys
- 为什么 Object.keys(Array.prototype) 返回空数组
- Object.keys 在 Internet Explorer 中不起作用
- 在尝试获取request.body Nodejs中的所有字段时获取异常“Object.keys在尝试访问对象时调用非对象
- Object.keys forEach 返回未定义