ES6 知识碎片1

来源:互联网 发布:淘宝批量删除订单 编辑:程序博客网 时间:2024/06/10 19:09
  • typeof 非安全

    在使用 let 声明的变量前,使用 typeof函数检测变量是否存在,现在是非安全的了,会出现异常,原因是因为 let的暂时性死区引起的。
typeof a;//ReferenceError: a is not definedlet a = 2;
  • 不允许重复声明

    let不允许在相同作用域内,重复声明同一个变量。
// 报错function () {  let a = 10;  var a = 1;}// 报错function () {  let a = 10;  let a = 1;}
  • 块级作用域中,函数声明将当成作用 var声明的变量一样
function f() { console.log('I am outside!'); }(function () {  // var f = undefined; //在 ES6中相当于这样。  if (false) {    // 重复声明一次函数f    function f() { console.log('I am inside!'); }  }  f();//在 ES5中为:I am inside!      //在 ES6中出 TypeError: f is not a function 异常}());
  • const定义的常量

    只是锁定了该变量指向的引用,具体的值还是可以改变的,如下:
const arr = [];arr.push(1);//不会出错arr.length = 0;//不会出错arr = 2;//会出错Uncaught TypeError: Assignment to constant variable.//如果想要将变量值也锁定,需要使用 `Object.freeze()`函数const foo = Object.freeze({});// 常规模式时,下面一行不起作用;// 严格模式时,该行会报错foo.prop = 123;

除了将对象本身冻结,对象的属性也应该冻结。下面是一个将对象彻底冻结的函数。

var constantize = (obj) => {  Object.freeze(obj);  Object.keys(obj).forEach( (key, i) => {    if ( typeof obj[key] === 'object' ) {      constantize( obj[key] );    }  });};
  • 解构赋值中的默认值

    ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,如果一个数组成员不严格等于undefined,默认值是不会生效的。
let [x = 1] = [undefined];x // 1let [x = 1] = [null];x // null

对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。

let { foo: baz } = { foo: "aaa", bar: "bbb" };baz // "aaa"foo // error: foo is not defined
  • 字符串的解构赋值

    字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
const [a, b, c, d, e] = 'hello';a // "h"b // "e"c // "l"d // "l"e // "o"
  • 不借助三方变量,交换两个变量
let x = "abc", y = 2;[x, y] = [y, x];x;//2y://"abc"
原创粉丝点击