let和const
let:
- 仅在代码块中有效,块级作用域内默认绑定this,(暂时性死区emporal dead zone,简称 TDZ)
- 使用时候不存在变量提升现象
- 相同作用域内不能重复声明
- 不能在函数内部重新声明参数。
const:
-
const声明一个只读的常量。一旦声明,常量的值就不能改变
-
const实际上保证的不是说变量的值不能改动。而是变量指向的内存地址所保存的数据不能改动
const a = []; a.push('Hello'); // 可执行 a.length = 0; // 可执行 a = ['Dave']; // 报错
tips:
a这个数组是可写的,但是不能赋值。 如果真的想将对象冻结,应该使用Object.freeze方法。
顶层对象
这个概念在es5 的时候等同于全局变量,浏览器中的顶层对象是window,self也会指向顶层对象
所有情况下取到顶层对象的方法:
TODO:
为什么这三个要同时成立才能得到global否则是this,this指什么
(typeof window !== 'undefined' ? window : (typeof process === 'object' &&
typeof require === 'function' &&
typeof global === 'object')
? global
: this);
// 方法二 var getGlobal = function () {
if (typeof self !=='undefined') {
return self;
} if (typeof window !== 'undefined') {
return window;
} if (typeof global !== 'undefined') {
return global;
} throw new Error('unable to locate global object');
};
数据的解构赋值
let [head, ...tail] = [1, 2, 3, 4];
head // 1
tail // [2, 3, 4]
let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []
下面的语句都会报错,因为等号右边的值,要么转为对象以后不具备 Iterator 接口(前五个表达式),要么本身就不具备 Iterator 接口(最后一个表达式)。
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};
tips:
Iterator 接口:
遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制