4.1 对象
它们存储属性(键值对),其中:
- 属性的键必须是字符串或者 symbol(通常是字符串)。
- 值可以是任何类型。
我们可以用下面的方法访问属性:
- 点符号: obj.property。
- 方括号 obj[“property”],方括号允许从变量中获取键,例如 obj[varWithKey]。
其他操作:
- 删除属性:delete obj.prop。
- 检查是否存在给定键的属性:”key” in obj。
- 遍历对象:for(let key in obj) 循环。
如果对象为空,不会进到循环
for (let key in obj) {
return false;
}
使用 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
let id = Symbol("id"); // 创建symbol,不用new, 括号里是description
let user = {
name: "John",
age: 30,
[id]: 123, // 要用[],否则变成字符串
};
for (let key in user) alert(key); // name, age (no symbols)
// 使用 Symbol 任务直接访问
alert("Direct: " + user[id]);
用 Symbol.for(key) 创建全局 symbol,同名相同
// 从全局注册表中读取
let id = Symbol.for("id"); // 如果该 Symbol 不存在,则创建它
// 再次读取(可能是在代码中的另一个位置)
let idAgain = Symbol.for("id");
// 相同的 Symbol
alert(id === idAgain); // true