ECMAScript的变量是松散类型(loosely typed)的,可以用来保存任何类型的数据。
var变量声明提升
var变量声明提升(var Declaration Hoisting),是指使用var声明的变量会被提升到函数作用域(function scope)的最顶端。
例如:
function foo() {
console.log(age);
var age = 26;
}
foo(); //undefined
在运行时会被视作:
function foo() {
var age;
console.log(age);
age = 26;
}
foo(); // undefined
也可以重复声明同一个变量而不会报错:
function foo() {
var age = 16;
var age = 26;
var age = 36;
console.log(age);
}
foo(); // 36
var与let
let是块作用域的(block scoped),而var是函数作用域的(function scoped)。
if (true) {
var name = 'Matt';
console.log(name); // Matt
}
console.log(name); // Matt
if (true) {
let age = 26;
console.log(age); // 26
}
console.log(age); //ReferenceError: age is not defined
let声明不允许在同一个块作用域(block scope)内重复声明。
var name = 'Matt';
var name = 'Matt';
let age = 26;
let age = 26; //SyntaxError: Identifier 'age' has already been declared
暂时性死亡区(Temporal Dead Zone)
let和var的另一个重要区别是,let声明不会声明提升。
var name = 'Matt';
var name = 'Matt';
let age = 26;
let age = 26; //SyntaxError: Identifier 'age' has already been declared
原始类型(primitive type)的厨初始化只能使用原始类型字面量(primitive literal)来完成。如果使用new关键字的话,JavaScript将会创建一个Object类型。
let name1 = "Nicholas";
let name2 = new String("Matt");
name1.age = 27;
name2.age = 26;
console.log(name1.age); // undefined
console.log(name2.age); // 26
console.log(typeof name1); // string
console.log(typeof name2); // object
值的复制
primitive类型的值复制时,存储在variable object中的值会被复制进新的变量中。
当reference类型的值被复制时,复制的仅仅是指向存储在堆(heap)上的对象的指针(pointer)。
网友评论