ES6学习中的一些总结

学习的道路不能停止,想要不被淘汰就要不断地学习。最近读了阮一峰大神的《ECMAScript 6入门》一书,学习收获很大,所以特此做一下笔记。

一、const命令

1、const声明一个只读的常量。一旦声明,常量的值就不能改变。改变常量的值会报错。这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
2、const的作用域与let命令相同:只在声明所在的块级作用域内有效。
3、const命令声明的常量也是不提升(声明不提前),同样存在暂时性死区,只能在声明的位置后面使用。
4、const声明的常量,也与let一样不可重复声明。

//片断1
const PI = 3.1415;
PI // 3.1415

PI = 3;
// TypeError: Assignment to constant variable.

//片断2
const foo;
// SyntaxError: Missing initializer in const declaration

//片断3
if (true) {
  const MAX = 5;
}

MAX // Uncaught ReferenceError: MAX is not defined

//片断4
if (true) {
  console.log(MAX); // ReferenceError
  const MAX = 5;
}

//片断5
var message = "Hello!";
let age = 25;

// 以下两行都会报错
const message = "Goodbye!";
const age = 30;

5、对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。
const命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。
复合类型:
除了基本数据类型number、string、boolean、null、underfined以外,都是复合类型
常用的如:Array(数组)、Object(对象)、Date(日期)、Math(数学式)、RegExp(正则表达式)、function(函数)

const foo = {};
foo.prop = 123;

foo.prop
// 123

foo = {}; // TypeError: "foo" is read-only

//上面代码中,常量foo储存的是一个地址,这个地址指向一个对象。
//不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。

const a = [];
a.push('Hello'); // 可执行
a.length = 0;    // 可执行
a = ['Dave'];    // 报错
//上面代码中,常量a是一个数组,这个数组本身是可写的,但是如果将另一个数组赋值给a,就会报错。

6、对象冻结
冻结对象分为1、对象冻结(对象不能再添加属性 Object.freeze);2、彻底冻结(除了将对象本身冻结,对象的属性也应该冻结。)。

const foo = Object.freeze({});

// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
foo.prop = 123;


//彻底冻结
var constantize = (obj) => {
  Object.freeze(obj);
  Object.keys(obj).forEach( (key, value) => {
    if ( typeof obj[key] === 'object' ) {
      constantize( obj[key] );
    }
  });
};

二、ES6的6种声明方法
1、var命令
2、function命令
3、let命令
4、const命令
5、import命令
6、class命令

三、顶层对象的属性
顶层对象,在浏览器环境指的是window对象,在Node指的是global对象。ES5之中,顶层对象的属性与全局变量是等价的。
ES6为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、
class命令声明的全局变量,不属于顶层对象的属性。也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩。

var a = 1;
// 如果在Node的REPL环境,可以写成global.a
// 或者采用通用方法,写成this.a
window.a // 1

let b = 1;
window.b // undefined

//上面代码中,全局变量a由var命令声明,所以它是顶层对象的属性;
//全局变量b由let命令声明,所以它不是顶层对象的属性,返回undefined。

四、global 对象
这个暂时没有看懂,只知道,
ES5的顶层对象,本身也是一个问题,因为它在各种实现里面是不统一的。

浏览器里面,顶层对象是window,但 Node 和 Web Worker 没有window。
浏览器和 Web Worker 里面,self也指向顶层对象,但是Node没有self。
Node 里面,顶层对象是global,但其他环境都不支持。
而有个提案想统一使用global作为垫片库,不明白什么叫垫片库……

欢迎分享本文,转载请保留出处:前端ABC » ES6学习中的一些总结

赞 (4)
分享到:更多 ()

发表评论 1

  1. 匿名来看看,以后常来回复