ES6新特性

1.let和const和var

(1)var 可以声明多次;let只能声明一次
(2)var声明的变量往往会越域;let声明的变量有严格局部作用
(3)let和const命令用于声明变量。let声明的变量是可变的,const声明的变量是不可变的。
注意,如果const声明的变量指向一个对象,那么该对象的属性是可变的,这是因为变量foo本身是不可变的,即foo不能指向另一个对象。但是,对象内部的属性是可变的,这是因为这时foo保存的是一个指针,这个指针本身不可变,但它指向的对象本身是可变的。
使用规范:
let 关键词声明的变量不具备变量提升(hoisting)特性
let 和 const 声明只在最靠近的一个块中(花括号内)有效
当使用常量 const 声明时,请使用大写变量,如:CAPITAL_CASING
const 在声明时必须被赋值,也就是必须初始化,否则会报错。

2.模板字符串

在ES6之前,我们往往这么处理模板字符串:通过“\”和“+”来构建模板,而对ES6来说:基本的字符串格式化。将表达式嵌入字符串中进行拼接。用${}来界定;ES6反引号(``)直接搞定;

3.箭头函数

箭头函数最直观的三个特点:
(1)不需要 function 关键字来创建函数
(2)省略 return 关键字
(3)继承当前上下文的 this 关键字
注意:在箭头函数中
(1).this是静态的,this始终指向函数声明时所在作用域下的this的值
(2).不能作为构造函数实例化对象
(3).不能使用arguments变量
ES6允许使用箭头函数、将原函数的“function”关键字和函数名都删掉,并使用“=>”连接参数列表和函数体。

var f = v => v;
// 等同于
var f = function (v) { return v;};

当函数参数只有一个,括号可以省略;但是没有参数时,括号不可以省略。

var f = () => 5;// 等同于
var f = function () { return 5 };
var sum = (num1, num2) => num1 + num2;// 等同于
var sum = function(num1, num2) {
  return num1 + num2;
};

如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。

4.rest 参数

ES6 引入 rest 参数(形式为...变量名),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

function add(...values) {
  let sum = 0;
  for (var val of values) {
    sum += val;
  }
  return sum;
}
add(2, 5, 3) // 10

上面代码的add函数是一个求和函数,利用 rest 参数,可以向该函数传入任意数目的参数。

 5.扩展运算符 

任何定义了遍历器(Iterator)接口的对象(参阅 Iterator 一章),都可以用扩展运算符转为真正的数组。

扩展运算符(spread)是三个点(...)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中。

(1)用于合并数组:会形成一个新的数组,不改变原来的,例如:let arr3 = [...arr1,...arr2] 

(2)数组克隆,let arr2 = [...arr1]  

(3)复制对象,见上面的例1。转换数据见下图(要特别注意一个是遍历输出数组的每一项,加上中括号就变成了复制数组。

      ==结果=》  

 

 6.literator接口

任何定义了遍历器(Iterator)接口的对象(参阅 Iterator 一章),都可以用扩展运算符转为真正的数组。

 7.symbol基本使用:ES6引入的一种新的原始数据类型,表示独一无二的值

    1).symbol的值是唯一的,用来解决命名冲突问题。
    2).symbol不能与其他值进行运算。
    3).symbol定义的对象属性不能用for…in遍历循环,单可以使用Reflect.ownKeys来获取所有对象的键名。

 

 8.ES6提供了新的数据结构Set(注意s大写)

它类似与数组,但成员的值都是唯一的,集合实现了iterator接口,所以可以使用扩展运算符(...)和for of进行遍历。Set 本身是一个构造函数,用来生成 Set 数据结构。

 

 

    //声明一个set
    let se = new Set();
    let se2 = new Set(["da", "xiao", "gao", "pang"]);
    console.log(se2);
    //添加新元素
    se2.add("xishi");
    console.log(se2);
    //删除元素
    se2.delete("gao");
    console.log(se2);
    //检测
    console.log(se2.has("da"));
    //清空
    se2.clear();
    console.log(se2);

9.ES6ES6提供了数据结构Map

它类似于对象,也是键值对的集合。但键的范围不限于字符串,各种类型的值(包括对象)都可以当做键。Map也实现了iterator接口,所以可以使用扩展运算符和for of进行遍历.

Map的属性和方法:

(1)size:返回Map元素的个数,(2)set:增加一个新元素,返回当前Map,(3)get:返回键名对象的键值,(4)has:检测Map中是否包含某个元素,返回布尔值,(5)clear:清空集合,返回undefined

 

 =======>>>>>>>>>>>

可见,333是一个数组,而map、set都是集合,他们的类型都是function。

 10.class类

ES6 允许新建“类”(class)。ES6 允许在对象中使用 super 方法:
(1)class声明类,
(2)constructor定义构造函数初始化,当使用new 方法名(),就会执行constructor
(3)extends继承父类,
(4)super调用父级构造方法,
(5)static定义静态方法和属性,
(6)父类方法可以重写

 11.Promise对象

Promise 是 ES6 引入的封装异步操作的统一接口。它返回一个对象,包含了异步操作的信息。
Promise 本身是一个构造函数,提供了resolve和reject两个方法。一旦异步操作成功结束,就调用resolve方法,将 Promise 实例对象的状态改为resolved,一旦异步操作失败,就调用reject方法,将 Promise 实例的状态改成rejected。

详见:

12.模块化

ES6 意义最重大的语法变化,就是引入了模块(module)。
一个模块内部,使用export命令输出对外的接口。
什么是模块化模块化就是把代码进行拆分,方便重复利用。类似Java中的导包,要使用一个包,必须先导包。二Js中没有包的概念,换来的就是模块
模块的功能主要有两个命令构成:export和import
export命令用于规定模块的对外接口,export不仅可以导出对象,一切js变量都可以导出。比如:基本类型变量、函数、数组、对象
import命令用于导入其他模块提供的功能

13.对象和数组的解构赋值

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

let [a, b, c] = [1, 2, 3];

上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。

解构赋值不仅可以用于数组,还可以用于对象。

let { foo, bar } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"

解构赋值时,还可以设置默认值。 

let [x, y = 'b'] = ['a']; // x='a', y='b'

上面代码中,变量y解构赋值时没有取到值,所以默认值就生效了。

 14.函数

15.迭代器

简介:是一种接口,为各种不同的数据提供统一的访问机制。任何数据结构只要部署了iterator接口,就可以完成遍历操作。ES6创造了一种新的遍历命令:for…of循环,iterator接口主要提供for…of消费。
原生的已经具备iterator接口的数据(可直接使用用for…of遍历)有如下这些:Array,Arguments,Set,Map,String,TypeArray,NodeList。
迭代器的原理
a)创建一个指针对象,指向当前数据的起始位置
b)第一次调用对象的next方法,指针自动指向数据结构的第一个成员
c)接下来不断调用next方法,指针一直往后移动,直到指向最后一个成员,例如:

 

 16.生成器

是es6提供的一种异步编程解决方案,是一个特殊的函数。

17.async和await

 详见:

 
posted @ 2023-01-30 16:17  122www  阅读(82)  评论(0编辑  收藏  举报