变量
ES的变量松散类型,变量可以保存任何类型的数据。ES6之前只用var来声明,ES6之后添加了const和let。
var 关键字
var message;//定义变量未初始化,变量保存为undefined
var message="hi";//变量初始化了,值为hi
message=100;//message的值被覆盖成100.合法,但不推荐
var 声明
- 使用var声明的变量会成为包含它函数的局部变量。去掉var声明即为全局变量
function test(){
var message="hi";//局部变量
}
test();
console.log(message);//报错
//message在函数内部创建,函数调用后变量被销毁,所以会报错
function test(){
var message="hi";//全局变量
}
test();
console.log(message);//"hi"
//去掉var之后message变成全局变量,可以在函数外部访问。
- var可以同时声明多个变量
var age = 10, name = 'zs', sex = 2;//同时初始化三个变量,中间用逗号隔开。
var 变量提升
- 使用var声明的变量会自动提升到函数作用域顶部。
function foo(){
console.log(age);
var age=26;
}
foo();//undefined
进行解析时,代码实际运行如下
function foo(){
var age;
console.log(age);
age=26;
}
foo();
let 声明
- let和var声明作用差不多。区别在于let声明的范围为块级作用域(用大括号包起来的作于域),var为函数作用域。
if(true){
var name='mata';
console.log(name);//mata
}
console.log(name);//mata
if(true){
let name='mata';
console.log(name);//mata
}
console.log(name);//错误 name 未定义
以上分别用var和let声明,let只在块级作用域中作用。
- let 不存在变量提升
console.log(a);// 错误 a is not definend
let a=10;
若用var声明会先变量提升,结果为undefined。用let声明会报错,因为不会变量提升。
- 暂时性死区
只要块级作用域内存在let命令,声明的变量就绑定这个区域了,不受外部影响。
if(true){
console.log(num);
let num=20; //报错
}
块级作用域中的num不会向上级查询,因为let在块级作用域中声明就绑定了这个区域绑定。使用num和外部没有关系。
const 声明
声明常量,常量就是值(内存地址)不可变化的量。
- 具有块级作用域
if (true) {
const a = 10;
}
console.log(a);// a is not defined
- 声明时必须赋值
const PI;//会报错
- 常量赋值后不能被修改。引用数据类型地址值不能被修改,但是可以修改里面内容。
const PI = 3.14;
PI = 100;//Assignment to constant variable.
const ary = [100, 200];
arr[0] = 'a';
arr[1] = 'b';
console.log(arr);//['a','b']
arr=["a",'b']//Assignment to constant variable.