ES6笔记二

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6笔记二相关的知识,希望对你有一定的参考价值。

1.遍历Map结构;任何部署了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) {
      // ...
    }

2.输入模块的指定方法;加载模块时,往往需要指定输入那些方法。解构赋值使得输入语句非常清晰。

const { SourceMapConsumer, SourceNode } = require("source-map");

3.字符串扩展

    charCodeAt方法只能分别返回前两个字节和后两个字节的值。

    

var s = "";
s.length // 2
s.charAt(0) // ‘‘
s.charAt(1)    // ‘‘
s.charCodeAt(0) // 55362        
s.charCodeAt(1) // 57271

    codePointAt方法,能够正确处理4个字节储存的字符;codePointAt方法会正确返回四字节的UTF-16字符的码点。对于那些两个字节储存的常规字符,它的返回结果与charCodeAt方法相同。

    var s = "a";
    s.codePointAt(0) // 134071
    s.codePointAt(1) // 57271
    s.charCodeAt(2) // 97

    

    ES6提供了String.fromCodePoint方法,可以识别0xFFFF的字符,弥补了String.fromCharCode方法的不足。在作用上,正好与codePointAt方法相反。

    String.fromCodePoint(0x20BB7)
     // ""


    ES7提供了at方法,可以识别Unicode编号大于0xFFFF的字符,返回正确的字符。

    ‘‘.at(0)
    // ‘‘

    

    字符的Unicode表示法:

        ES6对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。

    "\u{20BB7}"
    // ""
    
    "\u{41}\u{42}\u{43}"
    // "ABC"

    

    Unicode字符表示法:

    ES6新增了使用大括号表示Unicode字符,这种表示法在正则表达式中必须加上u修饰符,才能识别。

    /\u{61}/.test(‘a‘) // false
    /\u{61}/u.test(‘a‘) // true
    /\u{20BB7}/u.test(‘‘) // true

上面代码表示,如果不加u修饰符,正则表达式无法识别\u{61}这种表示法,只会认为这匹配61个连续的u。


    量词

    使用u修饰符后,所有量词都会正确识别大于码点大于0xFFFF的Unicode字符。

    /a{2}/.test(‘aa‘) // true
    /a{2}/u.test(‘aa‘) // true
    /{2}/.test(‘‘) // false
    /{2}/u.test(‘‘) // true


ES6 Class

//定义类
class Point {

  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  toString() {
    return ‘(‘+this.x+‘, ‘+this.y+‘)‘;
  }
}

var point = new Point(2,3);

point.toString() // (2, 3)

constructor函数是构造函数
this关键字则代表实例对象
定义了一个toString方法

Class之间可以通过extends关键字,实现继承。

class ColorPoint extends Point {}

上面代码定义了一个ColorPoint类,该类通过extends关键字,继承了Point类的所有属性和方法。


class ColorPoint extends Point {

  constructor(x, y, color) {
    super(x, y); // 等同于super.constructor(x, y)    
    this.color = color;
  }

  toString() {
    return this.color+‘ ‘+super();
  }
}

上面代码中,constructor方法和toString方法之中,都出现了super关键字,它指代父类的同名方法。在constructor方法内,super指代父类的constructor方法;在toString方法内,super指代父类的toString方法


Module基本用法

CommonJS模块就是对象,输入时必须查找对象属性。

var { stat, exists, readFile } = require(‘fs‘);

ES6模块不是对象,而是通过export命令显式指定输出的代码,输入时也采用静态命令的形式。

import { stat, exists, readFile } from ‘fs‘;

所以,ES6可以在编译时就完成模块编译,效率要比CommonJS模块高。

模块功能主要由两个命令构成:export和import。export命令用于用户自定义模块,规定对外接口;import命令用于输入其他模块提供的功能,同时创造命名空间(namespace),防止函数名冲突。文件内部的所有变量,外部无法获取,必须使用export关键字输出变量

eg:

// profile.js
export var firstName = ‘Michael‘;
export var lastName = ‘Jackson‘;
export var year = 1958;

或者

// profile.js
var firstName = ‘Michael‘;
var lastName = ‘Jackson‘;
var year = 1958;
export {firstName, lastName, year};


// main.js
import {firstName, lastName, year} from ‘./profile‘;
function sfirsetHeader(element) {
  element.textContent = firstName + ‘ ‘ + lastName;
 }
 大括号里面的变量名,必须与被导入模块(profile.js)对外接口的名称相同。


如果想为输入的变量重新取一个名字,import语句中要使用as关键字,将输入的变量重命名。

import { lastName as surname } from ‘./profile‘;


export命令除了输出变量,还可以输出方法或类(class)。下面是一个circle.js文件,它输出两个方法area和circumference。

// circle.js
export function area(radius) {
  return Math.PI * radius * radius;
}

export function circumference(radius) {
  return 2 * Math.PI * radius;
}

然后,main.js输入circlek.js模块。

// main.js
import { area, circumference } from ‘circle‘;
console.log("圆面积:" + area(4));
console.log("圆周长:" + circumference(14));

上面写法是逐一指定要输入的方法。另一种写法是整体输入。

import * as circle from ‘circle‘;
console.log("圆面积:" + circle.area(4));
console.log("圆周长:" + circle.circumference(14));

module命令可以取代import语句,达到整体输入模块的作用。

// main.js

module circle from ‘circle‘;
console.log("圆面积:" + circle.area(4));
console.log("圆周长:" + circle.circumference(14));

如果想要输出匿名函数,可以使用export default命令。

// export-default.js
export default function () {
    console.log(‘foo‘);
}

其他模块输入该模块时,import命令可以为该匿名函数指定任意名字。

// import-default.js
import customName from ‘./export-default‘;
customName(); // ‘foo‘

上面代码的import命令,可以用任意名称指向输出的匿名函数。需要注意的是,这时import命令后面,不使用大括号。

export default命令用在非匿名函数前,也是可以的。

// export-default.js
export default function foo() {
  console.log(‘foo‘);
}

// 或者写成
function foo() {
  console.log(‘foo‘);
}

export default foo;

上面代码中,foo函数的函数名foo,在模块外部是无效的。加载的时候,视同匿名函数加载。


如果想在一条import语句中,同时输入默认方法和其他变量,可以写成下面这样。

import customName, { otherMethod } from ‘./export-default‘;

如果要输出默认的值,只需将值跟在export default之后即可。

export default 42;

export default也可以用来输出类。

// MyClass.js

export default class { ... }

// main.js
import MyClass from ‘MyClass‘

let o = new MyClass();


模块之间也可以继承。

假设有一个circleplus模块,继承了circle模块。

// circleplus.js
export * from ‘circle‘;
export var e = 2.71828182846;
export default function(x) {
    return Math.exp(x);
}

上面代码中的“export *”,表示输出circle模块的所有属性和方法,export default命令定义模块的默认方法。

以上是关于ES6笔记二的主要内容,如果未能解决你的问题,请参考以下文章

为什么二代测序的原始数据中会出现Read重复现象?

二代身份证号码编码规则

染色体基因芯片分析和第二代测序应用的区别

[笔记]根据二代居名身份证号码判断一个人的性别

C零基础视频-26-身份证号校验程序

二代下机文件在Integrative Genomics Viewer中实现reads可视化的流程