变量
变量:用关键字 var
来定义变量,用 =
给变量赋值,对大小写敏感(变量名是大小写英文、数字、$
和_
的组合)
定义方法和 C 一样
var x, length; //"声明"变量(未初始化,值为 undefined)
x = 5; length = 6;
var carname = "Volvo", age = 30, //"声明"变量同时初始化
year = 2024; //"声明"可以跨行
var x, y, z = 1; //只对z初始化,z=1, y=undefined, x=5(重新声明变量,该变量的值不会丢失)
JavaScript 中,var 关键字定义的变量可以先使用再声明,而 。
作用域(var vs let)
- 采用直接赋值得到的变量默认为全局变量,在函数外也可以访问。(在不同文件间也能访问,因此会产生大量冲突)
function myfun(var a int, b int) {
x = 5;
}
// 这里可以使用 x 变量
- 使用
var
关键字声明的变量在函数外无法访问(局部变量),但是不具备块级作用域的特性,即它在{}
外依然能被访问到:
{
var x = 2;
}
// 这里可以使用 x 变量
- 而 ES6 引入了
let
关键字,let 声明的变量只在 let 命令所在的代码块 {} 内有效:
var x = 10;
{
var x = 2;
// 这里输出 x 为 2
}
// 这里输出 x 为 2
var x = 10;
{
let x = 2;
// 这里输出 x 为 2
}
// 这里输出 x 为 10
//应用于循环:
var i = 5;
for (let i = 0; i < 10; i++) {
//……
}
// 这里输出 i 为 5
使用 var 关键字声明的全局作用域变量属于 window 对象
使用 let 关键字声明的全局作用域变量不属于 window 对象:
var carName = "Volvo";
// 可以使用 window.carName 访问变量
let carName = "Volvo";
// 不能使用 window.carName 访问变量
变量重置(重复声明)
在相同的作用域或块级作用域中:
- 不能使用 let 关键字来重置 var 关键字声明的变量
- 不能使用 let 关键字来重置 let 关键字声明的变量
- 不能使用 var 关键字来重置 let 关键字声明的变量
var x = 2; // 合法
let x = 3; // 不合法
{
var x = 4; // 合法
let x = 5 // 不合法
}
let x = 2; // 合法
let x = 3; // 不合法
{
let x = 4; // 合法
let x = 5; // 不合法
}
let x = 2; // 合法
var x = 3; // 不合法
{
let x = 4; // 合法
var x = 5; // 不合法
}
let 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的:
let x = 2; // 合法
{
let x = 3; // 合法
}
{
let x = 4; // 合法
}
变量提升(先使用后声明)
var
关键字定义的变量可以在使用后声明let、const
关键字定义的变量则不可以在使用后声明,也就是变量需要先声明再使用
const
const 用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改:
const PI = 3.141592653589793;
PI = 3.14; // 报错
const S; // 报错
const
定义常量与使用let
定义的变量相似:
- 二者都是块级作用域
- 都不能和它所在作用域内的其他变量或函数拥有相同的名称
并非完全不能修改:const
的本质是定义了一个引用一个值的常量引用。故使用 const 定义的对象或者数组,其实是可变的:
const car = {type:"Fiat", model:"500", color:"white"}; // 创建常量对象
car.color = "red"; // 修改属性:
car.owner = "Johnson"; // 添加属性
car = {type:"Volvo", model:"EX60", color:"red"}; // 错误!
涉及 const 的变量重置
在相同的作用域或块级作用域中,不能使用 const 关键字来重置 var let const 关键字声明的变量;
在不同作用域或不同块级作用域中,const 是可以重新声明赋值的