- 命名规则:
JS中的变量是弱类型,可以保存所有类型的数据,变量没有类型而值有类型。 变量名以字母、$、_ 开始,后跟字母、数字、_.。
var web = "goodnight";
let $ = "csdn";
var _dou = "you" ;
变量名不能是JS语言关键字,比如true、if、class等。
- 变量声明与赋值:
var test;
test = "lxx";
// 先声明后赋值
var test = "lxx";
// 声明与赋值的结合
var web = "good",
name="bad",
url="https://find.com";
console.log(url);
// 可以同时声明多个变量
var web = url = name = "good";
console.log(web);
console.log(url);
console.log(name);
变量可以更换不同类型的数据。
var web = "lxx";
console.log(typeof web); //string
web = 87;
console.log(typeof web); //number
web = {};
console.log(typeof web); //object
// 变量可以更换不同类型的数据。
- 变量提升:
运行代码时,解析器会先解析代码,把对变量的声明提升到最前面,这就叫做变量的提升。
例如:下面代码在解析时发现第三行代码 while不能做为变量名,没有到执行环节就出现错误,并不会在控制台输出第二行代码的结果:(体会一下解析过程)
var a = "lxx";
console.log(a);
let while = "bhh";//此行会报错
变量提升:
console.log(a);
var a = 1;
console.log(a);
//执行结果会在控制台输出 undefined和1
//以上代码在解析时执行过程:(把声明的语句会提前,赋值的语句位置不变)
var a;
console.log(a);//undefined
a = 1;
console.log(a);//1
控制台输出:
第二个例子:(执行hd函数时,if内的var也会提升,所以控制台还是会输出undefined,在去掉if部分输出的结果就会不同)
var dou = "fff";
function hd() {
if (false) {
var dou = "xxxxxxxxxx";
}
console.log(dou);
}
hd();
结果:
-
TDZ:
TDZ称为暂时性死区。指变量在作用域内已经存在,但必须在let/const声明后才可以使用。TDZ可以让程序保持先声明后使用的习惯,让程序更稳定。
在上面的变量提升中,var声明的变量出现先使用后声明赋值时不会报错,变量提升后只会出现undefined,而使用let/const声明的变量在声明前存在临时性死区使用会发生错误:
console.log(dou);
let dou = "xxxxxxxxxxx";
运行结果出错:
在run函数作用域中产生TDZ,不允许变量在未声明前使用。
dou = "xxxxxxx";
function run() {
console.log(dou);
let dou = "hhhhhhhhhhhh";
}
run();
参数也存在这样的问题:
下面代码b没有声明赋值不允许直接使用:
function dd(a = b, b = 3) {}
dd(); //Cannot access 'b' before initialization
a已经赋值,所以b可以使用a变量,下面代码访问正常:
function dd(a = 2, b = a) {}
dd();
- 变量要先声明后使用
- 建议使用let/const 而少使用var
学习资源:
学习网址(后盾人):https://www.houdunren.com/
b站视频:https://www.bilibili.com/video/av80536021