-
let命令
let命令存在块级作用域,两个变量分别使用var和let声明两个变量,然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值;let暂时性死区,只要块级作用域内存在let命令,所声明的的变量就“绑定binding”这个区域,不再受外部影响
if (true) {
var a = 10;
let b = 20;
}
console.log(a); //10
console.log(b); //Uncaught ReferenceError: b is not defined
let不存在变量提升,用let声明变量,极大的消除了代码的潜在bug的隐患
//var的情况
console.log(foo);
var foo = 2; //undefined
//let的情况
console.log(bar);
let bar = 2; //ReferenceError: Cannot access 'bar'
-
const命令
声明一个只读的常量,一旦声明,常量的值就不能改变
-
箭头函数
//定义函数
var f = function(v) {
return v;
};
//箭头函数
var f = v => v
-
如果箭头函数不需要参数或者多个参数,就使用一个圆括号代表参数部分
let f = () => 5;
// 等同于
let f = function() { return 5 };
let sum = (num1, num2) => {
return num1 + num2;
};
// 等同于
let sum = function(num1, num2) {
return num1 + num2;
};
-
如果只有一个参数,那么圆括号可以省略
let f = str => {
console.log(str);
}
f('hello');
-
如果函数体的代码只有一句,那么大括号可以省略
let f = str => console.log(str);
f('hello');
-
如果函数体中的代码只有一个return语句,那么return关键词也必须省略
//这是错误的
let sum = (num1, num2) => return num1 + num2;
//这是正确的
let sum = (num1, num2) => num1 + num2;
-
由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号
let getTempItem = id => ({ id:id, name:'Temp' })
-
使用箭头函数简化回调函数
let arr = [1,2,3];
// function函数写法
arr = arr.map(function(x) {
return x * x;
});
// 箭头函数写法
arr = arr.map(x => x * x);
-
类
包含constructo构造方法,this关键字代表实例对象,定义“类”的方法时,前面不需要加function关键字,方法之间不需要逗号分隔,会报错
constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须要有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加
constructor与普通构造函数的区别:类的构造函数,不使用new是没法调用的,会报错。而constructor不用new也可以执行
//定义类
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
//创建对象
let p = new Point(1,2);
console.log(p.toString());
-
模块化实现
export命令:用于规定模块的对外接口
import命令:用于输入其他模块提供的功能
- 接受一对大括号,里面指定要从其他模块导入的变量名。大括号里面的变量名,必须与被导入模块对外接口的名称相同。
- 可以使用as关键字,将输入的变量重命名。
- 具有提升效果,会提升到整个模块的头部,首先执行。
- import是静态执行,所以不能使用表达式和变量,这些只有在运行时才能得到结果的语法结构。
- 如果多次重复执行同一句import语句,那么只会执行一次,而不会执行多次。
export default命令
为了给用户提供方便,让他们不用阅读文档就能加载模块,就要用到export default命令,为模块指定默认输出。