一文搞懂js变量声明

61 阅读1分钟

变量声明

变量声明方法及特点

var

  • 可以重复声明

image.png

  • 变量声明提升

image.png

  • 可修改

image.png

let

  • 不可重复声明

image.png

  • 无变量声明提升

image.png

  • 可修改

image.png

const

  • 不可重复声明

image.png

  • 无变量声明提升

image.png

  • 不可修改

image.png

测试代码
        // var 
        // {
        //     var a = 1;
        //     var a = 2;
        //     var a = 3;
        //     console.log(a);
        // }
        // {
            // console.log(a); // undefined
            // var a = 1;
            // console.log(a); // 1
        // }


        // let 
        // {
        //     let a = 1;
        //     let a = 2;
        //     console.log(a);
        // }
        // {
        //     console.log(a); // 报错
        //     let a = 1;
        //     console.log(a); // 1
        // }
        // {
        //     let a = 1;
        //     console.log(a); // 1
        //     a = 2;
        //     console.log(a); // 2
        // }

        // const
        // {
        //     const a = 1;
        //     const a = 2; // 报错
        //     console.log(a);
        // }
        // {
        //     console.log(a); // 报错
        //     const a = 1;
        //     console.log(a);
        // }
        // {
        //     const a = 1;
        //     console.log(a);
        //     a = 2; // 报错
        //     console.log(a);
        // }

什么是变量声明提升

在js脚本被解析时,会把var关键字提升到头部。

举个栗子

源代码

console.log(a);
var a = 1;
console.log(a);

解析后

var a;
console.log(a);
a = 1;
console.log(a);

const声明变量真的“不可变”吗

const关键字我们常用来声明常量,但是在js中,高级类型是可以越过这部分限制的(例如数组、对象等类型)。

因为在js中,高级类型是属于引用类型

例如const a = {}{}会指向一个内存地址,这段内存地址中的内容是可变的,但是地址是不变的,const只是限制内存地址,而不限制地址中储存的数据。

举个栗子

const persion = { name: 'xiaoming', age: 18 };
a.name = 'xiaoli'; // 可以修改
a.id = 19902834222; // 可以添加

persion = {}; // 报错 引用地址是不可以更改的