ES6总结--严格模式、let/const 、解构赋值

来源:互联网 发布:用百度云盘需要网络吗 编辑:程序博客网 时间:2024/04/28 13:39

1、严格模式与 ECMAScript 6

ECMAScript 5 引入严格模式来清理语言,在文件或者函数的第一行放入下面的内容就可以开启严格模式:'use strict';

严格模式引入了三种破坏性的改变:

语法改变:一些之前合法的语法在严格模式下面是不允许的。例如:

禁止 with 语句。它允许使用者添加任何对象到变量作用域链,这会减缓程序的执行速度,并且很难指出某个变量指向哪里。
删除一个独立的标识符(一个变量,而不是一个属性)是不允许的。
函数只能在作用域的顶层声明。
更多的保留字: implements interface let package private protected public static yield 。
更多种类的错误。例如:

给一个未声明的变量赋值会抛出 ReferenceError 。在非严格模式下,这样干就会创建一个全局变量。
修改只读的属性(比如字符串的长度属性)会抛出 TypeError 。在非严格模式下,不会产生任何效果。
不同的语义:在严格模式下,一些语法结构表现得不一样。例如:

arguments 不再随着当前参数值的改变而改变。
在非方法的函数中 this 是 undefined 。在非严格模式下,它指向全局对象( window ),也就是说如果调用一个构造器的时候没有使用 new ,就会创建一些全局变量。
严格模式是一个很好地说明了版本化是棘手的:即便能够制作一个干净版本的 JavaScript ,也很难被大家接受。主要原因是破坏了一些现存的代码,降低了执行速度,并且加入到文件中也很麻烦(更不用说交互的命令行)。

2、let和const命令

ES6 规定暂时性死区和let、const语句不出现变量提升(声明前可用),主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。
const、let不允许在相同作用域内,重复声明同一个变量。
const的作用域与let命令相同:只在声明所在的块级作用域内有效。
const 声明一个只读的常量。一旦声明,常量的值就不能改变。一旦声明变量,就必须立即初始化,不能留到以后赋值。
const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,(主要是对象和数组)所以将一个对象声明为常量必须非常小心。

3、解构赋值

数组的解构赋值let [foo, [[bar], baz]] = [1, [[2], 3]];foo // 1bar // 2baz // 3let [ , , third] = ["foo", "bar", "baz"];third // "baz"字符串的解构赋值const [a, b, c, d, e] = 'hello';a // "h"b // "e"c // "l"d // "l"e // "o"对象的解构赋值let { bar, foo } = { foo: "aaa", bar: "bbb" };foo // "aaa"bar // "bbb"let { baz } = { foo: "aaa", bar: "bbb" };baz // undefined函数参数的解构赋值[[1, 2], [3, 4]].map(([a, b]) => a + b);// [ 3, 7 ]

用途:
交换变量的值

let x = 1;let y = 2;[x, y] = [y, x];

从函数返回多个值

// 返回一个数组function example() {  return [1, 2, 3];}let [a, b, c] = example();// 返回一个对象function example() {  return {    foo: 1,    bar: 2  };}let { foo, bar } = example();

函数参数的定义

// 参数是一组有次序的值function f([x, y, z]) { ... }f([1, 2, 3]);// 参数是一组无次序的值function f({x, y, z}) { ... }f({z: 3, y: 2, x: 1});

提取JSON数据

let jsonData = {  id: 42,  status: "OK",  data: [867, 5309]};let { id, status, data: number } = jsonData;console.log(id, status, number);// 42, "OK", [867, 5309]

函数参数的默认值

const change = (a=1,b=2,c)=>{    var s = a?a:1 //避免出现}

遍历Map结构

var map = new Map();map.set('first', 'hello');map.set('second', 'world');// 获取键值for (let [,value] of map) {  console.log(value)}

输入模块的指定方法

const { aa, bb } = require("cc");

圆括号问题:

变量声明语句中,不能带有圆括号。
函数参数中,模式不能带有圆括号。
赋值语句中,不能将整个模式,或嵌套模式中的一层,放在圆括号之中

总结:

如果解构不成功,变量的值就等于undefined。
不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组。这种情况下,解构依然可以成功。
解构赋值允许指定默认值。
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
默认值生效的条件是,对象的属性值严格等于undefined。
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。

原创粉丝点击