es6

兼容性



IE:可以看到IE6,IE7是完全不支持的。而IE8是只支持一些内容,参考引用4,IE9是大部分支持,支持度参考引用2。

Chrome:Chrome 23版本之后就是完全支持的了。19~22版本有不兼容的地方,参考引用1。

Firefox:Firefox 21版本之后就是完全支持的了。4~20版本有不兼容的地方,参考引用1。


我们利用npm来安装我们最想要的babel。

同样我们启动命令提示符窗口并且输入:npm install babel-core@5,然后回车,这里要稍等片刻:


看到上面的界面就是表示你安装babel成功,你会在电脑盘中找到这样的目录:C:\Users\Administrator\node_modules\babel-core,打开后你会看到:


在这个目录里面我们找到babel的浏览器版本browser.js(未压缩版)和browser.min.js(压缩版)。

然后我们将这个文件使用在我们的ES6.html中。

    <script src="browser.min.js"></script>    <script type="text/babel">        const Name = '张三';//使用新增的关键字:const声明常量        alert(Name);    </script>

我们把browser.min.js引入(文件位置的路径要确保正确)。并且设置第二个script标签的type为”text/babel”。










新特性

ES6新特性在Babel下的兼容性列表

ES6特性兼容性

箭头函数支持

类的声明和继承部分支持,IE8不支持

增强的对象字面量支持

字符串模板支持

解构支持,但注意使用方式

参数默认值,不定参数,拓展参数支持

let与const支持

for ofIE不支持

iterator, generator不支持

模块module、Proxies、Symbol不支持

Map,Set 和 WeakMap,WeakSet不支持

Promises、Math,Number,String,Object 的新API不支持

export & import支持

生成器函数不支持

数组拷贝支持

Let和const

Let作用域在最近一个大括号内,为局部变量,不影响外部内容

let name = 'zach'

while (true) {

    let name = 'obama'

    console.log(name)  //obama

    break

}

console.log(name)  //zach



Const声明常量,一旦声明,常量的值就不能改变。否则会报错


const Name = '张三';//使用新增的关键字:const声明常量

Name = "1"

alert(Name);




For of

For of用break;终止。解决了for 和 for...in 循环的不足之处,你可以随时停止或退出for...of 循环。

For in和 for of 的区别

let map = ['a','b','c','d']

for(i in map){

console.log(i)

}

for(i of map){

console.log(i)

}


For in循环的是index下标

For of循环的是值



Set和Map


Set结构最大的特点是去重,Map结构最大的特点是kv结构。


Map 对象就是保存 key-value(键值) 对。对象和原始值可以用作 key(键)或 value(值)。Map 对象根据其插入方式迭代元素。换句话说, for...of 循环将为每次迭代返回一个 key-value(键值) 数组。

Map结构和对象非常类似,不过最大的区别在于,Map结构可以用其他类型作为key,例如数组、对象等。

const iterable = new Map([['one', 1], ['two', 2]]);

for (const [key, value] of iterable) {

console.log(`Key: ${key} and Value: ${value}`);

// Output:

// Key: one and Value: 1

// Key: two and Value: 2


Set(集合) 对象允许你存储任何类型的唯一值,这些值可以是原始值或对象。 Set(集合) 对象只是值的集合。 Set(集合) 元素的迭代基于其插入顺序。 Set(集合) 中的值只能发生一次。如果您创建一个具有多个相同元素的 Set(集合) ,那么它仍然被认为是单个元素。

Set和数组类似,可以存储元素,但是Set不能存储相同的值。

const iterable = new Set([1, 1, 2, 2, 1]);

for (const value of iterable) {

console.log(value);

}

// Output:

// 1

// 2

WeakMap,WeakSet

WeakSet的成员只能是对象

WeakMap只接受对象作为键名

解构

ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构

//JS

对象

var obj = {a:100,b:200}

.var a = obj.a

var b = obj.b

数组

var arr = ['xxx','yyy','zzz']

var x = arr[0]

//ES6

对象

const {a,c} = {a:10,b:20,c:30}

console.log(a)//10

console.log(c)//30

数组

const arr = ['xxx','yyy','zzz']

const [x,y,z] = arr

console.log(x)//‘xxx’

console.log(y)//‘yyy’

console.log(z)//‘zzz’

多行字符串/模板变量

模板字面量用倒引号 ( `` )(而不是单引号( '' ) 或双引号( "" ))表示,可以包含用${expression} 表示的占位符

//JS

var name =  'zhangsan', age = 20,html = '';

html += '<div>';

html += ' <p>' + name + '</p>';

html += ' <p>' + age + '</p>';

html += '</div>';

//ES6

const name = 'zhangsan',age = 20;

const html = `<div>

                  <p>${name}</p>

                  <p>${age}</p>

              </div>`;

console.log(html);

箭头函数

function funcName(params) {

console.log(params + 2)

}

funcName(2)//4


var funcName = (params) => {

console.log(params + 2)

}

funcName(2)//4

var funcName = (params) => console.log(params + 2);//只有一个表达式可以省略花括号

funcName(2)//4

var funcName = params => console.log(params + 2);//只有参数可以省略括号

funcName(2)//4


省略了function

箭头函数this为父作用域的this,不是调用时的this

function Counter() {

  this.num = 0;

  this.timer = setInterval(() => {

this.num++;

    console.log(this.num);

  }, 1000);

}

var b = new Counter();

// 1

// 2

// 3

// ...

箭头函数不能作为构造函数,不能使用new

var B = () => {

value: 1;

}

var b = new B(); //TypeError: B is not a constructor

对象字面量增强

//ES5对象字面量

var type = 'rock';

var heat = '50%';

var music = {

type: type,

heat: heat

};

console.log(music); // Object {type: "rock", heat: "50%"}

//ES6对象字面量

var type = 'rock';

var heat = '50%';

var music = {

type,

heat

};

console.log(music); // Object {type: "rock", heat: "50%"}

类的声明和继承

class Parent {

    constructor(name,age) {

        this.name = name;

        this.age = age;

    }


    getName() {

        return this.name;

    }

}

typeof Parent; //function,类的数据类型就是函数,类本身就指向构造函数

constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。



class Child extends Parent {

    constructor(sex) {

        super();

        this.sex = sex;


    }

}

var child = new Child('xiaoyu',12,'man');

在子类的构造函数中,如果显示声明了constructor,则必须要显示的调用super函数

只有调用super之后,才可以使用this关键字,否则会报错。

参数默认值,不定参数,拓展参数


参数默认值

function f(x, y = 12) {

  return x + y;

}


console.log(f(3));  //15

console.log(f(3,2));  //5


不定参数可以让我们更方便地获取不定参数(或者说剩余参数)

function demo(part1, ...part2) {

console.log(part1);

console.log(part2);

}


demo(1,2,3,4,5,6);

// 1

// [2,3,4,5,6]


扩展运算符可以将数组转换为连续的函数参数。

[if !supportLists](1)[endif]在函数中使用

function f(x, y, z) {

  return x + y + z;

}

// 传递数组的每个元素作为参数

f(...[1,2,3]); // 6

[if !supportLists](2)[endif]在数组中使用

var parts = ["1", "2"];

var lyrics = ["a", ...parts, "b"]; //["a", "1", "2", "b"]



我觉得拓展运算符合,不定参数刚好是反向转换

不定参数是将多个值转成数组

扩展运算符是将数组拆成多个值





数组拷贝

es5中通过变通的方式来实现深克隆

const a1 = [1, 2];

const a2 = a1.concat();

a2[0] = 2;

a1 // [1, 2]


Es6则是使用了拓展运算符

const a1 = [1, 2];

//写法一 const a2 = [...a1];

//写法二 const [...a2] = a1;


扩展运算符提供了数组合并的新写法

const arr1 = ['a', 'b'];

const arr2 = ['c'];

const arr3 = ['d', 'e'];

// ES5的合并数组

arr1.concat(arr2, arr3); // [ 'a', 'b', 'c', 'd', 'e' ]

// ES6的合并数组

[...arr1, ...arr2, ...arr3] // [ 'a', 'b', 'c', 'd', 'e' ]


生成器函数

Generator的声明方式类似一般的函数声明,只是多了个*号,并且一般可以在函数内看到yield关键字

function* showWords() {

    yield 'one';

    yield 'two';

    return 'three';

}

var show = showWords();


show.next() // {done: false, value: "one"}

show.next() // {done: false, value: "two"}

show.next() // {done: true, value: "three"}

show.next() // {done: true, value: undefined}

调用next方法后,函数内执行第一条yield语句,输出当前的状态done(迭代器是否遍历完成)以及相应值(一般为yield关键字后面的运算结果)

每调用一次next,则执行一次yield语句,并在该处暂停,return完成之后,就退出了生成器函数,后续如果还有yield操作就不再执行了

yield和yield*

function* showWords() {

    yield 'one';

    yield showNumbers();

    return 'three';

}

function* showNumbers() {

    yield 10 + 1;

    yield 12;

}

var show = showWords();

show.next() // {done: false, value: "one"}

show.next() // {done: false, value: showNumbers}

show.next() // {done: true, value: "three"}

show.next() // {done: true, value: undefined}

因为yield只能原封不动地返回右边运算后值,但现在的showNumbers()不是一般的函数调用,返回的是迭代器对象

所以换个yield* 让它自动遍历进该对象

function* showWords() {

    yield 'one';

    yield* showNumbers();

    return 'three';

}

function* showNumbers() {

    yield 10 + 1;

    yield 12;

}

var show = showWords();

show.next() // {done: false, value: "one"}

show.next() // {done: false, value: 11}

show.next() // {done: false, value: 12}

show.next() // {done: true, value: "three"}

要注意的是,这yield和yield* 只能在generator函数内部使用,一般的函数内使用会报错

import 和 export

export将变量或方法暴露给外部

export var firstName = 'Michael';

export var lastName = 'Jackson';

export var year = 1958;


1使用export{接口} 导出接口

export {firstName, lastName, year};

2我们可以使用XX as YY

export {firstName as first, lastName as last, year};

3使用export default导出;如果一个js模块文件就只有一个功能, 那么就可以使用export default导出;

export default "string";

4除了指定加载某个输出值,还可以使用整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面。


使用import 引入,script 注意type要改为module

后方的引用路径不可以是裸路径


<script type="module">

import * as app from './app.js';

app.streamV1();

</script>


function v1() { ... }

function v2() { ... }

export {

    v1 as streamV1,

    v2 as streamV2,

    v2 as streamLatestVersion

};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容