ES6精简要点

时间:2021-07-13 19:11:37

没想到ES7都出来了(虽然并不大),想到自己ES6还没学完

现在就补补吧,记录下重点部分

Let的用法

用来声明块级变量

f1();
function f1() {
let n = 5;
if (true) {
let n = 10;
    console.log(n); //10
}
console.log(n); // 5
}

let声明的变量只能在他所在的{}里面使用

另外,ES6也规定,函数本身的作用域,在其所在的块级作用域之内。

function f() { console.log('I am outside!'); }
(function () {
if(false) {
// 重复声明一次函数f
function f() { console.log('I am inside!'); }
} f();
}());

上面代码在ES5中运行,会得到“I am inside!”,但是在ES6中运行,会得到“I am outside!”。

这是因为ES5存在函数提升,不管会不会进入if代码块,函数声明都会提升到当前作用域的顶部,得到执行;

而ES6支持块级作用域,不管会不会进入if代码块,其内部声明的函数皆不会影响到作用域的外部。

const命令

const也用来声明变量,但是声明的是常量。

一旦声明,常量的值就不能改变。

const PI=3.14;
PI++;
console.log(PI);//报错

const的作用域与let命令相同:只在声明所在的块级作用域内有效。

f1();
function f1() {
const n=1;
console.log(n);
}
console.log(n);//报错undefine

const声明的常量,也与let一样不可重复声明。

数组的解构赋值

一起的赋值方式

var a = 1;
var b = 2;
var c = 3;

ES6

var [a, b, c] = [1, 2, 3];

本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。

下面是一些使用嵌套数组进行解构的例子。

var [foo, [[bar], baz]] = [1, [[2], 3]];
foo // 1
bar // 2
baz // 3 var [,,third] = ["foo", "bar", "baz"];
third // "baz" var [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]

 变量的解构赋值用途很多。

经常有面试管问;如何不用中间变量交换两个变量的值

[x, y] = [y, x];

从函数返回多个值

// 返回一个数组

function example() {
return [1, 2, 3];
}
var [a, b, c] = example(); // 返回一个对象 function example() {
return {
foo: 1,
bar: 2
};
}
var { foo, bar } = example();

任何部署了Iterator接口的对象,都可以用for...of循环遍历。

Map结构原生支持Iterator接口,配合变量的结构赋值,获取键名和键值就非常方便。

var 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) {
// ...
}

字符串扩展

  • includes():返回布尔值,表示是否找到了参数字符串。
  • startsWith():返回布尔值,表示参数字符串是否在源字符串的头部。
  • endsWith():返回布尔值,表示参数字符串是否在源字符串的尾部。
var s = "Hello world!";

s.startsWith("Hello") // true
s.endsWith("!") // true
s.includes("o") // true

这三个方法都支持第二个参数,表示开始搜索的位置。

var s = "Hello world!";

s.startsWith("world", 6) // true
s.endsWith("Hello", 5) // true
s.includes("Hello", 6) // false

二进制和八进制表示法

0b111110111 === 503 // true
0o767 === 503 // true

 数值的扩展

ES6提供了二进制和八进制数值的新的写法,分别用前缀0b和0o表示。

0b111110111 === 503 // true
0o767 === 503 // true

 Math对象的扩展

Math.trunc方法用于去除一个数的小数部分,返回整数部分。

Math.trunc(4.1) // 4
Math.trunc(4.9) // 4
Math.trunc(-4.1) // -4
Math.trunc(-4.9) // -4

Math.sign方法用来判断一个数到底是正数、负数、还是零。

如果参数为正数,返回+1;

参数为负数,返回-1;

参数为0,返回0;

参数为NaN,返回NaN。

数学方法

    Math.acosh(x) 返回x的反双曲余弦(inverse hyperbolic cosine)
Math.asinh(x) 返回x的反双曲正弦(inverse hyperbolic sine)
Math.atanh(x) 返回x的反双曲正切(inverse hyperbolic tangent)
Math.cbrt(x) 返回x的立方根
Math.clz32(x) 返回x的32位二进制整数表示形式的前导0的个数
Math.cosh(x) 返回x的双曲余弦(hyperbolic cosine)
Math.expm1(x) 返回eˆx - 1
Math.fround(x) 返回x的单精度浮点数形式
Math.hypot(...values) 返回所有参数的平方和的平方根
Math.imul(x, y) 返回两个参数以32位整数形式相乘的结果
Math.log1p(x) 返回1 + x的自然对数
Math.log10(x) 返回以10为底的x的对数
Math.log2(x) 返回以2为底的x的对数
Math.tanh(x) 返回x的双曲正切(hyperbolic tangent)

 Array.from()

Array.from()用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象,其中包括ES6新增的Set和Map结构。

let ps = document.querySelectorAll('p');

Array.from(ps).forEach(function (p) {
console.log(p);
})

 任何有length属性的对象,都可以通过Array.from方法转为数组。

Array.from()还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理。

Array.from(arrayLike, x => x * x);
// 等同于
Array.from(arrayLike).map(x => x * x);

 Array.of()

Array.of()方法用于将一组值,转换为数组。

Array.of(3, 11, 8) // [3,11,8]
Array.of(3) // [3]
Array.of(3).length // 1

 数组实例的find()和findIndex()

数组实例的find()用于找出第一个符合条件的数组元素。

它的参数是一个回调函数,所有数组元素依次遍历该回调函数,直到找出第一个返回值为true的元素,然后返回该元素,否则返回undefined。

[1, 5, 10, 15].find(function(value, index, arr) {
return value > 9;
}) // 10

从上面代码可以看到,回调函数接受三个参数,依次为当前的值当前的位置和原数组。

数组实例的findIndex()的用法与find()非常类似,
返回第一个符合条件的数组元素的位置,
如果所有元素都不符合条件,则返回-1。
[1, 5, 10, 15].findIndex(function(value, index, arr) {
return value > 9;
}) // 2

 数组实例的fill()

['a', 'b', 'c'].fill(7)
// [7, 7, 7] new Array(3).fill(7)
// [7, 7, 7]

fill()还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。

['a', 'b', 'c'].fill(7, 1, 2)
// ['a', 7, 'c']

 数组实例的entries(),keys()和values()

ES6提供三个新的方法——entries(),keys()和values()——用于遍历数组。

它们都返回一个遍历器,可以用for...of循环进行遍历,

唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。

for (let index of ['a', 'b'].keys()) {
console.log(index);
}
// 0
// 1 for (let elem of ['a', 'b'].values()) {
console.log(elem);
}
// 'a'
// 'b' for (let [index, elem] of ['a', 'b'].entries()) {
console.log(index, elem);
}
// 0 "a"
// 1 "b"

 数组推导

var a1 = [1, 2, 3, 4];
var a2 = [for (i of a1) i * 2]; a2 // [2, 4, 6, 8]