4.1 对象

它们存储属性(键值对),其中:

  • 属性的键必须是字符串或者 symbol(通常是字符串)。
  • 值可以是任何类型。

我们可以用下面的方法访问属性:

  • 点符号: obj.property。
  • 方括号 obj[“property”],方括号允许从变量中获取键,例如 obj[varWithKey]。

其他操作:

  • 删除属性:delete obj.prop。
  • 检查是否存在给定键的属性:”key” in obj。
  • 遍历对象:for(let key in obj) 循环。

如果对象为空,不会进到循环

  1. for (let key in obj) {
  2. return false;
  3. }

使用 Object.assign()进行对象的拷贝,可以拷贝所有属性

4.3 垃圾回收

当对象或对象族不具备“可达性”时会被清除

4.4 this

this 的值是在代码运行时计算出来的

严格模式下,在没有对象的情况下 this == undefined
非严格模式下,this 是全局对象 window

箭头函数没有 this,他的 this 来自外部上下文

this 只有在函数(方法)被调用时才会有值,且其值为函数(方法)所在对象

4.5 new

构造函数,或简称构造器,就是常规函数,但大家对于构造器有个共同的约定,就是其命名首字母要大写。
构造函数只能使用 new 来调用。这样的调用意味着在开始时创建了空的 this,并在最后返回填充了值的 this。

如果 return 返回的是一个对象,则返回这个对象,而不是 this。
如果 return 返回的是一个原始类型,则忽略。

4.6 可选链

可选链 ?. 语法有三种形式:

  • obj?.prop —— 如果 obj 存在则返回 obj.prop,否则返回 undefined。
  • obj?.[prop] —— 如果 obj 存在则返回 obj[prop],否则返回 undefined。
  • obj.method?.() —— 如果 obj.method 存在则调用 obj.method(),否则返回 undefined。

4.7 symbol

  1. let id = Symbol("id"); // 创建symbol,不用new, 括号里是description
  2. let user = {
  3. name: "John",
  4. age: 30,
  5. [id]: 123, // 要用[],否则变成字符串
  6. };
  7. for (let key in user) alert(key); // name, age (no symbols)
  8. // 使用 Symbol 任务直接访问
  9. alert("Direct: " + user[id]);

用 Symbol.for(key) 创建全局 symbol,同名相同

  1. // 从全局注册表中读取
  2. let id = Symbol.for("id"); // 如果该 Symbol 不存在,则创建它
  3. // 再次读取(可能是在代码中的另一个位置)
  4. let idAgain = Symbol.for("id");
  5. // 相同的 Symbol
  6. alert(id === idAgain); // true