变量与常量的区别
常量
特性:常量保存的是不可以变化的量,在js中是只能使用,不能修改
声明与赋值:在声明常量时,必须赋值,不能重复赋值
变量
命名规则:
- 变量名称可以由字母、数字、下划线(_)、美元符号($)组成,其中不能以数字作为开头,不能使用JS中的关键字。不推荐使用中文
- 驼峰命名法、下划线命名法
赋值:
- 变量只是声明,但是没有赋值,则保存的值为undefined
- 变量可以被多次赋值,且赋不同类型的值
声明:可以一次性声明多个变量
块级作用域
- ES6中新增了块级作用域。块作用域由 { } 包括,if语句和 for语句里面的{ }也属于块作用域
var
变量提升机制
- 无论在全局作用域中或还是在局部作用域中,使用
var
关键字声明的变量,都会被提升到该作用域的最顶部 - 通过var定义(声明)的变量,在定义语句之前就可以访问到
console.log(a); //underfunded
var a = 1;
//因为有变量提升的缘故,上述代码执行顺序为:
var a;
console.log(a);
a = 1;
没有块级作用域
for(var = 1; i < 6 ; i++){
console.log('内循内'+ i);
}
console.log('循环外' + i);
let
作用:声明一个块级作用域的本地变量,设置初始值
语法:
//声明变量
let x;
//声明并设置初始值
let y = 1;
//重新赋值
y = "6"
console.log(y);//6
特点
特点1:在相同作用域内,不允许重复声明同一个变量
<script>
function fnc() {
let a = 10;
let a = 1; //Identifier 'a' has already been declared
}
</script>
特点2:有块级作用域
{
let a = 1;
console.log(a); //1
}
console.log(a); //undefined
特点3:不会发生变量提升
console.log(b);//Cannot access 'b' before initialization(无法在初始化之前访问变量)
let b = 1;
const
语法:必须在声明的同时设置初始值
const c = 6;
特点
特点1:基本类型数据无法重新赋值
const d = 1;
console.log(d); //1
d = 2;
console.log(d); //Assignment to constant variable.(赋值了变量给常量)
特点2:必须设置初始值(只声明不赋值就会报错)
特点3:有块级作用域
if(true){
const e = 1;
console.log(e); //5
}
console.log(e); //e is not defined
特点4:不会变量提升(其声明的常量也不能提升,同样存在暂时性死区,只能在声明的位置后面使用)
if(true){
console.log(f); //Cannot access 'f' before initialization
const f = 1
}
特点5:不能重复声明
特点6:变量指向的内存地址所保存的数据不可改动
特点7:简单类型的数据(数值、字符串、布尔值),值保存在变量指向的地址,因此等同于常量;引用类型(对象、数组...),可以更改内容
特点8:复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的知识一个指向时间数据的指针,且const只能保证这个给指针是固定的(即总是指向另一个固定的地址)