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

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 // 1
bar // 2
baz // 3

let [ , , 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无法转为对象,所以对它们进行解构赋值,都会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值