let
let 是在声明的代码块内有效,var 是在全局范围内有效: let 只能声明一次,重复声明会报错, var 可以声明多次: let 不存在变量提升,var 会变量提升: 就是用var声明的变量,在声明变量之前使用会输出 undefined。 用let声明的变量,在声明变量 a 之前使用会报错。
const:
const声明的变量,声明的时候必须赋值,不然会报错,而且声明之后不允许改变。
注意,不允许改变的是变量的地址。
const对于简单类型(数值 number、字符串 string 、布尔值 boolean)来说就等于常量。
const对于复杂类型(对象 object,数组 array,函数 function)地址不能改变。
Set:
Set类似于数组,成员是唯一的,重复就会覆盖。
Set有实例属性size,方法 add delete has clear
Set遍历方法有 keys=values(因为只有值没有键) entries forEach,默认为values(可以 for(lex x of aset){})
Map:
Map数据结构,能够存放键值对(key,value),键的数据类型可以是基本类型数据也可以是对象,而值也可以是任意类型数据。不允许键重复。
实例属性size,实例方法set get has delete clear
遍历方法 keys values entries forEach (遍历顺序就是插入顺序), 默认遍历器接口entries(for (let [key, value] of map) {})
对象的解构赋值: 对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。 对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量。 如果变量名与属性名不一致,必须写成下面这样。 ``` let { foo: baz } = { foo: 'aaa', bar: 'bbb' }; baz // "aaa"
let obj = { first: 'hello', last: 'world' };
let { first: f, last: l } = obj;
f // 'hello'
l // 'world'
```
也就是说,对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。
与数组一样,解构也可以用于嵌套结构的对象。
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};
let { p, p: [x, { y }] } = obj;
x // "Hello"
y // "World"
p // ["Hello", {y: "World"}]
注意,这时p是模式,不是变量,因此不会被赋值。如果p也要作为变量赋值,可以写成下面这样。
对象的解构也可以指定默认值。
默认值生效的条件是,对象的属性值严格等于undefined。