ES6 重点需要记忆的

1.ES6 中只要使用尾递归,就不会发生栈溢出,相对节省内存。

2.只要知道循环可以用递归代替,而一旦使用递归,就最好使用尾递归。

3.函数参数的尾逗号:

ES2017 允许函数的最后一个参数有尾逗号(trailing comma),这样的规定使得,函数参数与数组和对象的尾逗号规则,保持一致了。

4.this 的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁,一定要搞清楚这个。

箭头函数内部的this 是此法作用域,由上下文决定。

箭头函数在定义时就已经确定了this 的作用域。

5.当然第一件事情就是毫不留情地消灭var,项目中能用const的地方不用let,能用let的地方不用var。

6.扩展运算符

求一个数组最大元素的写法:

Math.max(..[14,3,77])

push 函数:将一个数组添加到另一个数组的尾部:

// ES5的 写法
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
Array.prototype.push.apply(arr1, arr2);

// ES6 的写法
let arr1 = [0, 1, 2];
let arr2 = [3, 4, 5];
arr1.push(...arr2);
// ES5
new (Date.bind.apply(Date, [null, 2015, 1, 1]))
// ES6
new Date(...[2015, 1, 1]);

扩展运算符还可以将字符串转为真正的数组。

[...'hello']
// [ "h", "e", "l", "l", "o" ]

任何有length属性的对象,都可以通过Array.from 方法转为数组,而此时扩展运算符就无法转换。

Array.of 基本上可以用来替代Array()或new Array(),并且不存在由于参数的不同而导致的重载。

Array.of() // []
Array.of(undefined) // [undefined]
Array.of(1) // [1]
Array.of(1, 2) // [1, 2]

由于空位的处理规则非常不统一,所以建议避免出现空位。

8.如果某个方法的值是一个Generator 函数,前面需要加上*

9.总的来说,操作中引入继承的属性会让问题复杂化,大多数时候,我们只关心对象自身的属性。所以尽量不要用for...in 循环,而用Object,keys()代替。

10.去除数组的重复成员

(1)方法

[...new Set(array)];

(2)方法

function deduce(array) {
return Array.from(new Set(array));
}
deduce([1,1,2,3])

在Set 内部,两个NaN是相等的。两个对象总是不相等的。

遍历操作:

Set 结构的键名就是键值(两者是同一个值),因此第一个参数的值与第二个参数的值永远都是一样的。

WeakSet 的成员只能是对象,而不能是其他类型的值。因此,ES6 规定Weakself 不可遍历。

WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失,遍历机制无法保证成员的存在,很可能刚刚遍历结束,成员就取不到了。

注意:只有对同一个对象的引用,Map 结构才将其视为同一个键,这一点要非常小心。Map 的键实际上是跟

内存地址绑定的,只要内存地址一样,就视为两个键。

WeakMap 的专用场合就是,它的键所对应的对象,可能会在将来消失。WeakMap 结构有助于防止内存泄漏。

JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set.

原生具备Iterator 接口的数据结构如下:

-Array

-Map

-Set

-String

-TypedArray

-函数arguments

-NodeList对象

调用Iterator 接口的场合

有一些场合会默认调用Iterator 接口(即Symbol.iterator 方法),除了下文会介绍的for ...of 循环,还有几个别的场合。

(1)解构赋值;

(2)扩展运算符

(3)yield*

  (4)其他场合:由于数组的 遍历会调用遍历器接口,所以任何接受数组作为参数的场合,其实都调用了遍历器接口

for...in 循环主要是为遍历对象而设计的,不适用于遍历数组。

Javascript 语言的执行环境是"单线程"的,如果没有异步编程,根本没法用,非卡死不可。

async 函数可以看作多个异步操作,包装成的一个Promise 对象,而await 命令就是内部then 命令的语法糖。

class 方法貌似要写在export 方法的外面,ES6 引入的类方法有点像oc 里的类方法。

一个类必须有construct 方法,如果没有显示定义,一个空的construct 方法会被默认添加。类必须使用new 调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new 也行。

类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static 关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就成为静态方法。

ES6 的继承机制完全不同,实质是将父类实例对象的属性和方法,加到this 上面(所以必须先调用super),然后再用子类构造函数修改this。

import default 的使用

//第一组
export default function crc32() {   //输出
 // ...
}

import crc32 from 'crc32';          //输入


//第二组
export function crc32() {           //输出
 // ...
}

import {crc32} from 'crc32';        //输入

上面代码的两组写法,第一组使用export default 时,对应的import 语句不需要使用大括号;第二组是不使用export default 时,对应的import 语句需要使用大括号。

import 和export 命令只能在模块的顶层,不能在代码块之中(比如,在if 代码块之中,或在函数之中)。

因为require 是运行时加载模块,import 命令无法取代require 的动态加载功能。

import()类似于Node 的require 方法,区别主要是前者是异步加载,后者是同步加载。

猜你喜欢

转载自blog.csdn.net/baihailing/article/details/85209547
ES6
今日推荐