Let和const
不存在变量提升
只要块级作用域内存在let命令,它所申明的变量就绑定这个区域,不再受外部影响。凡是在声明之前就使用这些变量就会报错。
Let不允许在相同的作用域内,重复声明一个变量
ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。一对大括号就是一个块。
ES5规定函数只能在顶层作用域和函数作用域中声明,不能在块级作用域声明。
ES6引入了块级作用域,明确允许在块级作用域中声明函数。并且函数声明的行为类似于let,在块级作用域之外不可引用。但是考虑到环境导致的行为差异太大,应该避免在块级作用域内声明函数,写成函数表达式更好。
Const声明一个只读的常量,一旦声明,常量的值就不能改变。这意味着const一旦声明变量,就必须立即初始化。
也存在暂时性死区,只在声明所在的块级作用域内有效。也不可重复声明
对于复合类型的变量,变量名不指向数据,而是指向数据的地址。Const只是保证变量名指向的地址不变。
ES6一共又6种声明变量的方法:let,const,var,function,import,class
Let和const声明的全局变量不属于全局对象的属性。
变量的解构赋值
事实上,只要某种结构具有Iterator接口,都可以采用数组形式的解构赋值。
解构赋值允许指定默认值。
Var [foo = true] = []; //foo = true
解构不仅可以用于数组,还可以用于对象。数组的元素是按次序排序的,变量的取值由他的位置决定,而对象的属性没有次序,变量必须与属性同名才能取得正确的值。
Let { log, sin, cos } = Math; //将Math对象的对数,正弦,余弦三个方法赋值到对应的变量。
var o ={a: 5};
let {a,b=2,c} = o;
console.log(a)
字符串的解构赋值
Const [a,b,c,d,e] = ‘hello’
Let { length: len} = ‘hello’ //len = 5
解构赋值的规则是只要等号右边的值不是对象,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。
函数参数的解构赋值
变量解构赋值用途很多
1.交换变量的值
[x, y] = [ y, x ]
2.从函数返回多个值
3.函数参数的定义:解构赋值可以方便的将一组参数与变量名对应起来。
4.提取JSON数据
5.函数参数的默认值
6.遍历Map结构:任何部署了Iterator接口的对象,都可以用for…of循环遍历。Map结构原生支持Iterator接口,配合变量的解构赋值,获取键名和键值就非常方便
7.输入模块的指定方法
const { SourceMapConsumer, SourceNode } = require(“source-map”);
字符串的扩展
字符的Unicode表示法
codePointAt()方法:能够正确处理四个字节储存的字符,返回一个字符的码点。
String.fromCodePoint()方法可以识别0xFFFF的字符
为字符串添加了遍历接口,使得字符串可以被for…of循环遍历。
除了遍历字符串,这个遍历器的最大的优点是可以识别大于0xFFFF的码点。
ES5提供charAt方法,返回字符串给定位置的字符
Normalize()
传统上,JavaScript只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串种,ES6又提供了三种新方法
Includes()
startsWith()
endsWith()
这三个方法都支持第二个参数,表示开始搜索的位置。
Repeat()方法:返回一个新字符串,表示将原字符串重复n次
padStart(),padEnd():ES7提供了字符串补全长度的功能。
模板字符串:增强版的字符串,,用反引号
标识,它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量
模板字符串中嵌入变量,需要将变量名写在${}之中
数组的扩展