ES61(let 解构 字符串 模板字符串 数值)

ES6强制严格模式

1 let/const

let最重要的两个特性就是提供了块级作用域不再具备变量提升
let声明变量,const声明常量。
let 只能声明一次 var 可以声明多次
const用来定义常量,使用时必须初始化,只能在块作用域里访问,而且不能修改。const foo;// SyntaxError: Missing initializer in const declaration上面代码表示,对于const来说,只声明不赋值,就会报错。
const声明对象时,可以修改。

ES6 声明变量的六种方法

var命令和function命令。
let和const命令
import命令和class命令。

顶层变量的全局性

var命令和function命令声明的全局变量,依旧是window对象的属性;
另一方面规定,let命令、const命令、class命令声明的全局变量,不属于window对象的属性。

var a = 1;
window.a // 1
let b = 1;
window.b // undefined

解构赋值

解析结构是一种全新的写法 解构的源,解构赋值表达式的右边部分。解构的目标,解构赋值表达式的左边部分。
数组解构 对象解构 字符串解构 布尔解构 函数参数解构 数值解构

数组解构

如果等号的右边不是数组(或者严格地说,不是可遍历的结构,参见《Iterator》一章),那么将会报错。let [foo] = 1;报错

const arr = [1, 2, 3];
const [a, b, c] = arr;
let [foo, [[bar], baz]] = [1, [[2], 3]];     (foo // 1 bar // 2 baz // 3)
let [ , , third] = ["foo", "bar", "baz"];    (third // "baz")
let [x, , y] = [1, 2, 3];                    (x // 1y // 3)
let [head, ...tail] = [1, 2, 3, 4];          (head // 1 tail // [2, 3, 4])
let [x, y, ...z] = ['a'];                    (x // "a" y // undefined z // [])
let [foo] = [];
let [bar, foo] = [1];  //foo都是undefined
let [a, [b], d] = [1, [2, 3], 4]; b为2

对象的解构赋值

let { baz } = { foo: "aaa", bar: "bbb" };
baz // undefined
let { foo: baz } = { foo: 'aaa', bar: 'bbb' };
baz // "aaa"

函数的解构 使用参数默认值时,函数不能有同名参数。
解构赋值允许等号左边的模式之中,不放置任何变量名。因此,可以写出非常古怪的赋值表达式。

字符串解构

const [a, b, c, d, e] = 'hello';
let {length : len} = 'hello';
len // 5

数值和布尔值的解构赋值

解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。

let {toString: s} = 123;
s === Number.prototype.toString // true

let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError

函数参数的解构赋值

[[1, 2], [3, 4]].map(([a, b]) => a + b);//两个数组都计算了一下
// [ 3, 7 ]
函数参数的解构也可以使用默认值。
注意,下面的写法会得到不一样的结果。
function move({x, y} = { x: 0, y: 0 }) {
  return [x, y];
}
move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, undefined]
move({}); // [undefined, undefined]
move(); // [0, 0]

圆括号问题

ES6 的规则是,只要有可能导致解构的歧义,就不得使用圆括号。建议只要有可能,就不要在模式中放置圆括号。

变量的解构赋值

(1)交换变量的值

let x = 1;
let y = 2;
[x, y] = [y, x];上面代码交换变量x和y的值,这样的写法不仅简洁,而且易读,语义非常清晰。

(2)从函数返回多个值

function example() {
  return [1, 2, 3];
}
let [a, b, c] = example();

(3)函数参数的定义

解构赋值可以方便地将一组参数与变量名对应起来。

function f([x, y, z]) { ... }
f([1, 2, 3]);
// 参数是一组无次序的值
function f({x, y, z}) { ... }
f({z: 3, y: 2, x: 1});

(4)提取 JSON 数据
(6)遍历 Map 结构
任何部署了 Iterator 接口的对象,都可以用for…of循环遍历。Map 结构原生支持 Iterator 接口,配合变量的解构赋值,获取键名和键值就非常方便。

for (let [key, value] of map) {
  console.log(key + " is " + value);
}
如果只想获取键名,或者只想获取键值,可以写成下面这样。
for (let [key] of map) {
}

字符串的正则方法

字符串对象共有 4 个方法,可以使用正则表达式:match()、replace()、search()和split()。
ES6 将这 4 个方法,在语言内部全部调用RegExp的实例方法,从而做到所有与正则相关的方法,全都定义在RegExp对象上。
超过2字节的用大括号包起来。\u{200007}
String.fromCharCode方法,用于从码点返回对应字符 String.fromCodePoint方法,可以识别大于0xFFFF的字符。ES6 提供了String.fromCodePoint方法,可以识别大于0xFFFF的字符,弥补了String.fromCharCode方法的不足。在作用上,正好与codePointAt方法相反。
codePointAt(0)取码值
fromCodePoint()码值转化为字符串
字符串中包含某字符
str.includes(“c”);
str.startWith()
str.endWith()
字符串复制str.repeat(2)
padStart(),padEnd()
ES2017 引入了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。

字符串遍历

for…of循环遍历。
normalize(),用来将字符的不同表示方法统一为同样的形式,这称为 Unicode 正规化。

三、模板字符串

模板字符串是为了解决使用+号拼接字符串的不便利而出现的。模板字符串(template string)是增强版的字符串,
1.用反引号(`)标识。
2.${}在字符串中嵌入变量。

const a = 20;
const b = 30;
const string = `${a}+${b}=${a+b}`;
模板字符串之中还能调用函数。
function fn() {
  return "Hello World";
}

`foo ${fn()} bar`
// foo Hello World bar

标签模板

模板字符串的功能,不仅仅是上面这些。它可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template)。
但是,如果模板字符里面有变量,就不是简单的调用了,而是会将模板字符串先处理成多个参数,再调用函数。

let a = 5;
let b = 10;
tag`Hello ${ a + b } world ${ a * b }`;// 等同于
tag(['Hello ', ' world ', ''], 15, 50);

为什么有空格

${}作为分隔符,分隔符两边内容会产生元素,所以,在开头或结尾,会产生,空格,代表空字符串。
上面代码中,模板字符串前面有一个标识名tag,它是一个函数。整个表达式的返回值,就是tag函数处理模板字符串后的返回值。函数tag依次会接收到多个参数。

function tag(stringArr, value1, value2){
  // ...
}// 等同于
function tag(stringArr, ...values){  // ...
}

tag函数的第一个参数是一个数组,该数组的成员是模板字符串中那些没有变量替换的部分,也就是说,变量替换只发生在数组的第一个成员与第二个成员之间、第二个成员与第三个成员之间,以此类推。tag函数的其他参数,都是模板字符串各个变量被替换后的值。由于本例中,模板字符串含有两个变量,因此tag会接受到value1和value2两个参数。
tag函数所有参数的实际值如下。第一个参数:['Hello ', ’ world ', ‘’]第二个参数: 15第三个参数:50也就是说,tag函数实际上以下面的形式调用。tag(['Hello ', ’ world ', ‘’], 15, 50)

数值Number

ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。
ES6 在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法。Number.isFinite()用来检查一个数值是否为有限的(finite),即不是Infinity。传统的全局方法isFinite()和isNaN()的区别在于,传统方法先调用Number()将非数值的值转为数值,再进行判断,而这两个新方法只对数值有效,Number.isFinite()对于非数值一律返回false, Number.isNaN()只有对于NaN才返回true,非NaN一律返回false。
Number.MAX_SAFE_INTEGER
Number.isInteger()用来判断一个数值是否为整数。
Number.isSafeInteger()用来判断一个数值是否安全,在最大最小值之间
Math.trunc方法用于去除一个数的小数部分,返回整数部分。
Math.sign方法用来判断一个数到底是正数、负数、还是零,对于非数值NAN
Math.cbrt立方根

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值