美文网首页
JavaScript基础一:基本概念

JavaScript基础一:基本概念

作者: 北雁南飞_8854 | 来源:发表于2020-11-14 19:45 被阅读0次

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

    相关文章

      网友评论

          本文标题:JavaScript基础一:基本概念

          本文链接:https://www.haomeiwen.com/subject/lvgbbktx.html