首页 web前端 前端问答 es6是什么出的

es6是什么出的

Apr 11, 2022 pm 01:54 PM
javascript es6

es6是2015年6月出的。es6全称“ECMAScript6”,是2015年6月正式发布的JavaScript语言的标准,其正式名为ECMAScript2015(ES2015),因其是ECMAScript的第6个版本,因此可简称为es6。

es6是什么出的

本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。

“es”简介

es全称“ECMAScript”,是根据 ECMA-262 标准实现的通用脚本语言,ECMA-262 标准主要规定了这门语言的语法、类型、语句、关键字、保留字、操作符、对象等几个部分,目前 ECMAScript 的最新版是 ECMAScript6(简称“ES6”)。

每次看到 ES 后面跟着数字,是 ECMAScript 的不同版本。

es6/ ES2015

es6全称ECMAScript6(ECMAScript的第6个版本),是于2015年6月正式发布的JavaScript语言的标准,正式名为ECMAScript 2015(ES2015)。它的目标是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。

ECMAScript 6 目前基本成为业界标准,它的普及速度比 ES5 要快很多,主要原因是现代浏览器对 ES6 的支持相当迅速,尤其是 Chrome 和 Firefox 浏览器,已经支持 ES6 中绝大多数的特性。

ES6的新增特性:

1. let、const 和 block 作用域

let 允许创建块级作用域,ES6 推荐在函数中使用 let 定义变量,而非 var:

1

2

3

4

5

6

var a = 2;

{

  let a = 3;

  console.log(a); // 3

}

console.log(a); // 2

登录后复制

同样在块级作用域有效的另一个变量声明方式是 const,它可以声明一个常量。ES6 中,const 声明的常量类似于指针,它指向某个引用,也就是说这个「常量」并非一成不变的,如:

1

2

3

4

5

6

{

  const ARR = [5,6];

  ARR.push(7);

  console.log(ARR); // [5,6,7]

  ARR = 10; // TypeError

}

登录后复制

有几个点需要注意:

  • let 关键词声明的变量不具备变量提升(hoisting)特性
  • let 和 const 声明只在最靠近的一个块中(花括号内)有效
  • 当使用常量 const 声明时,请使用大写变量,如:CAPITAL_CASING
  • const 在声明时必须被赋值

2. 箭头函数(Arrow Functions)

ES6 中,箭头函数就是函数的一种简写形式,使用括号包裹参数,跟随一个 =>,紧接着是函数体:

1

2

3

4

5

6

var getPrice = function() {

  return 4.55;

};

  

// Implementation with Arrow Function

var getPrice = () => 4.55;

登录后复制

需要注意的是,上面例子中的 getPrice 箭头函数采用了简洁函数体,它不需要 return 语句,下面这个例子使用的是正常函数体:

1

2

3

4

5

6

7

let arr = ['apple', 'banana', 'orange'];

  

let breakfast = arr.map(fruit => {

  return fruit + 's';

});

  

console.log(breakfast); // apples bananas oranges

登录后复制

当然,箭头函数不仅仅是让代码变得简洁,函数中 this 总是绑定总是指向对象自身。具体可以看看下面几个例子:

1

2

3

4

5

6

7

8

9

function Person() {

  this.age = 0;

  

  setInterval(function growUp() {

    // 在非严格模式下,growUp() 函数的 this 指向 window 对象

    this.age++;

  }, 1000);

}

var person = new Person();

登录后复制

我们经常需要使用一个变量来保存 this,然后在 growUp 函数中引用:

1

2

3

4

5

6

7

8

function Person() {

  var self = this;

  self.age = 0;

  

  setInterval(function growUp() {

    self.age++;

  }, 1000);

}

登录后复制

而使用箭头函数可以省却这个麻烦:

1

2

3

4

5

6

7

8

9

10

function Person(){

  this.age = 0;

  

  setInterval(() => {

    // |this| 指向 person 对象

    this.age++;

  }, 1000);

}

  

var person = new Person();

登录后复制

3. 函数参数默认值

ES6 中允许你对函数参数设置默认值:

1

2

let getFinalPrice = (price, tax=0.7) => price + price * tax;

getFinalPrice(500); // 850

登录后复制

4. Spread / Rest 操作符

Spread / Rest 操作符指的是 ...,具体是 Spread 还是 Rest 需要看上下文语境。

当被用于迭代器中时,它是一个 Spread 操作符:

1

2

3

4

5

6

function foo(x,y,z) {

  console.log(x,y,z);

}

  

let arr = [1,2,3];

foo(...arr); // 1 2 3

登录后复制

当被用于函数传参时,是一个 Rest 操作符:

1

2

3

4

function foo(...args) {

  console.log(args);

}

foo( 1, 2, 3, 4, 5); // [1, 2, 3, 4, 5]

登录后复制

5. 对象词法扩展

ES6 允许声明在对象字面量时使用简写语法,来初始化属性变量和函数的定义方法,并且允许在对象属性中进行计算操作:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

function getCar(make, model, value) {

  return {

    // 简写变量

    make,  // 等同于 make: make

    model, // 等同于 model: model

    value, // 等同于 value: value

  

    // 属性可以使用表达式计算值

    ['make' + make]: true,

  

    // 忽略 `function` 关键词简写对象函数

    depreciate() {

      this.value -= 2500;

    }

  };

}

  

let car = getCar('Barret', 'Lee', 40000);

  

// output: {

//     make: 'Barret',

//     model:'Lee',

//     value: 40000,

//     makeBarret: true,

//     depreciate: [Function: depreciate]

// }

登录后复制

6. 二进制和八进制字面量

ES6 支持二进制和八进制的字面量,通过在数字前面添加 0o 或者0O 即可将其转换为八进制值:

1

2

3

4

5

let oValue = 0o10;

console.log(oValue); // 8

  

let bValue = 0b10; // 二进制使用 `0b` 或者 `0B`

console.log(bValue); // 2

登录后复制

7. 对象和数组解构

解构可以避免在对象赋值时产生中间变量:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

function foo() {

  return [1,2,3];

}

let arr = foo(); // [1,2,3]

  

let [a, b, c] = foo();

console.log(a, b, c); // 1 2 3

  

function bar() {

  return {

    x: 4,

    y: 5,

    z: 6

  };

}

let {x: x, y: y, z: z} = bar();

console.log(x, y, z); // 4 5 6

登录后复制

8. 对象超类

ES6 允许在对象中使用 super 方法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

var parent = {

  foo() {

    console.log("Hello from the Parent");

  }

}

  

var child = {

  foo() {

    super.foo();

    console.log("Hello from the Child");

  }

}

  

Object.setPrototypeOf(child, parent);

child.foo(); // Hello from the Parent

             // Hello from the Child

登录后复制

9. 模板语法和分隔符

ES6 中有一种十分简洁的方法组装一堆字符串和变量。

  • ${ ... } 用来渲染一个变量
  • ` 作为分隔符

1

2

let user = 'Barret';

console.log(`Hi ${user}!`); // Hi Barret!

登录后复制

10. for...of VS for...in

for...of 用于遍历一个迭代器,如数组:

1

2

3

4

5

6

let nicknames = ['di', 'boo', 'punkeye'];

nicknames.size = 3;

for (let nickname of nicknames) {

  console.log(nickname);

}

// 结果: di, boo, punkeye

登录后复制

for...in 用来遍历对象中的属性:

1

2

3

4

5

6

let nicknames = ['di', 'boo', 'punkeye'];

nicknames.size = 3;

for (let nickname in nicknames) {

  console.log(nickname);

}

Result: 0, 1, 2, size

登录后复制

11. Map 和 WeakMap

ES6 中两种新的数据结构集:Map 和 WeakMap。事实上每个对象都可以看作是一个 Map。

一个对象由多个 key-val 对构成,在 Map 中,任何类型都可以作为对象的 key,如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

var myMap = new Map();

  

var keyString = "a string",

    keyObj = {},

    keyFunc = function () {};

  

// 设置值

myMap.set(keyString, "value 与 'a string' 关联");

myMap.set(keyObj, "value 与 keyObj 关联");

myMap.set(keyFunc, "value 与 keyFunc 关联");

  

myMap.size; // 3

  

// 获取值

myMap.get(keyString);    // "value 与 'a string' 关联"

myMap.get(keyObj);       // "value 与 keyObj 关联"

myMap.get(keyFunc);      // "value 与 keyFunc 关联"

登录后复制

WeakMap

WeakMap 就是一个 Map,只不过它的所有 key 都是弱引用,意思就是 WeakMap 中的东西垃圾回收时不考虑,使用它不用担心内存泄漏问题。

另一个需要注意的点是,WeakMap 的所有 key 必须是对象。它只有四个方法 delete(key),has(key),get(key) 和set(key, val):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

let w = new WeakMap();

w.set('a', 'b');

// Uncaught TypeError: Invalid value used as weak map key

  

var o1 = {},

    o2 = function(){},

    o3 = window;

  

w.set(o1, 37);

w.set(o2, "azerty");

w.set(o3, undefined);

  

w.get(o3); // undefined, because that is the set value

  

w.has(o1); // true

w.delete(o1);

w.has(o1); // false

登录后复制

12. Set 和 WeakSet

Set 对象是一组不重复的值,重复的值将被忽略,值类型可以是原始类型和引用类型:

1

2

3

4

5

let mySet = new Set([1, 1, 2, 2, 3, 3]);

mySet.size; // 3

mySet.has(1); // true

mySet.add('strings');

mySet.add({ a: 1, b:2 });

登录后复制

可以通过 forEach 和 for...of 来遍历 Set 对象:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

mySet.forEach((item) => {

  console.log(item);

    // 1

    // 2

    // 3

    // 'strings'

    // Object { a: 1, b: 2 }

});

  

for (let value of mySet) {

  console.log(value);

    // 1

    // 2

    // 3

    // 'strings'

    // Object { a: 1, b: 2 }

}

登录后复制

Set 同样有 delete() 和 clear() 方法。

WeakSet

类似于 WeakMap,WeakSet 对象可以让你在一个集合中保存对象的弱引用,在 WeakSet 中的对象只允许出现一次:

1

2

3

4

5

6

7

8

9

10

11

12

var ws = new WeakSet();

var obj = {};

var foo = {};

  

ws.add(window);

ws.add(obj);

  

ws.has(window); // true

ws.has(foo);    // false, foo 没有添加成功

  

ws.delete(window); // 从结合中删除 window 对象

ws.has(window);    // false, window 对象已经被删除

登录后复制

13. 类

ES6 中有 class 语法。值得注意是,这里的 class 不是新的对象继承模型,它只是原型链的语法糖表现形式。

函数中使用 static 关键词定义构造函数的的方法和属性:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

class Task {

  constructor() {

    console.log("task instantiated!");

  }

  

  showId() {

    console.log(23);

  }

  

  static loadAll() {

    console.log("Loading all tasks..");

  }

}

  

console.log(typeof Task); // function

let task = new Task(); // "task instantiated!"

task.showId(); // 23

Task.loadAll(); // "Loading all tasks.."

登录后复制

类中的继承和超集:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

class Car {

  constructor() {

    console.log("Creating a new car");

  }

}

  

class Porsche extends Car {

  constructor() {

    super();

    console.log("Creating Porsche");

  }

}

  

let c = new Porsche();

// Creating a new car

// Creating Porsche

登录后复制

extends 允许一个子类继承父类,需要注意的是,子类的constructor 函数中需要执行 super() 函数。

当然,你也可以在子类方法中调用父类的方法,如super.parentMethodName()。

在 这里 阅读更多关于类的介绍。

有几点值得注意的是:

  • 类的声明不会提升(hoisting),如果你要使用某个 Class,那你必须在使用之前定义它,否则会抛出一个 ReferenceError 的错误
  • 在类中定义函数不需要使用 function 关键词

14. Symbol

Symbol 是一种新的数据类型,它的值是唯一的,不可变的。ES6 中提出 symbol 的目的是为了生成一个唯一的标识符,不过你访问不到这个标识符:

1

2

var sym = Symbol( "some optional description" );

console.log(typeof sym); // symbol

登录后复制

注意,这里 Symbol 前面不能使用 new 操作符。

如果它被用作一个对象的属性,那么这个属性会是不可枚举的:

1

2

3

4

5

6

var o = {

    val: 10,

    [ Symbol("random") ]: "I'm a symbol",

};

  

console.log(Object.getOwnPropertyNames(o)); // val

登录后复制

如果要获取对象 symbol 属性,需要使用Object.getOwnPropertySymbols(o)。

15. 迭代器(Iterators)

迭代器允许每次访问数据集合的一个元素,当指针指向数据集合最后一个元素时,迭代器便会退出。它提供了 next() 函数来遍历一个序列,这个方法返回一个包含 done 和 value 属性的对象。

ES6 中可以通过 Symbol.iterator 给对象设置默认的遍历器,无论什么时候对象需要被遍历,执行它的 @@iterator 方法便可以返回一个用于获取值的迭代器。

数组默认就是一个迭代器:

1

2

3

4

5

6

7

8

var arr = [11,12,13];

var itr = arr[Symbol.iterator]();

  

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

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

itr.next(); // { value: 13, done: false }

  

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

登录后复制

你可以通过 [Symbol.iterator]() 自定义一个对象的迭代器。

16. Generators

Generator 函数是 ES6 的新特性,它允许一个函数返回的可遍历对象生成多个值。

在使用中你会看到 * 语法和一个新的关键词 yield:

1

2

3

4

5

6

7

8

9

10

11

12

function *infiniteNumbers() {

  var n = 1;

  while (true){

    yield n++;

  }

}

  

var numbers = infiniteNumbers(); // returns an iterable object

  

numbers.next(); // { value: 1, done: false }

numbers.next(); // { value: 2, done: false }

numbers.next(); // { value: 3, done: false }

登录后复制

每次执行 yield 时,返回的值变为迭代器的下一个值。

17. Promises

ES6 对 Promise 有了原生的支持,一个 Promise 是一个等待被异步执行的对象,当它执行完成后,其状态会变成 resolved 或者rejected。

1

2

3

4

5

6

var p = new Promise(function(resolve, reject) { 

  if (/* condition */) {    // fulfilled successfully

    resolve(/* value */); 

  } else {    // error, rejected

    reject(/* reason */); 

  }});

登录后复制

每一个 Promise 都有一个 .then 方法,这个方法接受两个参数,第一个是处理 resolved 状态的回调,一个是处理 rejected 状态的回调:

1

2

p.then((val) => console.log("Promise Resolved", val),

       (err) => console.log("Promise Rejected", err));

登录后复制

【相关推荐:javascript视频教程web前端

以上是es6是什么出的的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何使用WebSocket和JavaScript实现在线语音识别系统 如何使用WebSocket和JavaScript实现在线语音识别系统 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript实现在线语音识别系统引言:随着科技的不断发展,语音识别技术已经成为了人工智能领域的重要组成部分。而基于WebSocket和JavaScript实现的在线语音识别系统,具备了低延迟、实时性和跨平台的特点,成为了一种被广泛应用的解决方案。本文将介绍如何使用WebSocket和JavaScript来实现在线语音识别系

WebSocket与JavaScript:实现实时监控系统的关键技术 WebSocket与JavaScript:实现实时监控系统的关键技术 Dec 17, 2023 pm 05:30 PM

WebSocket与JavaScript:实现实时监控系统的关键技术引言:随着互联网技术的快速发展,实时监控系统在各个领域中得到了广泛的应用。而实现实时监控的关键技术之一就是WebSocket与JavaScript的结合使用。本文将介绍WebSocket与JavaScript在实时监控系统中的应用,并给出代码示例,详细解释其实现原理。一、WebSocket技

如何利用JavaScript和WebSocket实现实时在线点餐系统 如何利用JavaScript和WebSocket实现实时在线点餐系统 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket实现实时在线点餐系统介绍:随着互联网的普及和技术的进步,越来越多的餐厅开始提供在线点餐服务。为了实现实时在线点餐系统,我们可以利用JavaScript和WebSocket技术。WebSocket是一种基于TCP协议的全双工通信协议,可以实现客户端与服务器的实时双向通信。在实时在线点餐系统中,当用户选择菜品并下单

如何使用WebSocket和JavaScript实现在线预约系统 如何使用WebSocket和JavaScript实现在线预约系统 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript实现在线预约系统在当今数字化的时代,越来越多的业务和服务都需要提供在线预约功能。而实现一个高效、实时的在线预约系统是至关重要的。本文将介绍如何使用WebSocket和JavaScript来实现一个在线预约系统,并提供具体的代码示例。一、什么是WebSocketWebSocket是一种在单个TCP连接上进行全双工

JavaScript和WebSocket:打造高效的实时天气预报系统 JavaScript和WebSocket:打造高效的实时天气预报系统 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的实时天气预报系统引言:如今,天气预报的准确性对于日常生活以及决策制定具有重要意义。随着技术的发展,我们可以通过实时获取天气数据来提供更准确可靠的天气预报。在本文中,我们将学习如何使用JavaScript和WebSocket技术,来构建一个高效的实时天气预报系统。本文将通过具体的代码示例来展示实现的过程。We

简易JavaScript教程:获取HTTP状态码的方法 简易JavaScript教程:获取HTTP状态码的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教程:如何获取HTTP状态码,需要具体代码示例前言:在Web开发中,经常会涉及到与服务器进行数据交互的场景。在与服务器进行通信时,我们经常需要获取返回的HTTP状态码来判断操作是否成功,根据不同的状态码来进行相应的处理。本篇文章将教你如何使用JavaScript获取HTTP状态码,并提供一些实用的代码示例。使用XMLHttpRequest

javascript中如何使用insertBefore javascript中如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用于在DOM树中插入一个新的节点。这个方法需要两个参数:要插入的新节点和参考节点(即新节点将要被插入的位置的节点)。

JavaScript和WebSocket:打造高效的实时图像处理系统 JavaScript和WebSocket:打造高效的实时图像处理系统 Dec 17, 2023 am 08:41 AM

JavaScript是一种广泛应用于Web开发的编程语言,而WebSocket则是一种用于实时通信的网络协议。结合二者的强大功能,我们可以打造一个高效的实时图像处理系统。本文将介绍如何利用JavaScript和WebSocket来实现这个系统,并提供具体的代码示例。首先,我们需要明确实时图像处理系统的需求和目标。假设我们有一个摄像头设备,可以采集实时的图像数

See all articles