一、let和const命令
let
1、var定义的变量是全局的,let只在代码块内有效
2、不存在变量提升
console.log(i); let i = 90
报错
console.log(i); var i = 90
undefined
3、暂时性死区
只要再块级作用域存在let声明的变量,那么这个变量就被绑定再该区域,不受外部影响
var a = 123
if (true){
a = 'abc'//报错
let a
}
4、不允许重复声明变量
{let a = 10; var a = 1}
报错
const
1、和let一样,只在声明所在的块级作用域内有效
2、一旦声明,其值不可改变,只声明不赋值也会报错
3、不允许重复声明变量
4、暂时性死区
5、不存在变量提升
6、对于复合型的数据,变量名不指向数据,而是指向数据所在的地址
const a = []
a.push('hello')
a.length = 0//可运行
a = ['dave']//报错const a = []
a.push('hello')
a.length = 0//可运行
a = ['dave']//报错
跨模块常量
//constant.js模块
export const A = 1
export const B = 3
export const C = 4
//test1.js
import * as constants from './constants'
console.log(constants.A)//1
console.log(constants.B)//3
全局对象的属性
var声明的是全局对象的属性,let声明的不是全局对象的属性
var a = 1; window.a;//1
let b = 1; window.b;//undefined
二、变量的解构赋值
数组的解构赋值
let [x, y, z] = [1, 2, 3]
x//1
y//3
let [head, ...tail] = [1, 2, 3, 4]
head //1
tail // [2, 3, 4]
当右边数组成员为undefined,解构函数允许指定默认值
[x, y = 'b'] = ['a'] // x='a', y='b'
var [x = 1] = []; x//1
var [x = 1] = [undefined]; x//1
如果右边数组成员不严格为undefined,默认值就会改变
var [x = 1] = [null]; x//null
对象的解构赋值
var { foo: foo, bar: bar } = { foo: 'aaa', bar: 'bbb'}
简写:var { foo: bar } = { foo: 'aaa', bar: 'bbb'}
所以实际上被赋值的是后者,而不是前者
var { foo: baz } = { foo: 'aaa', bar: 'bbb' }
baz//'aaa'
foo// error: foo is not defined
对象的解构也可以指定默认值
var {x = 1} = {}; x//1
var {x, y = 5} = { x: 1}
x //1
y //5
注意
var x;
{x} = {x:1}
//报错
因为js引擎会将{x}理解成一个代码块
var x;
({x} = {x:1})
//加个括号就能正常运行
//注意变量声明语句中,模式不能带有括号
var [(a)] = [1]//报错
var b;
[(b)] = [3];//正确
对象的解构赋值可以很方便的将现有的对象方法赋值到某个变量例如:let { lob, sin, cos } = Math
字符串的解构赋值
const [a, b, c, d, e] = 'hello'
a//'h'
b//'e'
c//'l'
d//'l
e//'o
数值和布尔值的解构赋值
let {toString: s} = 123;
s === Number.ptototype.toString//true
let {toString: s} = true;
s === Boolean.prototype.toString//true
函数参数的解构赋值
function add([x, y]) {
return x + y;
}
add([1, 2]) // 3
用途
-
交换变量的值
[x, y] = [y, x]
-
从函数中返回多个值
function example() {
return [1, 2, 3]
}
var [a, b, c] = example();
- 函数参数的定义
function f({x, y, z}) {
...
}
f({z:3, y:2, x:1})
- 提取JSON数据
var jsonData = {
id: 42,
status: 'OK'
data: [887, 53]
}
let {id, status, data: number } = jsonData;
- 遍历Map结构
var map = new Map();
map.set('first', 'hello')
map.set('second', 'world')
for (let [key, value] of map) {
console.log(key + ' is ' + value);
}
//first in hello
//seconde is world
“本文不定时更新”
(本文参考【ES6 标准入门 第二版 阮一峰著】)
网友评论