一. 基本概念
ES6的重要改变包括:
- Arrow function(箭头函数)
- Promise
- Generator
- let 和 const
- Class(类)
- Module(模块)
- Multiline strings(多行字符串)
- Template literal(模板字面量)
- Default parameters(默认参数)
- The spread operator(展开操作符)
- Destructuring assignment(解构赋值)
- Enhanced object literals(增强的对象字面量)
- for…of 循环
- Map 和 Set
二. 分类详解
1. var let const变量
var
- var声明的变量的作用域是它当前执行的
上下文
。var声明的变量只能是全局
或整个函数块
。 - 函数内部使用var声明的变量,只属于函数内部,在函数外部是无法访问到函数内部的变量的,但是函数内可以访问到函数外部var定义的变量。
- var声明的变量可以重复声明并且赋值,不会报错。
- var声明的变量,会存在变量的声明提升的问题。
var name = 'wxw'; // 污染全局window的name属性
// 立即执行函数,可以使变量name私有化
(function () {
var name = 'wxw';
})();
let
-
let 声明的变量是
块级作用域
。 -
let变量的作用域仅限于
for循环
,if语块
,普通的块{}
内部,这点与var相似,但最大的区别是:var声明的变量的作用域是整个封闭函数
。
function varTest() {
var x = 1;
if (true) {
var x = 22; // 这个x是与上面同一个变量!
console.log(x); // 22
}
console.log(x); // 22
}
function letTest() {
let x = 1;
if (true) {
let x = 22; // 这个x是不同变量!
console.log(x); // 22
}
console.log(x); // 1
}
- 在同一个函数或块作用域内重复声明同一个变量是会报错的,可以重复赋值,但不可重复声明。
let name = 'wxw';
let name = '万达'; // 报错,不可多次声明
name = '万达'; // ok ,正确赋值
- 用var声明的变量有初始化值
undefined
,但通过let声明的变量直到他们的定义被执行时才进行的初始化。所以在变量初始化之前访问该变量会导致ReferenceError
错误。该变量处在一个自块顶部到初始化处理的暂存死区
中。
function foo() {
console.log(param1); // undefined
console.log(param2); // ReferenceError错误!
var param1 = 'bar';
let param2 = 'bar2';
}
const
-
const 也是块级作用域
-
const声明的变量不可再次声明,也不可再次赋值修改。
-
const声明的引用类型对象,例如对象,数组,其本身不可修改,但是对象的内部属性值可以修改。
const person ={
name:'wxw',age:32 }
person = {
name:'www'} // 报错,不可修改person对象本身
person.name="王晓文" // 修改对象内部属性,OK,没有问题,正确赋值
const jerry =Object.freeze(person); // 冻结对象,不可增删改这个对象的已有属性
// 使用var声明,会导致结果永远为循环最后值
for (var index = 0; index < 10; index++) {
console.log(index);
setTimeout(function () {
console.log(`index-${
index}`);
}, 1000) // var: 10遍10 let: 依次输出 0- 9
}
console.log(`index-${
index