《es6》-学习笔记

Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码。

1、let和const

JavaScript没有块级作用域。

let 定义的变量相对于var不同点:不能被提升;  可重复定义检查(避免在多人协作中,一个变量在同一个作用域被定义两次);能被用于块级作用域(循环的每一次执行都产生了一个作用域)

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10

变量i是var声明的,在全局范围内都有效,所以全局只有一个变量i。

而如果使用let,声明的变量仅在块级作用域内有效,最后输出的是6。(这种解决冲突的方案,与立即执行函数传递参数,创建的块级作用域异曲同工之妙)

var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

暂时性死区: 以上代码中tmp未定义。ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

另外要注意两点:

1、ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。

2、ES6 的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。

const:   原理:阻隔变量名所对应的内存地址被改变。const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。

const声明的常量,也与let一样不可重复声明,不能提升,存在暂时性死区,只能在声明的位置后面使用。

不过内容仍然能够通过修改属性而被修改:

const fpp = {
    a:1,
    b:2
}
fpp.a=2    //2

ES5之中,顶层对象的属性与全局变量是等价的。ES6为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。

var a = 1;
window.a // 1

let b = 1;
window.b // undefined

2. 变量的结构赋值

ES6允许从数组和对象中提取值,按照对应位置进行赋值

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

解构赋值允许指定默认值,但是如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined。

let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x = 1] = [null];    x // null
对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。

let { foo: baz } = { foo: "aaa", bar: "bbb" };
baz // "aaa"
foo // error: foo is not defined

foo只是匹配模式,真正被赋值的是baz变量。

圆括号问题:ES6的规则是,只要有可能导致解构的歧义,就不得使用圆括号。

    1.变量声明不能使用圆括号:let {(x): c} = {}; //报错

    2.函数参数中,模式不能带有圆括号:function f([(z)]) { return z; } //报错

  3.赋值语句中,不能将整个模式放在圆括号中 ({ p: a }) = { p: 42 }; //报错

可以使用圆括号的情况:赋值语句的非模式部分。

[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确
它们都是赋值语句,而不是声明语句;其次它们的圆括号都不属于模式的一部分。
运用:
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]

2. 遍历Map结构

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

3.字符串的扩展

码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,只要将码点放入大括号,就能正确解读该字符。

        "\u{20BB7}"      //"

猜你喜欢

转载自blog.csdn.net/weixin_41892205/article/details/80764888