ES6新特性
const
- 声明常量,要赋初始值,不能重复声明
- 产生块级作用域
- 对数组或对象元素的修改,不算对常量的修改
- 不存在变量提升
- 不影响作用域链
作用域
局部作用域
- 函数作用域:函数内部声明的变量只能在函数内部访问
- 块作用域:使用{}包裹的代码块内部声明的变量外部有可能无法访问
- let和const产生块作用域
- var不会产生块作用域
全局作用域:
<script>标签和js文件的最外层,声明的变量在其他任何作用域都能访问- window对象动态添加的属性也是全局的
- 函数中未使用任何关键字声明的变量也是全局的
作用域链:优先查找当前,依次查找父级作用域
变量和函数提升
代码执行前,所有var声明的变量被提升到当前作用域的最前面。只提升声明,不提升赋值。
代码执行前,所有函数声明被提升到当前作用域的最前面。
解构赋值
1 | //数组解构赋值 |
模板字符串
箭头函数
rest参数
与arguments的区别
- 语法:arguments是一个内置对象,而rest参数是通过…语法创建的。
- 类型:arguments是一个类数组对象,而rest参数是一个真正的数组。
- 位置:rest参数必须放在函数参数列表的最后面,而arguments对象在任何函数中都可用。
- 功能:rest参数提供了一个数组,可以直接使用数组的方法,而arguments对象需要转换才能使用数组方法。
Symbol
- Symbol的值是唯一的,用来解决命名冲突问题
- Symbol值不能与其他数据进行运算
- Symbol定义的对象属性不能使用for in或for of循环遍历,但是可以使用Object.getOwnPropertySymbols() 和 Reflect.ownKeys()来获取对象的所有键名
迭代器
1 | const banji = { |
生成器
1 | function * generator(){ |
应用实例
- 解决回调地狱
1 | //回调地狱 |
- 异步编程
1 | function getUsers(){ |
Promise
1 | const fs = require("fs") |
Set
1 | const arr1 = [3,1,4,1,5,9,2,6] |
class
构造函数执行过程
- 创建新对象
- 构造函数this指向新对象
- 执行构造函数代码,修改this,添加新的属性
- 返回新对象
原型对象
- 每个构造函数都有一个prototype属性,指向原型对象
- 这个对象可以挂载函数,对象实例化不会多次创建原型上的函数,节约内存
- 构造函数通过原型分配的函数是所有对象所共享的,可以将不变的方法直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法
- 构造函数和原型对象中的this都指向实例化的对象
constructor
原型对象上的构造器,指向构造函数
对象原型
实例对象的__proto__属性,指向构造函数的原型对象
原型链
- 当访问一个对象的属性和方法时,首先查找这个对象自身有没有该属性。
- 如果没有就查找它的原型(就是
__proto__指向的prototype原型对象。 - 如果还没有就继续查找原型对象的原型,直至查找到null
- 可以用 instanceof 运算符检测构造函数的prototype属性是否出现在某个实例对象的原型链上。
模块化
babel
babel是一个JavaScript编译器
1 | npm i babel-cli babel-preset-env browserify -D |
1 | //代码转换 |