一、let和const
const和let的异同点
相同点:const和let都是在当前块内有效,执行到块外会被销毁,也不存在变量提升(TDZ),不能重复声明。
不同点:const不能再赋值,let声明的变量可以重复赋值。
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
ES6 以前,我们知道5种基本数据类型分别是Undefined,Null,Boolean,Number以及String,然后加上一种引用类型Object构成了JavaScript中所有的数据类型,但是ES6出来之后,新增了一种数据类型,名叫symbol,像它的名字表露的一样,意味着独一无二,意思是每个 Symbol类型都是独一无二的,不与其它 Symbol 重复。
可以通过调用 Symbol() 方法将创建一个新的 Symbol 类型的值,这个值独一无二,不与任何值相等。
二、字符串
1、模板字符串
字符串是JavaScript中基本类型之一,应该算是除了对象之外是使用最为频繁的类型吧,字符串中包含了例如substr,replace,indexOf,slice等等诸多方法,ES6引入了模板字符串的特性,用反引号来表示,可以表示多行字符串以及做到文本插值(利用模板占位符)。
可以用${}来表示模板占位符,可以将你已经定义好的变量传进括弧中,例如:
includes(str, index):如果在字符串中检测到指定文本,返回true,否则false。
startsWith(str, index):如果在字符串起始部分检测到指定文本,返回true,否则返回false。
endsWith(str, index):如果在字符串的结束部分检测到指定文本,返回true,否则返回false。
indexOf(str,index) 方法可返回某个指定的字符串值在字符串中首次出现的位置。(es5中方法)
如果你只是需要匹配字符串中是否包含某子字符串,那么推荐使用新增的方法,如果需要找到匹配字符串的位置,使用indexOf()。
三、函数
在ES5中,我们给函数传参数,然后在函数体内设置默认值,如下面这种方式。
在ES6中,我们使用新的默认值写法
四、箭头函数(=>)
1、箭头函数的左边表示输入的参数,右边表示输出的结果。
2、在箭头函数中,this属于词法作用域,直接由上下文确定,对于普通函数中指向不定的this,箭头函数中处理this无疑更加简单,如下:
3、箭头函数中没有arguments(我们可以用rest参数替代),也没有原型,也不能使用new 关键字,例如:
4、箭头函数给数组排序
5、尾调用优化
尾调用是指在函数return的时候调用一个新的函数,由于尾调用的实现需要存储到内存中,在一个循环体中,如果存在函数的尾调用,你的内存可能爆满或溢出。ES6中,引擎会帮你做好尾调用的优化工作,你不需要自己优化,但需要满足下面3个要求:
1、函数不是闭包;2、尾调用是函数最后一条语句;3、尾调用结果作为函数返回
尾调用实际用途——递归函数优化:在ES5时代,我们不推荐使用递归,因为递归会影响性能。但是有了尾调用优化之后,递归函数的性能有了提升。
未完待续~~~~
转自 https://segmentfault.com/a/1190000016068235?share_user=1030000006821344