【Web】ES6学习笔记(一)

来源:互联网 发布:农行网银助手mac 编辑:程序博客网 时间:2024/06/03 12:35

一.let/var:

1.let所声明的变量,只在let命令所在的代码块内有效。
这里写图片描述
2.只要块级作用域(?)内存在let,它所声明的变量就绑定这个区域。因此,在let命令声明变量tmp之前,都属于变量tmp的“死区”(程序会报错referenceError)
这里写图片描述

注:我记得js的for,if是没有块级作用域这个概念的,这里可以理解为在ES6中由于let的引入使for,if具有的块级作用域的概念。

这个新特性,提醒程序员养成良好的编代码习惯,一定要先声明再调用。
3.适合场景:for循环。循环语句部分是一个父作用域,而循环体内部是一个单独的子作用域。

for (let i = 0; i < 3; i++) {  let i = 'abc';  console.log(i);}// abc// abc// abc

4.不允许重复声明
let不允许在相同作用域内,重复声明同一个变量。

这里写图片描述

5.避免在块级作用域内声明函数。
6.do表达式:为了可以在块级作用域以外获得返回值,可以在块级作用域前加上do,使其变为do表达式。

注:试了谷歌和火狐,貌似都不支持do这个关键字…

7.const命令
const声明一个只读的常量,一旦声明,常量的值就不能改变。const一旦声明变量,就必须立即初始化。const作用域与let命令相同,只在声明所在的块级作用域内有效。
这里写图片描述

注:const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。

8.声明变量
ES6声明变量的6种方法:var ,function,let,const,import,class
9.顶层对象的属性
在浏览器环境指的是window对象,在node指的是global对象。ES6中,var和function命令声明的全局变量,依旧是顶层对象的属性。let,const和class命令声明的全局变量,不属于顶层对象的属性。
这里写图片描述

二.变量的解构赋值

1.数组的解构赋值

这里写图片描述

解构赋值允许指定默认值:
这里写图片描述
如果默认值是一个表达式,那么这个表达式是惰性求值。
这里写图片描述
上面的代码中,因为xx能取到值,所以函数f根本不会执行,yy由于取不到值,所以将会被赋值。

2.对象的解构赋值
解构不仅可以用于数组,还可以用于对象。
这里写图片描述
注:下面代码中,let命令下面一行的圆括号是必须的,否则会报错,因为解析器会将起首的大括号,理解成一个代码块,而不是赋值语句。
这里写图片描述

3.和数组一样,解构也可以用于嵌套结构的对象。
这里写图片描述
4.字符串也可以解构赋值。

这里写图片描述

5.数值和布尔值的解构赋值:

这里写图片描述

解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。

6.不能使用圆括号的情况
(1)变量声明语句中,不能带有圆括号

这里写图片描述

(2) 函数参数中,模式不能带有圆括号。
函数参数也属于变量声明,因此不能带有圆括号。
(3)赋值语句中,不能将整个模式,或嵌套模式中的一层,放在圆括号之中。
这里写图片描述
7.可以使用圆括号的情况
可以使用圆括号的情况只有一种:
赋值语句的非模式部分,可以使用圆括号。

[(b)] = [3]; // 正确({ p: (d) } = {}); // 正确[(parseInt.prop)] = [3]; // 正确

8.用途
(1)交换变量的值

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

(2)从函数中返回多个值
函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。

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

(3)函数参数的定义

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

(4)提取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]

(5)函数参数的默认值

jQuery.ajax = function (url, {  async = true,  beforeSend = function () {},  cache = true,  complete = function () {},  crossDomain = false,  global = true,  // ... more config}) {  // ... do stuff};

(6)遍历map结构

var map = new Map();map.set('first', 'hello');map.set('second', 'world');for (let [key, value] of map) {  console.log(key + " is " + value);}

如果只想获取键名或者键值

/ 获取键名for (let [key] of map) {  // ...}// 获取键值for (let [,value] of map) {  // ...}

(7)输入模块的指定方法
加载模块时,往往需要指定输入哪些方法。解构赋值使得输入语句非常清晰。

const { SourceMapConsumer, SourceNode } = require("source-map");

未完待续….
参考自http://es6.ruanyifeng.com/#docs/destructuring