1.var 可声明前置,let不可。
var aa = 3var a = 4复制代码
a = 3let a //报错复制代码
2.let不可重复声明(var 可以)
let a = 1let 2 = 2 //报错复制代码
3.存在块级作用域
for (let i = 0; i < 4; i++){ console.log(i) // 0 1 2 3 只能在这个花括号内,外面作用域是没有i的。}console.log(i) //报错:i is not defined复制代码
4.const 和let一样不可重复声明,不可声明前置及存在块级作用域。
const a = 5a = 3 //报错复制代码
const obj = {a:2}obj.a = 3 //没问题。因为const指向的是一个对象,对象不变就可以,这里变的是对象里面的a。obj = {a: 3} //报错。因为把obj对象重新赋值了。复制代码
数组的解构
1.数组解构
这样可以
let [a, b ,c] = [1, 2, 3]console.log(a,b,c) //1 2 3复制代码
这样也可
let [a, [b], c] = [1, [2], 3]console.log([a, [b], c]) // Array(3)0: 21: [3]2: 4length: 3__proto__: Array(0)a //2b //3c //4复制代码
这样报错咯
let [a] = 1 //报错复制代码
2.默认值
let [a, b=1] = [2]a // 2b // 1 这个a下标为0,后面的2给a,b没有(undefined)就用b默认的,所以是1.有就用设置的,没有设置就用默认的。let [a=1, b=2] = [3, 4]a // 3b // 4设置了就用设置的let [a=1, b=2] = [undefined, null]a // 1b // nulla没有设置,所以用默认的1b其实是设置了,只不过是null。let [a=1, b=a] = [3]a // 3b // 3复制代码
3.对象的解构赋值
前置知识
let p = [name, age] //等同于下面的写法(ES6)let p1 = {name: name, age: age}复制代码
对象解构范例
let {name: name ,age: age} = {name: 'Tom', age: 18} //等于下面的let namelet age({name: name, age: age} = {name: 'Tom', age: 18})复制代码
4.对象也有默认值,和上面的意思相同。
let {x, y=5} = {x: 1} //y是undefined,所以使用默认的y=5x //1y //5复制代码
5.函数解构
function sum([x, y] = [1, 2]){ return x + y}sum()//3sum([2])//NaNsum([2, 3])//5(俩个都赋值,相加得5)复制代码
1.function sum({x, y}={x:0, y:0}, {a=2, b=3}){ return [x+a, y+b]}sum({x:4, y:5}, {a:6}) //(2) [10, 8]为什么是[10,8]2.function sum({x, y}={x:0, y:0}, {a=2, b=3}){ return [x+a, y+b]}sum({x:4, y:5}, {a:6, b:7})(2) [10, 12]复制代码
这个需要注意一下
function sum([x=1, y=2]){ return x+y}sum() //报错sum([])//3 有[]里面,没有赋值所以用默认的想不报错这样写,要给xy赋值function sum([x, y] = [1, 2]){ return x + y}sum() //3(ES6)复制代码
6.作用
let [x, y] = [1, 2];(这个分好要写,不然浏览器会把它和下一句连一起。报错)[x, y] = [y, x] //赋的值反过来了x //2y // 1复制代码
function ajax({url, type='GET'}){}ajax({url: 'http://localhost:3000/getData'})ajax的url是必须要填的,其他不赋值可以使用默认。复制代码