JavaScript基础一:基本概念

2020-11-14  本文已影响0人  北雁南飞_8854

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)。

上一篇 下一篇

猜你喜欢

热点阅读