在 ECMAScript 中,引用类型是一种数据结构,用于将数据和功能组织在一起。新对象是使用 new 操作符后跟一个构造函数来创建的。
var person = new Object();
这行代码创建了 Object 引用类型的一个新实例,然后把该实例保存在变量 person 中。使用的构造函数是 Object ,为新对象定了默认的属性和方法。
本章将介绍几种常见的引用类型数据:Object、Array、Date、RegExp、Function等。
let&const命令
ES6 中新增 let 命令来声明一个变量,仅在该作用域内有效。解决了 变量提升 和 变量泄露 的问题。
问题1: 变量提升问题
var tmp = new Date();
function f() {
console.log(tmp);
if(false) {
var tmp = 'hello world!';
//let tmp = 'hello world!'; //Sun Jul 23 2017 14:29:44 GMT+0800 (中国标准时间)
}
}
f(); //undefined
上面代码的原意是,if 代码块的外部使用外层的 tmp 变量,内部使用内层的 tmp 变量。但是,函数 f 执行后,输出结果为 undefined ,原因在于变量提升,导致内层的 tmp 变量覆盖了外层的 tmp 变量。
问题2: 变量泄露
var s = 'hello';
for (var i = 0; i < s.length; i++) {
//for(let i = 0; i < s.length; i++) { //Uncaught ReferenceError: i is not defined
console.log(s[i]);
}
console.log(i); // 5
上面代码中,变量 i 只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。