javaScript之ES6
ES6新增的内容
新增的let和const
let num1 = 10
console.log(num1) //10
const num2 = 10
console.log(num2) //10
let const声明变量和 var声明变量的区别:
- 用let 和const 声明的变量不会进行预解析,只能先声明后使用
- 用let 和const 不能重复声明同一个变量
- 用let 和const声明 变量在{}都属于 局部作用域的变量
let const声明变量的区别:
- let声明式变量,后续可以更改变量值,声明的时候也可以不赋值
- const声明的是常量,声明时候必须赋值,赋值之后不可以改变
let num;
console.log(num); //undefined
const num1;
console.log(num1); //报错 Uncaught SyntaxError: Missing initializer in const declaration
let 和 const 关键字再总结
-
我们以前都是使用
var
关键字来声明变量的 -
在 ES6 的时候,多了两个关键字
let
和const
,也是用来声明变量的 -
只不过和 var 有一些区别
let
和const
不允许重复声明变量
// 使用 var 的时候重复声明变量是没问题的,只不过就是后面会把前面覆盖掉
var num = 100
var num = 200
// 使用 let 重复声明变量的时候就会报错了
let num = 100
let num = 200 // 这里就会报错了
// 使用 const 重复声明变量的时候就会报错
const num = 100
const num = 200 // 这里就会报错了
let
和const
声明的变量不会在预解析的时候解析(也就是没有变量提升)
// 因为预解析(变量提升)的原因,在前面是有这个变量的,只不过没有赋值
console.log(num) // undefined
var num = 100
// 因为 let 不会进行预解析(变量提升),所以直接报错了
console.log(num) // undefined
let num = 100
// 因为 const 不会进行预解析(变量提升),所以直接报错了
console.log(num) // undefined
const num = 100
let
和const
声明的变量会被所有代码块限制作用范围
// var 声明的变量只有函数能限制其作用域,其他的不能限制
if (true) {
var num = 100
}
console.log(num) // 100
// let 声明的变量,除了函数可以限制,所有的代码块都可以限制其作用域(if/while/for/...)
if (true) {
let num = 100
console.log(num) // 100
}
console.log(num) // 报错
// const 声明的变量,除了函数可以限制,所有的代码块都可以限制其作用域(if/while/for/...)
if (true) {
const num = 100
console.log(num) // 100
}
console.log(num) // 报错
let
和 const
的区别
let
声明的变量的值可以改变,const
声明的变量的值不可以改变
let num = 100
num = 200
console.log(num) // 200
const num = 100
num = 200 // 这里就会报错了,因为 const 声明的变量值不可以改变(我们也叫做常量)
let
声明的时候可以不赋值,const
声明的时候必须赋值
let num
num = 100
console.log(num) // 100
const num // 这里就会报错了,因为 const 声明的时候必须赋值
方法的简写
箭头函数
-
箭头函数是 ES6 里面一个简写函数的语法方式
-
重点: 箭头函数只能简写函数表达式,不能简写声明式函数
function fn() {} // 不能简写
const fun = function () {} // 可以简写
const obj = {
fn: function () {} // 可以简写
}
- 语法:
(函数的行参) => { 函数体内要执行的代码 }
const fn = function (a, b) {
console.log(a)
console.log(b)
}
// 可以使用箭头函数写成
const fun = (a, b) => {
console.log(a)
console.log(b)
}
const 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
// 在箭头函数定义的位置往上数,这一行是可以打印出 this 的
// 因为这里的 this 是 window
// 所以箭头函数内部的 this 就是 window
const obj = {
fn: function () {
console.log(this) //{fn: ƒ, fun: ƒ}
},
// 这个位置是箭头函数的上一行,但是不能打印出 this
fun: () => {
// 箭头函数内部的 this 是书写箭头函数的上一行一个可以打印出 this 的位置
console.log(this) //window
}
}
obj.fn()
obj.fun()
-
按照我们之前的 this 指向来判断,两个都应该指向 obj
-
但是 fun 因为是箭头函数,所以 this 不指向 obj,而是指向 fun 的外层,就是 window
-
箭头函数内部没有
arguments
这个参数集合
const obj = {
fn: function () {
console.log(arguments)
},
fun: () => {
console.log(arguments)
}
}
obj.fn(1, 2, 3) // 会打印一个伪数组 [1, 2, 3]
obj.fun(1, 2, 3) // 会直接报错 arguments is not defined
- 函数的行参只有一个的时候可以不写
()
其余情况必须写
const obj = {
fn: () => {
console.log('没有参数,必须写小括号')
},
fn2: a => {
console.log('一个行参,可以不写小括号')
},
fn3: (a, b) => {
console.log('两个或两个以上参数,必须写小括号')
}
}
- 函数体只有一行代码的时候,可以不写
{}
,并且会自动 return
const obj = {
fn: a => {
return a + 10
},
fun: a => a + 10
}
console.log(fn(10)) // 20
console.log(fun(10)) // 20
函数传递参数的时候的默认值
-
我们在定义函数的时候,有的时候需要一个默认值出现
-
就是当我不传递参数的时候,使用默认值,传递参数了就使用传递的参数
function fn(a) {
a = a || 10
console.log(a)
}
fn() // 不传递参数的时候,函数内部的 a 就是 10
fn(20) // 传递了参数 20 的时候,函数内部的 a 就是 20
- 在 ES6 中我们可以直接把默认值写在函数的行参位置
function fn(a = 10) {
console.log(a)
}
fn() // 不传递参数的时候,函数内部的 a 就是 10
fn(20) // 传递了参数 20 的时候,函数内部的 a 就是 20
- 这个默认值的方式箭头函数也可以使用
const fn = (a = 10) => {
console.log(a)
}
fn() // 不传递参数的时候,函数内部的 a 就是 10
fn(20) // 传递了参数 20 的时候,函数内部的 a 就是 20
- 注意: 箭头函数如果你需要使用默认值的话,那么一个参数的时候也需要写 ()
解构赋值
- 解构赋值,就是快速的从对象或者数组中取出成员的一个语法方式
解构对象
- 快速的从对象中获取成员
// ES5 的方法向得到对象中的成员
const obj = {
name: 'fqniu',
age: 25,
gender: '男'
}
let name = obj.name
let age = obj.age
let gender = obj.gender
// ES6 解构赋值的方式从对象中获取成员
const obj = {
name: 'fqniu',
age: 25,
gender: '男'
}
// 前面的 {} 表示我要从 obj 这个对象中获取成员了
// name age gender 都得是 obj 中有的成员
// obj 必须是一个对象
let { name, age, gender } = obj
解构数组
- 快速的从数组中获取成员
// ES5 的方式从数组中获取成员
const arr = ['Jack', 'Rose', 'Tom']
let a = arr[0]
let b = arr[1]
let c = arr[2]
// ES6 使用解构赋值的方式从数组中获取成员
const arr = ['Jack', 'Rose', 'Tom']
// 前面的 [] 表示要从 arr 这个数组中获取成员了
// a b c 分别对应这数组中的索引 0 1 2
// arr 必须是一个数组
let [a, b, c] = arr
注意
{}
是专门解构对象使用的[]
是专门解构数组使用的- 不能混用
模版字符串
-
ES5 中我们表示字符串的时候使用
''
或者""
-
在 ES6 中,我们还有一个东西可以表示字符串,就是 ``(反引号)
let str = `hello world`
console.log(typeof str) // string
- 和单引号好友双引号的区别
- 反引号可以换行书写
// 这个单引号或者双引号不能换行,换行就会报错了
let str = 'hello world'
// 下面这个就报错了
let str2 = 'hello
world'
let str = `
hello
world
`
console.log(str) // 是可以使用的
- 反引号可以直接在字符串里面拼接变量
// ES5 需要字符串拼接变量的时候
let num = 100
let str = 'hello' + num + 'world' + num
console.log(str) // hello100world100
// 如果直接写在字符串里面不好使
let str2 = 'hellonumworldnum'
console.log(str2) // hellonumworldnum
// ES6 模版字符串拼接变量
let num = 100
let str = `hello${num}world${num}`
console.log(str) // hello100world100
- 在 `` 里面的
${}
就是用来书写变量的位置
展开运算符
-
ES6 里面号新添加了一个运算符
...
,叫做展开运算符 -
作用是把数组展开
let arr = [1, 2, 3, 4, 5]
console.log(...arr) // 1 2 3 4 5
- 合并数组的时候可以使用
let arr = [1, 2, 3, 4]
let arr2 = [...arr, 5]
console.log(arr2) //[1, 2, 3, 4, 5]
- 也可以合并对象使用
let obj = {
name: 'fqniu',
age: 25
}
let obj2 = {
...obj,
gender: '男'
}
console.log(obj2) // {name: "fqniu", age: 25, gender: "男"}
- 在函数传递参数的时候也可以使用
let arr = [1, 2, 3]
function fn(a, b, c) {
console.log(a)
console.log(b)
console.log(c)
}
fn(...arr)
// 等价于 fn(1, 2, 3)
推荐阮一峰大佬的ECMAScript 6 入门教程