常用 ES6 语法
解构赋值相对于额外写了赋值语句,对象解构赋值可以理解为导出(反过来不全),可以有默认值。函数的形参也可以使用对象在函数体内实现解构,对象属性名可以计算(let key = "z";let o = { [key]: foo })。for of 迭代解构,该加 let 还是要加
Enhanced Object Literals (增强的对象文本):o = {a:1,b(){}} // 直接表示对象: a =1 , o = {a}
// ({a, b} = {a:1, b:2});
let,const 定义的变量在初始化前不能使用,前面的区域叫做 TDZ(temporal dead zone),区别 var
// let, const 声明时会初始化成 undefined
// let, const 顶级定义的变量不会创建成全局对象的属性,而是全局范围下的变量
const 指不会重新赋值的量(值还是可以修改)
参数相当于使用了 let 定义,function foo(x= y, y) {console.log(x)} foo() // 错误,默认参数 y 在 TDZ 中
默认参数在它们被实际使用的时候才会被执行(避免重复执行默认参数中的函数),默认参数处于外层作用域和函数体作用域之间,是一个特殊的作用域:
// 实参只要为 undefined 就会使用默认参数
// 会默认声明到函数体内, function foo(y = 1){console.log(y);var y = 1}; foo(10) // => 10
// 默认参数是函数的话Firefox也会在函数体内执行(跟上一条规则类似),let y = 1;function foo(x = function () {console.log(y)}, y = 2) {x();var y = 3;console.log(y);x();}foo(); // 233 , 而Chrome会在默认参数环境中执行// 232
let const(声明时必须赋值) 不能重复声明(后面var也不行)
// for…in,for…of, if 等语句中用 var 是定义在外面, let 是定义在后面的语句块中。
在类中直接写构造函数 constructor(),可以传参数初始化对象
class只是 JavaScript 现有的、基于原型的继承模型的一种语法包装(语法糖),它能让我们用更简洁明了的语法实现继承。
// class 将 以前的构造函数和 、原型对象写在一起了,静态函数是构造函数的方法
constructor外面包括可继承的原型方法/字段和类静态方法/字段。
构造函数中的 this 就是实例对象
super 关键字调用父对象(继承对象,即构造函数的prototype属性)的构造器和函数:
super([arguments]); // 访问父对象上的构造函数
super.functionOnParent([arguments]); // 访问父对象上的方法
// 注意: 在派生类中,super() 必须在你使用 this 之前调用,
// 否则会导致引用错误。
// super 只能用在速记方法定义中。
extends 关键字可以用来创建继承于某个类的子类。class childClass extends superClass{}
静态方法(static fnm())经常作为程序的工具函数使用。
1 个参数的时候小括号可以省略。表达式只有一条不需要大括号,且此时该表达式的值就是此函数的返回值.不带参数的函数需要括号。直接返回对象表达式时可以用圆括号括起来(因为{}也是函数体/语句块的标识符)。
在過去,函數的 this 變數在不同狀況下一直指向不同值 (例如當建構子呼叫時指向的是新建構的物件、undefined 在 strict 模式、當以物件方法呼叫時只向呼叫物件),這樣的特性對物件導向程式設計來說其實相當麻煩。箭頭函數會自動將 this 變數綁定到其定義時所在的物件
由於 this 變數已被綁定,所以透過 call 或 apply 呼叫箭頭函數只能傳入參數但無法改變 this:
- 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
- 不可以当作构造函数,也就是说,不可以使用 new 命令,否则会抛出一个错误。
- 不可以使用 arguments 对象,该对象在函数体内不存在。如果要用,可以用 Rest 参数代替。
- 不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数。
… 展开操作符可以将有长度的空数组转为 undefined 数组,[...Array(5)]。