知识卡片
对象是键控集合
内容
JS 对象是可变键控集合,属性名可以是任意字符串,属性值可以是任意值包括 undefined(并非现代新增能力,而是原书”属性值不能是undefined”表述本身不准确)。读取得 undefined 因此不能区分属性不存在和值就是undefined,判断存在性应用 Object.hasOwn(obj, key) 而非比较取值。发散:把对象当散列表理解,比套用类模型更接近本性。
参考来源
- 位置:《JavaScript语言精粹(修订版)》第3章《对象 Objects》开篇与"检索"一节
- 结论依据:原文定义对象是属性的容器,属性值可以是除 undefined 之外的任何值,同时"检索"一节举例说明访问不存在的属性同样返回 undefined(如 `stooge["middle-name"] // undefined`)。原书把"undefined"当作属性值的例外情形,但现代 JavaScript 允许显式赋值 undefined,因此"取值为 undefined"与"属性不存在"在语言层面本就无法区分,只能靠 Object.hasOwn 等存在性检测方法区分,据此对原文表述做了事实修正。
- 原始内容:对象是属性的容器,其中每个属性都拥有名字和值。属性的名字可以是包括空字符串在内的任意字符串。属性值可以是除undefined值之外的任何值……如果你尝试检索一个并不存在的成员属性的值,将返回undefined。stooge["middle-name"] // undefined