我正在阅读Eloquent JavaScript's Map section,但无法理解其最后一段:
如果您确实有一个出于某种原因需要作为地图处理的普通对象,那么知道
Object.keys
仅返回对象自己的键,而不返回原型中的键是很有用的。作为in
运算符的替代方法,您可以使用hasOwnProperty
方法,该方法将忽略对象的原型。
然后我假设Object.keys
不返回对象从其原型继承中获取的属性和方法。所以我尝试了以下方法:
var anObject = {};
console.log(Object.keys(anObject)); //Array []
console.log("toString" in Object.keys(anObject)); //true
console.log(anObject.hasOwnProperty("toString")); //false
显然,toString
在Object.keys(anObject)
返回的数组中,但是当我记录其键时返回空数组吗?我对段落有误解吗?
答案 0 :(得分:8)
您正确理解了段落,但是此处in
的使用是错误的。
它返回true,因为Object.keys(anObject)
返回的数组在其原型中具有一个名为toString
的属性。 in
还检查原型,而hasOwnProperty
仅检查对象实际具有的属性。
但是它没有名称为toString
let anObject = {};
let keys = Object.keys(anObject);
console.log("toString" in keys); //true
console.log(keys.hasOwnProperty("toString")); //false
答案 1 :(得分:3)
Object.keys(anObject)
返回一个数组,而toString
是数组上的有效方法。
由于in
在对象及其原型链中检查属性,因此表达式"toString" in Object.keys(anObject)
返回true
。
但这并不意味着toString
是anObject
的财产。这就是anObject.hasOwnProperty("toString")
返回false
的原因。
答案 2 :(得分:1)