解构赋值,
对象的解构赋值,是变量的赋值,属性名和变量名相同,属性名和变量名不同的情形,首先找到相同的属性名,再赋值给对应变量,没有就是undefined
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3
数组本质是特殊的对象,可以对其进行对象属性的解构
属性名表达式加方括弧
如果等号右边是数值和布尔值,则将其先转为对象
let {toString: s} = 123;
s === Number.prototype.toString // true
let {toString: s} = true;
s === Boolean.prototype.toString // true
数值和布尔值的包装对象都有tostring属性
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。
2模板字符串
let name = “Bob”, time = “today”;
Hello ${name}, how are you ${time}?
3函数
3.1函数参数的默认值和解构赋值的结合
function foo({x, y = 5}) {
console.log(x, y);
}
foo({}) // undefined 5
foo({x: 1}) // 1 5
foo({x: 1, y: 2}) // 1 2
foo() // TypeError: Cannot read property ‘x’ of undefined
unction foo({x, y = 5} = {}) {
console.log(x, y);
}
foo() // undefined 5
3.2参数默认值的位置
有默认值的参数都不是尾参数。这时,无法只省略该参数,而不省略它后面的参数,除非显式输入undefined
如果传入undefined,将触发该参数等于默认值,null则没有这个效果
3.3length属性
length属性的含义是,该函数预期传入的参数个数。某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了;
设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了
4尾调用
function f(x){
g(x);
return undefined;
}
尾调用不一定出现在函数尾部,只要是最后一步操作即可。