ES6新特性

本文介绍了ECMAScript6的新特性,包括箭头函数、字符串模板、类和模块等。箭头函数简化了函数定义并解决了this指向问题。字符串模板使多行字符串书写更方便,并支持变量嵌入。类提供了面向对象编程的支持,而模块则实现了代码组织和复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

ECMAScript 6 在接下来的一段时间内将成为 ECMAScript的一个标准。这个标准预计在今年的时候就会被签署,不管在Github,还是在很多社区,javascript爱好者已经早已开始拥抱变化,享受ES6 带来的美好,这篇文章将介绍ES6的一些新特性。由于ES6 还没有很好地被浏览器支持,所以这篇文章的ES6代码将使用 Babel 进行编译。

ECMAScript 6 的新特性

箭头(Arrow)

=> 是function的简写形式,支持expression 和 statement 两种形式。同时一点很重要的是它拥有词法作用域的this值,帮你很好的解决this的指向问题,这是一个很酷的方式,可以帮你减少一些代码的编写,先来看看它的语法。

([param] [, param]) => {
   statements
}

param => expression
代码:
	function arrow(){
				this.show1=function (name){return name;}
				this.show2=(name)=>{return name;}
			}
//上面show1和show2实现的内容上是等价的
注意:箭头函数里的this对象时指向外围作用域,不是指向当前作用域的

字符串模板

1,可以书写多行,并且保留空格和缩进字符;

2,不再需要用+好运算符进行连接;

3,变量之间用${varians}

// 基于纯粹虚构的模板语言
// ES6标签模板。
var libraryHtml = hashTemplate`
  <ul>
    #for book in ${myBooks}
      <li><i>#{book.title}</i> by #{book.author}</li>
    #end
  </ul>
`;	

类(class)

ES6 引入了class(类),让javascript的面向对象编程变得更加容易清晰和容易理解。类只是基于原型的面向对象模式的语法糖。

  class Animal {
    // 构造方法,实例化的时候将会被调用,如果不指定,那么会有一个不带参数的默认构造函数.
    constructor(name,color) {
      this.name = name;
      this.color = color;
    }
    // toString 是原型对象上的属性
    toString() {
      console.log('name:' + this.name + ',color:' + this.color);

    }
  }
   
 var animal = new Animal('dog','white');
 animal.toString();

 console.log(animal.hasOwnProperty('name')); //true
 console.log(animal.hasOwnProperty('toString')); // false
 console.log(animal.__proto__.hasOwnProperty('toString')); // true

 class Cat extends Animal {
  constructor(action) {
    // 子类必须要在constructor中指定super 方法,否则在新建实例的时候会报错.
    // 如果没有置顶consructor,默认带super方法的constructor将会被添加、
    super('cat','white');
    this.action = action;
  }
  toString() {
    console.log(super.toString());
  }
 }

 var cat = new Cat('catch')
 cat.toString();
 
 // 实例cat 是 Cat 和 Animal 的实例,和Es5完全一致。
 console.log(cat instanceof Cat); // true
 console.log(cat instanceof Animal); // true

类的 prototype 属性和 __proto__ 属性

在上一篇 javascript面向对象编程 中我们已经了解到一个实例化对象会有一个 __proto__ 指向构造函数的 prototype 属性。在 class 中。同时具有 __proto__ 和 prototype 两个属性,存在两条继承链。

  • 子类的 __proto__ 属性,表示构造函数的继承,总是指向父类。

  • 子类的 prototype 的 __proto__ 属性表示方法的继承,总是指向父类的 prototype 属性。

  class Cat extends Animal {}
  console.log(Cat.__proto__ === Animal); // true
  console.log(Cat.prototype.__proto__ === Animal.prototype); // true
 

我们先来看第一条 Cat.__proto__ === Animal 这条原型链。完成构造函数继承的实质如下:

 class Cat extends Animal {
   construcotr() {
     return Animal.__proto__.call(this);
  }
 }

第二条对原型链 Cat.prototype.__proto__ === Animal.prototype 完成方法的继承,实质如下:

Cat.prototype.__proto__ = Animal.prototype

另外还有还有三种特殊情况。

 class A extends Object {}
 console.log(A.__proto__ === Object); // true
 console.log(A.prototype.__proto__ === Object.prototype); 
 

A继承Object,A的__prototype__ 指向父类Object. A的 prototype.__proto__ 指向父类Object的prototype。

从上篇文章中的 函数对象的原型 中我们可以了解到,函数是一种特殊的对象,所有函数都是 Function 的实例。

 class Cat {}
 console.log(Cat.__proto__ === Function.prototype); //true
 console.log(Cat.prototype.__proto__ === Object.prototype); //true

由于Cat不存在任何继承,就相当于一个普通函数,由于函数都是Function 的实例,所以 Cat.__proto__指向 Function.prototype. 第二条继承链指向父类(Function.prototype) 的prototype属性,所以 Cat.prototype.__proto__ === Object.prototype. Cat调用后会返回Object实例,所以 A.prototype.__proto__ 指向构造函数(Object)的prototype。

 class Cat extends null {};
 console.log(Cat.__proto__ === Function.prototype); // true;
 console.log(Cat.prototype.__proto__ === null); //true

Cat是一个普通函数,所以继承 Function.prototype .第二条继承链不继承任何方法,所以 Cat.prototype.__proto__ == null.

Module

到目前为止,javascript (ES5及以前) 还不能支持原生的模块化,大多数的解决方案都是通过引用外部的库来实现模块化。比如 遵循CMD规范的 Seajs 和AMD的 RequireJS 。在ES6中,模块将作为重要的组成部分被添加进来。模块的功能主要由 export 和 import 组成.每一个模块都有自己单独的作用域,模块之间的相互调用关系是通过 export 来规定模块对外暴露的接口,通过import来引用其它模块提供的接口。同时还为模块创造了命名空间,防止函数的命名冲突。

export,import 命令

  //test.js
  export var name = 'Rainbow'

ES6将一个文件视为一个模块,上面的模块通过 export 向外输出了一个变量。一个模块也可以同时往外面输出多个变量。

 //test.js
 var name = 'Rainbow';
 var age = '24';
 export {name, age};

定义好模块的输出以后就可以在另外一个模块通过import引用。

  //index.js
 import {name, age} from './test.js'

整体输入,module指令

 //test.js
  
  export function getName() {
    return name;
  }
  export function getAge(){
   return age;
  } 

通过 import * as 就完成了模块整体的导入。

import * as test form './test.js';

通过指令 module 也可以达到整体的输入。

 module test from 'test.js';
 test.getName();

export default

不用关系模块输出了什么,通过 export default 指令就能加载到默认模块,不需要通过 花括号来指定输出的模块,一个模块只能使用 export default 一次

  // default 导出
  export default function getAge() {} 
 
  // 或者写成
  function getAge() {}
  export default getAge;

  // 导入的时候不需要花括号
  import test from './test.js';

一条import 语句可以同时导入默认方法和其它变量.

import defaultMethod, { otherMethod } from 'xxx.js';
### ES6 新特性介绍 ES6(ECMAScript 2015)是 JavaScript 的一个重要版本更新,引入了许多新特性和改进。以下是一些关键的 ES6 新特性及其详细说明: #### 1. 模块化支持 在 ES6 中,模块化功能得到了显著增强。每个文件被视为一个独立的模块,默认情况下,模块内的变量和函数对外部是不可见的,除非显式使用 `export` 关键字导出。通过 `import` 可以从其他模块导入所需的接口[^4]。 ```javascript // 导出模块内容 export const sqrt = Math.sqrt; export function square(x) { return x * x; } // 导入模块内容 import { sqrt, square } from './lib.js'; ``` #### 2. 箭头函数 箭头函数是 ES6 中新增的一种函数定义方式,它提供了更简洁的语法,并且在处理 `this` 绑定时更加直观。需要注意的是,箭头函数不能作为构造函数使用,也没有自己的 `prototype` 属性[^2]。 ```javascript const add = (x, y) => x + y; const Foo = () => {}; // new Foo(); // TypeError: Foo is not a constructor ``` #### 3. Map 和 Set 数据结构 ES6 引入了两种新的数据结构:`Map` 和 `Set`。`Map` 是键值对的集合,允许使用任意类型的键;而 `Set` 是一个存储唯一值的集合。这两种数据结构可以提高代码的可读性和性能[^3]。 ```javascript const map = new Map(); map.set('name', 'Alice'); console.log(map.get('name')); // Alice const set = new Set([1, 2, 3, 3]); console.log(set.size); // 3 ``` #### 4. 类(Class)语法 ES6 引入了类的语法糖,使得继承和面向对象编程更加直观。尽管底层仍然基于原型链,但类的语法让开发者能够更容易地创建和扩展对象。 ```javascript class Animal { constructor(name) { this.name = name; } speak() { console.log(this.name + ' makes a noise.'); } } class Dog extends Animal { speak() { console.log(this.name + ' barks.'); } } const d = new Dog('Rex'); d.speak(); // Rex barks. ``` #### 5. 解构赋值 解构赋值允许从数组或对象中提取数据并赋值给变量,简化了复杂的数据访问操作。 ```javascript const [a, , b] = [1, 2, 3]; console.log(a, b); // 1, 3 const { name, age } = { name: 'Bob', age: 30 }; console.log(name, age); // Bob, 30 ``` #### 6. 默认参数与剩余参数 函数参数现在可以设置默认值,同时还可以使用剩余参数来捕获不定数量的参数。 ```javascript function multiply(a, b = 1) { return a * b; } console.log(multiply(5)); // 5 function sum(...args) { return args.reduce((acc, val) => acc + val, 0); } console.log(sum(1, 2, 3, 4)); // 10 ``` #### 7. 模板字符串 模板字符串允许嵌入表达式,并且可以轻松创建多行字符串。 ```javascript const name = 'Alice'; const greeting = `Hello, ${name}!`; console.log(greeting); // Hello, Alice! const multiLine = `This is a multi-line string.`; console.log(multiLine); ``` #### 8. let 和 const `let` 和 `const` 提供了块级作用域的变量声明方式,避免了全局污染和变量提升问题。 ```javascript for (let i = 0; i < 3; i++) { console.log(i); } // 0, 1, 2 console.log(i); // ReferenceError: i is not defined const pi = 3.14; pi = 3; // TypeError: Assignment to constant variable. ``` #### 9. Promise Promise 提供了一种更好的方式来处理异步操作,解决了回调地狱的问题。 ```javascript const promise = new Promise((resolve, reject) => { setTimeout(() => resolve('Success!'), 1000); }); promise.then(result => console.log(result)); // Success! ``` ### 结论 ES6 的这些新特性极大地增强了 JavaScript 的功能和开发体验。通过合理使用这些特性,开发者可以编写更加简洁、高效和易于维护的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值