为什么JavaScript中Object.entries()和array.entries()返回结果不同?
为什么
Object.entries(array)和array.entries()返回结果不同 两者是完全独立的API,归属、返回值类型、设计目标都存在差异,只是方法名恰好相同,本质不是同一个方法。
方法归属与核心逻辑差异
Object.entries()是Object构造函数的静态方法,支持传入任意类型的对象(数组本身是特殊的键为数字索引的对象)作为参数。它会直接遍历目标对象所有可枚举的字符串键属性,一次性返回一个真实的二维数组,每个子项固定为[键名, 对应值]的格式。
测试代码中调用Object.entries(game.scored)时,方法直接把数组的每个索引转为字符串键,和对应球员名拼成子数组,最终返回包含4个键值对的完整数组,所以控制台能直接打印出所有内容。array.entries()是数组原型上的实例方法,属于数组迭代器系列方法(和array.keys()、array.values()为同组API)。它不会一次性生成并返回所有键值对组成的数组,而是返回一个符合迭代器协议的Array Iterator对象。这个对象不会在初始化时就把所有内容加载到内存,你需要通过for...of循环、展开运算符...、Array.from()或者手动调用迭代器的next()方法,才能逐次拿到内部存储的键值对。直接打印迭代器对象,控制台只会显示它的类型标识,不会展示内部内容。
实际效果对比
const scored = ['Lewandowski', 'Gnarby', 'Lewandowski', 'Hummels']; // Object.entries 直接返回完整二维数组,键为字符串类型 const objectEntriesRes = Object.entries(scored); console.log(objectEntriesRes); // 输出: [ ["0","Lewandowski"], ["1","Gnarby"], ["2","Lewandowski"], ["3","Hummels"] ] // 数组实例entries()返回迭代器对象,直接打印看不到内部值 const arrayEntriesIter = scored.entries(); console.log(arrayEntriesIter); // 输出: Array Iterator {} // 用Array.from消费迭代器后拿到的结果,键为数字类型 console.log(Array.from(arrayEntriesIter)); // 输出: [ [0,"Lewandowski"], [1,"Gnarby"], [2,"Lewandowski"], [3,"Hummels"] ]
设计差异的原因
Object.entries()作为通用对象处理API,返回实体数组是为了降低使用成本,拿到结果就能直接做遍历、转Map等操作,适配所有对象的通用处理场景。- 数组的
entries()返回迭代器,一方面是为了惰性求值的性能优势,处理超大数组时不需要一开始就把所有键值对加载到内存;另一方面是为了和JS生态中所有支持迭代器的语法、API无缝配合,使用更灵活。
注意:哪怕把数组
entries()返回的迭代器转成实体数组,和Object.entries()的返回结果也有细微差别:前者的索引键是数字类型,后者的索引键是字符串类型,这是Object属性键默认会转为字符串/Symbol的特性决定的。
内容的提问来源于stack exchange,提问作者PaulT
相关产品推荐
相关产品推荐

