JS对象初始化时属性名是否有默认键值?countBy函数属性继承疑问
JS对象初始化与countBy函数疑问解答
问题一:JS对象初始化时,其属性名是否会被赋予默认的键(名称)值?
完全不会哦!JS对象的属性都是显式定义的,不存在什么“默认键值”一说,具体分几种情况来看:
- 如果是用对象字面量创建空对象,比如
const obj = {},这个对象一开始就是空的,没有任何属性; - 如果是字面量里写了属性,比如
const obj = { username: '张三' },那username就是你手动指定的键,值是'张三'; - ES6的属性简写
const username = '李四'; const obj = { username },其实是语法糖,等价于{ username: username },键还是你写的变量名,值是变量的内容,不是默认生成的; - 就算用构造函数
new Object()创建对象,默认也是空的,除非你主动给它添加属性。
只有像数组这种特殊对象,会自动生成索引作为键(比如const arr = [1,2]里的0、1),但这是数组的特有行为,不是普通对象的默认键。
问题二:countBy函数中对象name属性的“继承”疑惑
哈哈,其实这里根本不存在“继承”的问题啦!我来给你掰扯清楚:
你提到的countBy函数,不管是lodash里的实现还是你自己写的,它的核心逻辑都是把原有的可迭代项(比如你的对象数组),按照groupName函数的判断结果分组收集。举个具体的代码例子你就懂了:
// 假设这是你的对象数组 const fruitList = [ { name: '草莓', quantity: 1 }, { name: '芒果', quantity: 3 }, { name: '橘子', quantity: 2 } ]; // 自己实现一个简单的countBy function countBy(iterable, groupFn) { const groups = {}; for (const item of iterable) { // 用groupFn得到分组的标识(true/false) const groupKey = groupFn(item); // 如果这个组还不存在,就初始化一个空数组 if (!groups[groupKey]) { groups[groupKey] = []; } // 把原对象直接推到对应的组里! groups[groupKey].push(item); } return groups; } // 按quantity是否大于2分组 const groupedResult = countBy(fruitList, item => item.quantity > 2);
你看,countBy只是把fruitList里的每个对象原封不动地放进对应的分组数组里,这些对象本身就带有name属性和对应的值——所以你看到的name属性,本来就是每个对象自己的,不是从哪里“继承”来的哦!函数只是做了分类收集的工作,根本没修改或生成新的属性~
内容的提问来源于stack exchange,提问作者user16801
相关产品推荐
相关产品推荐

