四. ES6
- 我们所说的 ES5 和 ES6 其实就是在 js 语法的发展过程中的一个版本而已
- ECMAScript 就是 js 的语法
- 以前的版本没有某些功能
- 在 ES5 这个版本的时候增加了一些功能
- 在 ES6 这个版本的时候增加了一些功能
- 因为浏览器是浏览器厂商生产的
- ECMAScript 发布了新的功能以后,浏览器厂商需要让自己的浏览器支持这些功能
- 这个过程是需要时间的
- 所以到现在,基本上大部分浏览器都可以比较完善的支持了
- 只不过有些浏览器还是不能全部支持
- 这就出现了兼容性问题
- 所以我们写代码的时候就要考虑哪些方法是 ES5 或者 ES6 的,看看是不是浏览器都支持
let 和 const 关键字
我们以前都是使用
var
关键字来声明变量的在 ES6 的时候,多了两个关键字
let
和const
,也是用来声明变量的只不过和 var 有一些区别
let
和const
不允许重复声明变量javascript// 使用 var 的时候重复声明变量是没问题的,只不过就是后面会把前面覆盖掉 var num = 100 var num = 200
javascript// 使用 let 重复声明变量的时候就会报错了 let num = 100 let num = 200 // 这里就会报错了
javascript// 使用 const 重复声明变量的时候就会报错 const num = 100 const num = 200 // 这里就会报错了
let
和const
声明的变量不会在预解析的时候解析(也就是没有变量提升)javascript// 因为预解析(变量提升)的原因,在前面是有这个变量的,只不过没有赋值 console.log(num) // undefined var num = 100
javascript// 因为 let 不会进行预解析(变量提升),所以直接报错了 console.log(num) // undefined let num = 100
javascript// 因为 const 不会进行预解析(变量提升),所以直接报错了 console.log(num) // undefined const num = 100
let
和const
声明的变量会被所有代码块限制作用范围javascript// var 声明的变量只有函数能限制其作用域,其他的不能限制 if (true) { var num = 100 } console.log(num) // 100
javascript// let 声明的变量,除了函数可以限制,所有的代码块都可以限制其作用域(if/while/for/...) if (true) { let num = 100 console.log(num) // 100 } console.log(num) // 报错
javascript// const 声明的变量,除了函数可以限制,所有的代码块都可以限制其作用域(if/while/for/...) if (true) { const num = 100 console.log(num) // 100 } console.log(num) // 报错
let
和const
的区别let
声明的变量的值可以改变,const
声明的变量的值不可以改变javascriptlet num = 100 num = 200 console.log(num) // 200
javascriptconst num = 100 num = 200 // 这里就会报错了,因为 const 声明的变量值不可以改变(我们也叫做常量)
let
声明的时候可以不赋值,const
声明的时候必须赋值javascriptlet num num = 100 console.log(num) // 100
javascriptconst num // 这里就会报错了,因为 const 声明的时候必须赋值
箭头函数
箭头函数是 ES6 里面一个简写函数的语法方式
重点: 箭头函数只能简写函数表达式,不能简写声明式函数
javascriptfunction fn() {} // 不能简写 const fun = function () {} // 可以简写 const obj = { fn: function () {}, // 可以简写 }
语法:
(函数的行参) => { 函数体内要执行的代码 }
javascriptconst fn = function (a, b) { console.log(a) console.log(b) } // 可以使用箭头函数写成 const fun = (a, b) => { console.log(a) console.log(b) }
javascriptconst obj = { fn: function (a, b) { console.log(a) console.log(b) }, } // 可以使用箭头函数写成 const obj2 = { fn: (a, b) => { console.log(a) console.log(b) }, }
箭头函数的特殊性
箭头函数内部没有 this,箭头函数的 this 是上下文的 this
javascript// 在箭头函数定义的位置往上数,这一行是可以打印出 this 的 // 因为这里的 this 是 window // 所以箭头函数内部的 this 就是 window const obj = { fn: function () { console.log(this) }, // 这个位置是箭头函数的上一行,但是不能打印出 this fun: () => { // 箭头函数内部的 this 是书写箭头函数的上一行一个可以打印出 this 的位置 console.log(this) }, } obj.fn() obj.fun()
- 按照我们之前的 this 指向来判断,两个都应该指向 obj
- 但是 fun 因为是箭头函数,所以 this 不指向 obj,而是指向 fun 的外层,就是 window
箭头函数内部没有
arguments
这个参数集合javascriptconst obj = { fn: function () { console.log(arguments) }, fun: () => { console.log(arguments) }, } obj.fn(1, 2, 3) // 会打印一个伪数组 [1, 2, 3] obj.fun(1, 2, 3) // 会直接报错
函数的行参只有一个的时候可以不写
()
其余情况必须写javascriptconst obj = { fn: () => { console.log('没有参数,必须写小括号') }, fn2: (a) => { console.log('一个行参,可以不写小括号') }, fn3: (a, b) => { console.log('两个或两个以上参数,必须写小括号') }, }
函数体只有一行代码的时候,可以不写
{}
,并且会自动 returnjavascriptconst obj = { fn: (a) => { return a + 10 }, fun: (a) => a + 10, } console.log(fn(10)) // 20 console.log(fun(10)) // 20
函数传递参数的时候的默认值
我们在定义函数的时候,有的时候需要一个默认值出现
就是当我不传递参数的时候,使用默认值,传递参数了就使用传递的参数
javascriptfunction fn(a) { a = a || 10 console.log(a) } fn() // 不传递参数的时候,函数内部的 a 就是 10 fn(20) // 传递了参数 20 的时候,函数内部的 a 就是 20
- 在 ES6 中我们可以直接把默认值写在函数的行参位置
javascriptfunction fn(a = 10) { console.log(a) } fn() // 不传递参数的时候,函数内部的 a 就是 10 fn(20) // 传递了参数 20 的时候,函数内部的 a 就是 20
- 这个默认值的方式箭头函数也可以使用
javascriptconst fn = (a = 10) => { console.log(a) } fn() // 不传递参数的时候,函数内部的 a 就是 10 fn(20) // 传递了参数 20 的时候,函数内部的 a 就是 20
- 注意: 箭头函数如果你需要使用默认值的话,那么一个参数的时候也需要写 ()
解构赋值
- 解构赋值,就是快速的从对象或者数组中取出成员的一个语法方式
解构对象
快速的从对象中获取成员
javascript// ES5 的方法向得到对象中的成员 const obj = { name: 'xiaobin', age: 18, gender: '男', } let name = obj.name let age = obj.age let gender = obj.gender
javascript// 解构赋值的方式从对象中获取成员 const obj = { name: 'xiaobin', age: 18, gender: '男', } // 前面的 {} 表示我要从 obj 这个对象中获取成员了 // name age gender 都得是 obj 中有的成员 // obj 必须是一个对象 let { name, age, gender } = obj
解构数组
快速的从数组中获取成员
javascript// ES5 的方式从数组中获取成员 const arr = ['xiaobin', 'Rose', 'Tom'] let a = arr[0] let b = arr[1] let c = arr[2]
javascript// 使用解构赋值的方式从数组中获取成员 const arr = ['xiaobin', 'Rose', 'Tom'] // 前面的 [] 表示要从 arr 这个数组中获取成员了 // a b c 分别对应这数组中的索引 0 1 2 // arr 必须是一个数组 let [a, b, c] = arr
注意
{}
是专门解构对象使用的[]
是专门解构数组使用的- 不能混用
模版字符串
ES5 中我们表示字符串的时候使用
''
或者""
在 ES6 中,我们还有一个东西可以表示字符串,就是 ``(反引号)
javascriptlet str = `hello world` console.log(typeof str) // string
和单引号好友双引号的区别
反引号可以换行书写
javascript// 这个单引号或者双引号不能换行,换行就会报错了 let str = 'hello world' // 下面这个就报错了 let str2 = 'hello world'
javascriptlet str = ` hello world ` console.log(str) // 是可以使用的
反引号可以直接在字符串里面拼接变量
javascript// ES5 需要字符串拼接变量的时候 let num = 100 let str = 'hello' + num + 'world' + num console.log(str) // hello100world100 // 直接写在字符串里面不好使 let str2 = 'hellonumworldnum' console.log(str2) // hellonumworldnum
javascript// 模版字符串拼接变量 let num = 100 let str = `hello${num}world${num}` console.log(str) // hello100world100
- 在 `` 里面的
${}
就是用来书写变量的位置
- 在 `` 里面的
展开运算符
ES6 里面号新添加了一个运算符
...
,叫做展开运算符作用是把数组展开
javascriptlet arr = [1, 2, 3, 4, 5] console.log(...arr) // 1 2 3 4 5
合并数组的时候可以使用
javascriptlet arr = [1, 2, 3, 4] let arr2 = [...arr, 5] console.log(arr2)
也可以合并对象使用
javascriptlet obj = { name: 'xiaobin', age: 18, } let obj2 = { ...obj, gender: '男', } console.log(obj2)
在函数传递参数的时候也可以使用
javascriptlet arr = [1, 2, 3] function fn(a, b, c) { console.log(a) console.log(b) console.log(c) } fn(...arr) // 等价于 fn(1, 2, 3)