一般用 var 或者 let 声明的变量,都是弱类型,即所声明的变量的类型取决于接受值的类型。
var 与 let 声明变量时的区别:
var 能够在当前作用域下重复声明,但是之前的值就会丢失;
let 声明的变量在当前的作用域下不能重复声明;
且两者解析机制不一样,预解析时 var 声明的变量会进行变量提升,而
let 声明的变量在预解析时不进行变量提升。
let 声明变量有四大主要特性:存在块级作用域,没有变量提升,暂时性死区,不允许重复声明。
块级作用域:所谓块,就是在 {} 内部的代码区域,代码块内部与外部不会有命名冲突,然后代码块内部声明的 let 变量也只能在代码块块内使用,代码块外部访问不到。
变量提升:就是先将变量的声明提升到当前作用域的最前面,然后在按照顺序执行代码; let 声明的变量没有变量提升,所以也就不会提前 let 变量的声明。
暂时性死区:在代码块内,使用let和const命令声明变量之前,该变量都是不可用的,语法上被称为暂时性死区。(可见也是因为 let 和 const 变量没有变量提升的机制所导致的)。
不允许重复声明:也就是字面意思啦,就是在一个代码块内只允许声明一次,重复声明会报错。但 let 声明的变量可以重复赋值;而 const 声明的为常量,在一个代码块内只能声明一次且只能赋值一次。
验证 var 和 let 声明变量的特性的
代码示例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>测试 var 和 let 的区别</title>
</head>
<body>
<script>
// var 具有变量提升
console.log('可以提前访问 a :'+a); // a 的结果是:undefined (因为将变量声明提前了,赋值还在原来的代码位置)
// var 可以 重复声明 和 赋值
var a = 10;
var a = 20;
console.log('a 的值为:'+a); // a 的结果是:20 (可见会以当前作用域下的最后一次赋值为准)
// let 不存在变量提升
//console.log('不可以提前访问 b :'+b); // 这里会报错:因为let没有变量提升,所以访问b的是未声明的变量,所以就报错了。
// let 可以重复 赋值,并存在块级作用域
let b = 10;
{
let b = 30; // 如果将本行注释掉,下一行将输出 b 的结果为 10;因为会一级一级往外寻找是否有变量 b
console.log('块内输出 b 的值为:'+b); // b 的结果为:30 (没有 {} 包裹第二次声明就会报错,因为let不允许重复声明且存在块级作用域)
}
console.log('代码块外输出 b 的值为'+b); // 这里输出 b 的值为:10;可见代码块外访问不到代码块内的值
</script>
</body>
</html>
获取变量类型的方法:
alert(
typeof num)即可直接弹出变量
num
的类型。
typeof num 返回的就是变量 num 的类型。