目录
一、介绍
二、var变量
三、let块级变量
四、const常量
一、介绍
在javascript的运行环境中,变量是非常重要的存在。通过它改变数据,从而影响文档视图。
变量如同他的名字一样,可以变化的量。
变量的作用 : 容器,用于数据存储
-
声明变量时需要注意的点 :
- 字母、数字、下划线 、$符号都可以作为变量名字的开头,数字不可以
- 不可以使用关键字,保留字作为变量名
- 变量名区分大小写
- 推荐使用驼峰命名法进行命名
- 可以使用中文作为变量名,但并不推荐使用
二、var变量
当声明一个变量时
var user = "张三";
console.log(user);
当声明多个变量时
var user,age,sex;
user = "张三";
age = 18;
sex = "男";
console.log(user); // 张三
console.log(age); // 18
console.log(sex); // 男
以上代码需要注意的是 :
如果在后面的变量赋值之前进行调用的话,按照js代码从上向下执行的规则,会因为只声明,而没有赋值而导致查找不到
var user;
console.log(user); // undefined
neme = "张三";
console.log(user); // 张三
当声明多个变量并赋值时
var user = "李四傻123abc" , age = 20 , sex = "男";
console.log(user,age,sex); // 李四傻123abc 20 男
三、let块级变量
在es6之前,javaScript声明变量的方式只有var一种,但是var声明的方式很单调,而且也存在着许多不规范、不合理的地方。那时的 js 想成为一门和 java、c、python 等同量级的编程语言,所以就有必要去解决这些问题。
于是乎,let块级变量和const常量便出现了。
-
let声明相较于var声明变量的区别
- 块级变量,在块级作用域中的表现不同
- 不允许变量提升
- 会出现系统函数暂时性死区(TDZ)
- 不可以重复声明
下面就通过代码来具体说明一下他们的区别在哪里
1、块级变量,在块级作用域中的表现不同
在说let块级作用之前,需要了解一个概念,就是 “ 块 ”。
块级作用域,即 {} (大括号)里面的内容。
在es6之前,js对于块级的概念是很模糊的,块级本身的概念是在块内定义的内容,即大括号里的内容,外部是并不能访问到的。但是你会发现,好像只有函数的大括号内部声明的变量,外部是访问不到,像for循环、if判断、switch判断等等这些里面声明的变量,外部是都能够可以访问到的,这样失去了块的概念。
function onceFun(){
var age = "史珍香";
console.log(age); // 史珍香
}
onceFun();
console.log(age); // 查找不到而报错
if(true){
var link = "厚涂";
}
console.log(link); // 厚涂
在let中,块级内使用let声明的变量,只能在当前块级内查找与调用
if(true){
let user = "Hello World";
}
console.log(user); // 报错
子块可以访问到父块let声明的变量,父块却不能访问子块的,同级块相互不可以访问
{
let user = "hello";
{
console.log(user); // hello
let year = "18";
}
console.log(year); // 报错
}
var 与 let 的差别在以后的使用中也是比较明显的
<ul>
<li>春</li>
<li>夏</li>
<li>秋</li>
<li>冬</li>
</ul>
<script>
let list = document.querySelectorAll("li");
for(var i=0;i<list.length;i++){ // 使用var声明 i 变量
list[i].onclick = function(){
console.log(i); // 这里无论点击哪里,打印结果都是for循环执行完成后i的结果4
}
}
</script>
以上代码无论点击哪个li,打印的结果都是 4。因为for循环中使用 var 声明的变量,是不会考虑块这个概念的,打印的都是整个for循环执行完成后的结果 i 。而如果换成 let 声明变量 i 的话,则每次循环都是在当前块内执行的的,所以当点击 li 时打印的都是当前块内 i 执行到的值
2、不允许变量提升
在js中遵循着代码从上向下执行的规则,但是会出现一些问题
console.log(user); // undefined
var user = "你好世界";
// 相当于
var user;
console.log(user); // undefined
user = "你好世界";
正常来说,变量是在下面定义的,在上面访问时是访问不到的,但是var声明却将变量名进行了提前声明,这是非常不合理的,不过let声明的话就直接性的解决了这个问题。
console.log(user); // 报错
let user = "你好世界";
3、会出现系统函数暂时性死区(TDZ)
console.log(typeof c); // 导致函数调用失败
let c = "hello";
4、不允许重复声明
var year = 18;
var year = 88;
console.log(year); // 88
let sex = "男";
let sex = "女";
console.log(sex); // 报错
如果使用var重复声明一个变量,那么造成的结果就是后者声明覆盖前者,但换成let的话,会直接报错。
需要注意的是,不同修饰符声明的相同变量,会直接报错。
四、const常量
相较于 var 和 let ,const常量就比较简单明了。
- const常量的特点:
- 不允许只声明不赋值
- 常量名推荐全部大写
- 不允许重复声明,也不允许声明后修改
顾名思义,常量是需要经常存在的量。所以,一旦声明了,就不要去动它,你也动不了它。
不允许只声明不赋值
const TNUYIE; // 报错
console.log(TNUYIE); // 报错
不允许重复声明,也不允许声明后修改
const LINK = "run";
const LINK= "play table tennis"; // 报错
console.log(LINK); // 报错
const LINK = "run";
LINK= "play table tennis"; // 报错
console.log(LINK); // 报错
希望能够有所帮助!