javascript - Object.keys(anObject) 是否返回 anObject 的原型?
问题描述
我正在阅读Eloquent JavaScript 的 Map 部分,但我无法理解它的最后一段:
如果您确实有一个普通对象,出于某种原因需要将其视为映射,那么知道
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)
,但是当我记录它的键时返回一个空数组?我是不是理解错了这段话?
解决方案
您正确理解了这段话,但是in
这里的用法是错误的。
它返回 true,因为返回的 Array有一个在其原型中Object.keys(anObject)
调用的属性。还检查原型,而仅检查对象实际具有的属性(意味着“手动添加”到空对象的属性)。toString
in
hasOwnProperty
但它没有名称的“自己的财产”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
推荐阅读
- html - 为什么我的 CSS 格式没有出现在 Pandoc HTML 文档中?
- django - 总结 Django 中多个模型的总量
- python - 使用列表中的每个值更新字典键
- time-complexity - 证明 f(n) 是 O(n^4)
- c# - Azure 函数设计指南
- makefile - 如何使用makefile检查是否存在具有特定扩展名的文件
- python - 将函数传递给 odeint,该函数应根据 odeint 解决方案中的每个时间步而减少
- java - 如何找到两个字符串之间不同的单词?
- node.js - CosmosDB + NestJS:系统中已经存在指定id的实体
- java - 使用 IntelliJ 自动替换为 var