学习的道路不能停止,想要不被淘汰就要不断地学习。最近读了阮一峰大神的《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学习中的一些总结