对象名字和属性的名字是大小写敏感

对象中未赋值的属性的值为undefined

JavaScript中的对象只能使用String类型作为键类型,所以注意将 Object类型作为键添加到对象上时,会调用 obj.toString() 方法

例如当我们使用数字 0 作为属性 key 时,它将被转化为字符串 "0"

let obj = {
  0: "test" // 和 "0": "test" 相同
};

// 两个 alert 访问的是同一个属性(数字 `0` 被转化为了字符串 "0")
alert( obj["0"] ); // test
alert( obj[0] ); // test(同一个属性)

保留字段可以被用作属性名。

正如我们所知道的,像 “for”、“let” 和 “return” 等保留字段不能用作变量名。

但是对于对象的属性,没有这些限制。任何名字都可以:

let obj = {
  for: 1,
  let: 2,
  return: 3
}

alert( obj.for + obj.let + obj.return );  // 6

我们可以将任意字符串作为属性键(key),只有一个特殊的:__proto__ 因为历史原因要特别对待。

比如,我们不能把它设置为非对象的值:

let obj = {};
obj.__proto__ = 5; // 分配一个数字
alert(obj.__proto__); // [object Object] — 值为对象,与预期结果不同

我们从代码中可以看出来,把它赋值为 5 的操作被忽略了。

关于 __proto__ 的详细信息将在稍后的 原型继承 一章中详细介绍。

到目前为止,重要的是要知道,如果我们打算将用户提供的密钥存储在对象中,则 __proto__ 的这种行为可能会成为错误甚至漏洞的来源。