Object.keys(anObject) 是不是返回 anObject 的原型? [复制]

Posted

技术标签:

【中文标题】Object.keys(anObject) 是不是返回 anObject 的原型? [复制]【英文标题】:Does Object.keys(anObject) return anObject's prototype? [duplicate]Object.keys(anObject) 是否返回 anObject 的原型? [复制] 【发布时间】:2019-01-26 13:07:30 【问题描述】:

我正在阅读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) 返回的数组中,但是当我记录它的键时返回一个空数组?是不是我理解错了?

【问题讨论】:

【参考方案1】:

Object.keys(anObject) 返回一个数组,toString 是数组上的有效方法。

由于in 检查对象中的属性,并在其原型链中,表达式"toString" in Object.keys(anObject) 返回true

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

【讨论】:

我明白了!我现在明白我做错了什么。【参考方案2】:

你理解正确,但是这里in的用法是错误的。

它返回 true,因为 Object.keys(anObject) 返回的 Array 在其原型中有一个名为 toString 的属性。 in 也检查原型,而hasOwnProperty 只检查 Object 实际具有的属性(即“手动添加”到空 Object 的属性)。

但它没有名为 toString 的“自己的财产”

let anObject = ;
let keys = Object.keys(anObject);

console.log("toString" in keys); //true, since there is a property "toString" in the keys.prototype object
console.log(keys.hasOwnProperty("toString")); //false, since there aren't any properties in the object itself

【讨论】:

我明白了,这就是原因。但是,该段落说“作为in 运算符的替代方法,您可以使用hasOwnProperty 方法...”。既然它说hasOwnProperty 是一种替代方法,我如何使用in 运算符获得false 结果? 它在“忽略对象的原型。”之后的几句话中表示,in 不会忽略对象的原型。 我明白了! “替代”这个词误导我认为这两种选择都是可行的,谢谢!【参考方案3】:

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

众所周知,数组是 Javascript 中特殊类型的对象,具有诸如 forEach()、length、map()、toString()、sort() 等方法/属性。上述这些方法存在于数组的原型中,而不是数组本身。而hasOwnProperty 只检查对象实际拥有的属性,而不是其原型中的属性。阅读有关in 运算符here 的更多信息。另外,使用Object.prototype.hasOwnProperty.call(obj, prop) 而不是obj.hasOwnProperty(prop)。阅读为什么?here。

【讨论】:

我明白了!谢谢你的回答,我也读过 MDN,但我可能对“替代”这个词很困惑,因为我认为 inhasOwnProperty 都是可行的选择。

以上是关于Object.keys(anObject) 是不是返回 anObject 的原型? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:为啥是 Object.keys(someobject),而不是 someobject.keys?

折叠在 IE11 上不起作用(Object.keys:参数不是对象)

Object.keys映射返回对象Object而不是ReactJS中的文本输入表单中的值

Object.keys 迭代导致 Typescript 错误“元素隐式具有‘任何’类型,因为索引表达式不是‘数字’类型”

Object.keys(),Object.values(),Object.entries()

Joi.object() 和 Joi.object().keys() 有啥区别?