Object.keys(anObject)是否返回anObject的原型?

时间:2018-08-20 11:48:55

标签: javascript object prototype

我正在阅读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

显然,toStringObject.keys(anObject)返回的数组中,但是当我记录其键时返回空数组吗?我对段落有误解吗?

3 个答案:

答案 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

但这并不意味着toStringanObject的财产。这就是anObject.hasOwnProperty("toString")返回false的原因。

答案 2 :(得分:1)

  

如果指定的属性位于指定的对象或其原​​型链中,则in运算符将返回true。

众所周知,数组是Javascript中特殊的对象类型,具有诸如forEach(),length,map(), toString(),sort()等方法/属性。这些前述方法存在于阵列的原型中,而不存在于阵列本身中。而hasOwnProperty仅检查对象实际具有的属性,而不检查其原型中的属性。详细了解in运算符here。另外,使用Object.prototype.hasOwnProperty.call(obj, prop)代替obj.hasOwnProperty(prop)。阅读为什么? here