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
显然,toString
在Object.keys(anObject)
返回的数组中,但是当我记录它的键时返回一个空数组?是不是我理解错了?
【问题讨论】:
【参考方案1】:Object.keys(anObject)
返回一个数组,toString
是数组上的有效方法。
由于in
检查对象中的属性,并在其原型链中,表达式"toString" in Object.keys(anObject)
返回true
。
但这并不意味着toString
是anObject
的所有财产。这就是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,但我可能对“替代”这个词很困惑,因为我认为in
和 hasOwnProperty
都是可行的选择。以上是关于Object.keys(anObject) 是不是返回 anObject 的原型? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
Javascript:为啥是 Object.keys(someobject),而不是 someobject.keys?
折叠在 IE11 上不起作用(Object.keys:参数不是对象)
Object.keys映射返回对象Object而不是ReactJS中的文本输入表单中的值
Object.keys 迭代导致 Typescript 错误“元素隐式具有‘任何’类型,因为索引表达式不是‘数字’类型”