JavaScript 变量与常量
本文最后更新于:2024年3月18日 凌晨
JavaScript 变量与常量
变量
- var和let用于声明一个或多个变量。
- 与代数一样,JavaScript 变量可用于存放值(比如 x=5)和表达式(比如 z=x+y)
- 变量必须以字母开头。
- 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做)
- 变量名称对大小写敏感(y 和 Y 是不同的变量)
变量的作用域
块级作用域(Block Scope)
- 使用 var 关键字声明的变量不具备块级作用域的特性,它在
{}
外依然能被访问到。
- 在 ES6 之前,是没有块级作用域的概念的。
- ES6 可以使用 let 关键字来实现块级作用域。
- let 声明的变量只在 let 命令所在的代码块
{}
内有效,在{}
之外不能访问。
循环作用域
1 2 3 4 5
| var i = 5; for (var i = 0; i < 10; i++) { }
|
1 2 3 4 5
| let i = 5; for (let i = 0; i < 10; i++) { }
|
- 在第一个实例中,使用了 var 关键字,它声明的变量是全局的,包括循环体内与循环体外。
- 在第二个实例中,使用 let 关键字,它声明的变量作用域只在循环体内,循环体外的变量不受影响。
函数作用域
- 在函数体内使用 var 和 let 关键字声明的变量有点类似。
- 它们的作用域都是 局部的:
1 2 3 4 5 6 7 8 9
| function myFunction() { var carName = "Volvo"; }
function myFunction() { let carName = "Volvo"; }
|
全局作用域
- 在函数体外或代码块外使用 var 和 let 关键字声明的变量也有点类似。
- 它们的作用域都是 全局的:
1 2 3 4 5
| var x = 2;
let x = 2;
|
- 注意:变量声明时如果不使用 var 关键字,那么它就是一个全局变量,即便它在函数内定义。
HTML 代码中使用全局变量
- 在 JavaScript 中,全局作用域是针对 JavaScript 环境。
- 在 HTML 中,全局作用域是针对 window 对象。
- 使用 var 关键字声明的全局作用域变量属于 window 对象:
- 使用 let 关键字声明的全局作用域变量不属于 window 对象:
重新声明变量
- 使用 var 关键字声明的变量在任何地方都可以修改:
- 在块中重新声明变量也会重新声明块外的变量:
1 2 3 4 5 6 7 8 9
| var x = 2;
var x = 10;
{ var x = 2; }
|
- let 关键字在不同作用域,或不同块级作用域中可以重新声明赋值。
- 但是在相同的作用域或块级作用域中,不可以重新声明赋值。
1 2 3 4 5 6 7
| let x = 2; let x = 3;
{ let x = 4; let x = 5; }
|
- 在相同的作用域或块级作用域中,不能使用 let 关键字来重置 var 关键字声明的变量:
1 2 3 4 5 6
| var x = 2; let x = 3; { var x = 4; let x = 5 }
|
- 在相同的作用域或块级作用域中,不能使用 var 关键字来重置 let 关键字声明的变量:
1 2 3 4 5 6
| let x = 2; var x = 3; { let x = 4; var x = 5; }
|
向未声明的 JavaScript 变量分配值
- 如果您把值赋给尚未声明的变量,该变量将被自动作为 window 的一个属性。
- 这条语句:
- 将声明 window 的一个属性 carname
- 非严格模式下给未声明变量赋值创建的全局变量,是全局对象的可配置属性,可以删除。
1 2 3 4 5 6 7 8 9 10 11 12 13
| var var1 = 1; var2 = 2;
console.log(this.var1); console.log(window.var1); console.log(window.var2);
delete var1; console.log(var1);
delete var2; console.log(delete var2); console.log(var2);
|
变量提升
- 函数及变量的声明都将被提升到函数的最顶部。
- 变量可以在使用后声明,也就是变量可以先使用再声明。
1 2 3 4 5 6
| x = 5;
elem = document.getElementById("demo"); elem.innerHTML = x;
var x;
|
- 要理解以上实例就需要理解
hoisting
(变量提升)
- 变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部。
不提升变量的特殊情况
- JavaScript 只有声明的变量会提升,初始化的不会。
1 2 3 4 5 6
| var x = 5;
elem = document.getElementById("demo"); elem.innerHTML = x + " " + y;
var y = 7;
|
- let 关键字定义的变量则不可以在使用后声明,也就是变量需要先声明再使用。
常量
- const 用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改:
1 2 3
| const PI = 3.141592653589793; PI = 3.14; PI = PI + 10;
|
const
定义常量与使用let
定义的变量相似:
- 二者都是块级作用域。
- 都不能和它所在作用域内的其他变量或函数拥有相同的名称。
- 两者还有以下两点区别:
const
声明的常量必须初始化,而let
声明的变量不用。
const
定义常量的值不能通过再赋值修改,也不能再次声明,而 let 定义的变量值可以修改。
1 2 3 4 5 6 7
| var x = 10;
{ const x = 2; }
|
1 2 3 4 5 6
| const PI; PI = 3.14159265359;
const PI = 3.14159265359;
|
- const 的本质: const 定义的变量并非常量,并非不可变,它定义了一个常量引用一个值。
- 使用 const 定义的对象或者数组,其实是可变的,下面的代码并不会报错:
1 2 3 4 5 6 7 8
| const car = {type:"Fiat", model:"500", color:"white"};
car.color = "red";
car.owner = "Johnson";
|
1 2
| const car = {type:"Fiat", model:"500", color:"white"}; car = {type:"Volvo", model:"EX60", color:"red"};
|
1 2 3 4 5 6 7 8
| const cars = ["Saab", "Volvo", "BMW"];
cars[0] = "Toyota";
cars.push("Audi");
|
1 2
| const cars = ["Saab", "Volvo", "BMW"]; cars = ["Toyota", "Volvo", "Audi"];
|