es6解构赋值
ES6 允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
数组
例:
let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]
let [x, y, ...z] = ['a'];
x // "a"
y // undefined 解构不成功,变量的值就等于undefined。
z // []
对象
解构对象时变量名与属性同名才能取到正确的值;
let { bar, foo } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"
let { baz } = { foo: "aaa", bar: "bbb" };
baz // undefined
当然变量名与属性名不一致时,可以这样写:
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"
let obj = { first: 'hello', last: 'world' };
let { first: f, last: l } = obj;
f // 'hello'
l // 'world'
对象的解构赋值的内部机制是先找到同名属性,然后在赋给对应的变量,所以,真正被赋值的是后者而不是前者。对象可以嵌套解构,可以指定默认值;其他类型也可以解构赋值。
解构赋值的部分使用场景
使用场景有很多,比如交换变量的值;
let x = 1;
let y = 2;
[x, y] = [y, x];
提取 JSON 数据:
let jsonData = {
id: 42,
status: "OK",
data: [867, 5309]
};
let { id, status, data: number } = jsonData;
console.log(id, status, number);
// 42, "OK", [867, 5309]
遍历 Map 结构
const map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
for (let [key, value] of map) {
console.log(key + " is " + value);
}
// first is hello
// second is world
// 获取键名
for (let [key] of map) {
// ...
}
// 获取键值
for (let [,value] of map) {
// ...
}
数据类型
字符串
字符串的扩展有很多,我这里写一下我平时常用的几点。
let s = 'Hello world!';
s.startsWith('Hello') // true ;表示参数字符串是否在原字符串的尾部
s.endsWith('!') // true ;表示参数字符串是否在原字符串的头部
s.includes('o') // true ;是否找到参数字符串
repeat 方法返回一个新字符串,表示将原字符串重复n次。参数如果是小数则取整,不能小于等于-1,-1(不包含)到1(不包含)视同为0,NAN也是一样,数字型的字符串会自动转换,不是则为“”;
'hello'.repeat(2) // "hellohello"
padStart()用于头部补全,padEnd()用于尾部补全。
'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4) // ' x',第二个参数不填表示为空格
'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'
'12'.padStart(10, 'YYYY-MM-DD') // "YYYY-MM-12"
'09-12'.padStart(10, 'YYYY-MM-DD') // "YYYY-09-12" //用来提示字符串格式
还有一个很重要的扩展。模板字符串的写法:用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量,变量名卸载${}之中,或者也可以调用函数,也可以嵌套模板。
function authorize(user, action) {
if (!user.hasPrivilege(action)) {
throw new Error(
// 传统写法为
// 'User '
// + user.name
// + ' is not authorized to do '
// + action
// + '.'
`User ${user.name} is not authorized to do ${action}.`);
}
}
通过JSX函数还可以将一个DOM字符串转为React对象,具体实现 ;
数值
在Number的对象上提供了Number.isFinite()和Number.isNaN()方法,分别用来检查一个数值是否是有限的,和检查一个值是否为NaN;
还有一个很重要的扩展。模板字符串的写法:用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量,变量名卸载${}之中,或者也可以调用函数,也可以嵌套模板。
Number.isFinite('10'); // false 非数值一律返回false
Number.isNaN(NaN) // true 参数不是数值一律返回NaN,只有NaN才返回true
Number.isNaN(15) // false
Math.trunc方法用于去除一个数的小数部分,返回整数部分。
Math.trunc('123.456') // 123 内部会自动转换为数值
Math.trunc(true) //1
Math.trunc(false) // 0
Math.trunc(null) // 0
Math.trunc(); // NaN
Math.trunc(undefined) // NaN 空值和无法截取整数的返回NaN
Math.sign(-5) // -1
Math.sign(5) // +1
Math.sign(0) // +0
Math.sign(-0) // -0
Math.sign方法用来判断一个数到底是正数、负数、还是零。
对于非数值,会先将其转换为数值。无法转换的返回NaN;