makdown语法手册API

String

新特性的方法 基本不支持IE浏览器

String.fromCodePoint(6特性)

String.prototype.codePointAt(6特性)

for...of

for(let a of b){console.log(a)} // 合for循环不同在,它支持遍历大于0xffff的字符

includes()、endsWith()、startWith()

repeat()

padStart() 、padEnd()

模板字符串

let str = 'console.log(hello' +  `${name})`;
let func = new Function('name', str);
func('xiong');

标签模板

 alert`1234`
// 等价于
alert(1234)

String.raw

let a = 10;
String.raw`\`hello${a}\``
// return \`hello10\`

通常用来转换模板字符串为不同字符串。

Reg

支持修改正则修饰符

new RegExp(/test/gi, 'i')

增加u(unicode)修饰符

增加y(粘连)修饰符

具名组匹配和后行断言(提按)

Function

函数参数默认值

function({x = 0 ,y = 0 } = {})

rest参数

function(...values){
console.log(values.length) //
}

箭头函数

Symbol(类似String的新原始数据类型)

Promise

  • then 和 catch方法都会返回一个新的Promise对象同时状态为resolved
  • resolved状态的的所有promise对象,都会执行then回调函数
  • promise对象内的错误不会影响到promise对象外部代码,

    因此使用setTimeout方式可将错误抛出到全局中(因为setTimout执行时,promise已经完成所以是全局执行)

Promise.resolve()

Promise.reject()

done() 确保捕捉未捕获错误 并全局抛出

两个可用的附加方法:

// done 方法实现逻辑
Promise.prototype.done = function(handleResolve, handleReject){
this
.then(handleResolve, handleReject)
.catch(function(reson){
setTimout(function(){
throw new Error(reson)
})
})
}
// finally 接受一个普通的回调函数作为参数,该函数不管怎样都必须执行
Promise.prototype.finally = function (callback) {
let P = this.constructor;
return this.then(
value => P.resolve(callback()).then(() => value),
reason => P.resolve(callback()).then(() => { throw reason })
);
};

Iterator 遍历器

ES6中新增用于统一遍历不同数据类型的一种机制。

同时也新增了新的遍历命令for...of,前者主要供后者使用。

具备Iterator接口的数据结构(实例)可通过Symbol.iterator属性获取到遍历器,

[1,3][Symbol.iterator]
// ƒ values() { [native code] }

也能被for...of遍历。

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

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函数的 arguments 对象
  • NodeList 对象

上面集中数据结构可直接通过for...of命令遍历数据:

for(let i of [1,2]){
console.log(i) // 1, 2
}

2.原生不具备Iterator迭代器的数据结构,如对象,通过自定义实现

本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口,

就等于部署一种线性转换。不过,严格地说,对象部署遍历器接口并不是很必要,

因为这时对象实际上被当作 Map 结构使用,ES5 没有 Map 结构,

而 ES6 原生提供了。

3.对于类似数组的对象(存在数值键名和length属性)

部署 Iterator 接口,有一个简便方法,就是Symbol.iterator方法直接引用数组的 Iterator 接口。

let iterable = {
0: 'a',
1: 'b',
2: 'c',
length: 3,
[Symbol.iterator]: Array.prototype[Symbol.iterator]
};
for (let item of iterable) {
console.log(item); // 'a', 'b', 'c'
}

注:普通对象部署遍历对象,无效。

有了遍历器接口,数据结构就可以用for...of循环遍历(详见下文),也可以使用while循环遍历。

Generator

基本使用

返回一个迭代器。

  • 定义
function* test(){
yield 1;
yield 2;
return 3;
}
  • 使用
for(let i of test()){
console.log(i) // 1,2,3
}
  • yield* 表达式

在一个 Generator 函数里面执行另一个 Generator 函数,遍历时则返回对应的另一个迭代器;

function* inner() {
yield 'hello!';
} function* outer1() {
yield 'open';
yield inner();
yield 'close';
} var gen = outer1()
gen.next().value // "open"
gen.next().value // 返回一个遍历器对象
gen.next().value // "close" function* outer2() {
yield 'open'
yield* inner()
yield 'close'
} var gen = outer2()
gen.next().value // "open"
gen.next().value // "hello!"
gen.next().value // "close"

作为对象的属性

let obj = {
* test(){
yield 1;
}
};

Generator 与 async

Generator 异步

  • co模块(用于执行Generator函数的执行器)

通过Generator函数与co模块结合使用可实现异步代码的同步使用

  • Generator与async

Generator 函数的执行必须靠执行器,所以才有了co模块,而async函数自带执行器。

  1. 一个await语句后面Promise变为reject,则整个async函数就会中断。

通过try...catch可以避免这种情况:

async function f() {
try {
await Promise.reject('出错了');
} catch(e) {
}
return await Promise.resolve('hello world');
} f()
.then(v => console.log(v))

另一种方法则通过添加catch处理报错:

async function f() {
await Promise.reject('出错了')
.catch(e => console.log(e));
return await Promise.resolve('hello world');
} f()
.then(v => console.log(v))
// 出错了
// hello world
  1. 多个await命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。
// unrecomended 不存在继发关系
let foo = await getFoo();
let bar = await getBar(); // 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]); // 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;

两种写法,getFoo和getBar都是同时触发,这样就会缩短程序的执行时间。

async实现原理

async就是讲Generator和自动执行器包装在一个函数里而实现的。

  • spawn

下面给出spawn函数的实现,基本就是前文自动执行器的翻版。

async function fn(args) {
// ...
} // 等同于 function fn(args) {
return spawn(function* () {
// ...
});
}
// spawn 函数实现
function spawn(genF) {
// async函数返回Promise对象
return new Promise(function(resolve, reject) {
// 创建迭代器
const gen = genF(); function step(nextF) {
let next;
try {
next = nextF();
} catch(e) {
return reject(e);
}
if(next.done) {
return resolve(next.value);
}
Promise.resolve(next.value).then(function(v) {
step(function() { return gen.next(v); });
}, function(e) {
step(function() { return gen.throw(e); });
});
}
step(function() { return gen.next(undefined); });
});
}
与其他异步处理方
  • 并发多个请求,但同步输出结果
async function logInOrder(urls) {
// 并发读取远程URL const textPromises = urls.map(async url => {
const response = await fetch(url);
return response.text();
}); // 按次序输出
for (const textPromise of textPromises) {
console.log(await textPromise);
}
}

Module 模块

基础

  • CommonJS模块方式

let { stat, exists, readFile } = require('fs');

这种方式使用的是'运行时加载'加载模式,只有在代码运行时才会去获取执行。这导致没办法在

在编译时做静态检查并优化。

  • ES6 Module

新增加的模块不是对象,ES6 模块不是对象,而是通过export命令显式指定输出的代码,再通过import命令输入。

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

上面代码的实质是从fs模块加载 3 个方法,其他方法不加载。这种加载称为

“编译时加载”或者静态加载,即 ES6 可以在编译时就完成模块加载,效率

要比 CommonJS 模块的加载方式高。

export

var b = 1;
export {a as b}

export与import复合使用

export {a as b, c} from 'test'
export * from 'test1' // 模块继承 export var a = 1;

严格模式

ES6 的模块自动采用严格模式。

严格模式主要有以下限制。

  • 变量必须声明后再使用
  • 函数的参数不能有同名属性,否则报错
  • 不能使用with语句
  • 不能对只读属性赋值,否则报错
  • 不能使用前缀 0 表示八进制数,否则报错
  • 不能删除不可删除的属性,否则报错
  • 不能删除变量delete prop,会报错,只能删除属性delete global[prop]
  • eval不会在它的外层作用域引入变量
  • eval和arguments不能被重新赋值
  • arguments不会自动反映函数参数的变化
  • 不能使用arguments.callee
  • 不能使用arguments.caller
  • 禁止this指向全局对象(6 模块之中,顶层的this指向undefined,即不应该在顶层代码使用this。)
  • 不能使用fn.caller和fn.arguments获取函数调用的堆栈
  • 增加了保留字(比如protected、static和interface)

编程风格

eslint

使用eslint模块,进行语法规则和代码风格的检查。

常用代码语法规则

  • eslint-config-airbnb
  • eslint-plugin-import(插件)
  • eslint-plugin-jsx-a11y(插件)
  • eslint-plugin-react(插件)

.eslintrc

{
"extends": "eslint-config-airbnb"
}

【Javascript-基础-ecma6】ecma6学习笔记(持续更新)的更多相关文章

  1. 数据分析之Pandas和Numpy学习笔记(持续更新)<1>

    pandas and numpy notebook        最近工作交接,整理电脑资料时看到了之前的基于Jupyter学习数据分析相关模块学习笔记.想着拿出来分享一下,可是Jupyter导出来h ...

  2. [读书]10g/11g编程艺术深入体现结构学习笔记(持续更新...)

    持续更新...) 第8章 1.在过程性循环中提交更新容易产生ora-01555:snapshot too old错误.P257 (这种情况我觉得应该是在高并发的情况下才会产生) 假设的一个场景是系统一 ...

  3. angularjs1学习笔记--持续更新

    angularJS使用的MVC为何不属于二十三种设计模式之一? MVC被GoF (Gang of Four,四人组, <Design Patterns: Elements of Reusable ...

  4. Semantic ui 学习笔记 持续更新

    这个semantic 更新版本好快~ 首先是代码的标识<code></code> 具体样式就是红框这样的 圈起来代码感觉不错 不过要在semantic.css里在加上如下样式~ ...

  5. Git学习笔记(持续更新)

    1.强制同步为远程的代码 远程仓库回退了commit的情况下(第2条描述之情况),强制同步远程的代码到本地 #更新远程最新的所有代码,但是不merge或者rebase git fetch --all ...

  6. JavaScript基础知识(学习笔记)

    1.    在JavaScript中所有事物都是对象:字符串.数字.数组.日期等等2.    在JavaScript中,对象是拥有属性和方法的数据3.    属性是与对象相关的值,方法是能够在对象上执 ...

  7. R语言的学习笔记 (持续更新.....)

    1. DATE 处理 1.1 日期格式一个是as.Date(XXX) 和strptime(XXX),前者为Date格式,后者为POSIXlt格式 1.2 用法:as.Date(XXX,"%Y ...

  8. ggplot2 学习笔记 (持续更新.....)

    1. 目前有四种主题 theme_gray(), theme_bw() , theme_minimal(),theme_classic() 2. X轴设置刻度 scale_x_continuous(l ...

  9. # MongoDB学习笔记(持续更新)

    启动mongo服务 sodo mongo 显示数据库(显示数据库名称和大小,单位GB) > show dbs admin (empty) local 0.078GB test 0.078GB t ...

  10. GOF 的23种JAVA常用设计模式 学习笔记 持续更新中。。。。

    前言: 设计模式,前人总结下留给后人更好的设计程序,为我们的程序代码提供一种思想与认知,如何去更好的写出优雅的代码,23种设计模式,是时候需要掌握它了. 1.工厂模式 大白话:比如你需要一辆汽车,你无 ...

随机推荐

  1. BZOJ3193: [JLOI2013]地形生成

    传送门 Sol 第一问可以考虑按照山的高度从大到小放 但是这样如果遇到高度相同的就不好考虑,那么同时要求数量限制从小到大 这样每次放的时候后面的一定不会影响前面,并且高度相同的时候前面能放的位置后面的 ...

  2. cf1090 I.Minimal Product(贪心)

    题意 题目链接 给出长度为\(n\)的序列\(a\),序列中的元素取值为\([-2e9, 2e9]\) 找到两个位置\((i, j) (i <j, a[i] < a[j])\),最小化\( ...

  3. html5 转义实体字符 元数据 跳转 全局属性 id class lang style

    实体 Html 实体就是把特殊字符通过代码显示出来, 比如, <>在浏览器会识别为标签,不能正常显示, 这是你就需要安如<去表达左尖括号.     元数据 2. 声明字符编码 3.模 ...

  4. Ajax实现表格实时编辑

    如果我们的对于一个表格中所有的数据都能在本页进行操作那该是多酷炫的一件事(用起来炒鸡爽)! 用Ajax就可以实现这个功能啦.废话不多说,下面贴出我写的demo吧哈哈.我用的TP框架(3.2)比较习惯啦 ...

  5. PHP的内存泄露问题与垃圾回收

    你写了一个PHP脚本,一般都不用考虑内存泄露和垃圾回收的问题,因为一般情况下你的脚本很快就执行完退出了. 但在一些运行时间长,数据量大的时候,程序运行一段时间后,php脚本就占用了过多内存,然后就报错 ...

  6. volley5--Request<T>类的介绍

    源码: /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, V ...

  7. javascript使用web proxy来实现ajax cross-domain通信

    在现代浏览器中,都强加了对javacript代码的访问限制,比如一个页面的js无法向非同源的url实现ajax请求,获得数据.在这时,是浏览器端会报错: No 'Access-Control-Allo ...

  8. java笔记--增加虚拟机内存

    --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877243.html "谢谢-- 为避免大型应用程序因虚拟机内存不足而无法 ...

  9. CentOS随笔 - 6.CentOS7安装Git服务器

    前言 转帖请注明出处: http://www.cnblogs.com/Troy-Lv5/ 版本管理当然是选择git..反正我是被svn坑怕了... 这次安装的是git 2.18.0 点击下载 准备安装 ...

  10. Python 解决写入csv中间隔一行空行问题

    转载解决写入csv中间隔一行空行问题 写入csv: with open(birth_weight_file,'w') as f: writer=csv.writer(f) writer.writero ...