ES6之前变量声明
作者:米书林
参考文章:《菜鸟教程》、《 ECMAScript 6 入门》(阮一峰)
声明方式:
var a = 123;
特点:
-var变量可以重复声明,后面声明的变量会覆盖前面的变量
例如:
var a = 1;
var a = 2;
console.log(a); // 2
-无法限制变量的修改(没有常量的概念)
例如:
var PIE = 3.14;
PIE =3;
console.log(PIE); // 3
-没有块级作用域,即大括号内声明的变量大括号外也能使用
var str = "1233";
if(str){
var str1 = str;
}
console.log(str1); \\ 1233
-var声明的变量,先使用再声明,初始化值为:undefined
例如:
console.log(a1); // undefined
var a1=1;
console.log(a1); // 1
这是因为在JavaScript中,变量的声明会被提升。
我们可以把JavaScript中的变量和函数定义大概分成三个过程:
-- 创建
-- 初始化
-- 赋值
再使用var定义变量的时候创建和初始化被提升了
ES6变量声明
ES6引入了let和const来声明变量
let
let声明变量的方式
let a = 123;
let声明变量的特点:
-变量不能重复声明
例如:
let a = 1;
let a = 2;
console.log(a);
上面代码浏览器会抛出错误:
Uncaught SyntaxError: Identifier 'a' has already been declared
但需要注意的是,在for循环中变量似乎能重复声明
例如:
for (let i = 0; i < 10; i++) {
let s = "a";
console.log(s); //这里会输出10个a
}
什么原因呢?
其实每个循环每执行一次都有一个大括号{},{}内的代码属于一个代码块,let声明的变量属于块级作用域,所以看上去能重复声明。
-定义的变量可以被修改
例如:
let c = 1;
c++;
console.log(c); //2
-定义的变量是块级作用域的变量
例如:
{
let a = 1;
}
console.log(a);
上面代码浏览器会报错:
VM146:4 Uncaught ReferenceError: b is not defined at <anonymous>:4:13
- 必须先声明后使用
例如:
console.log(a);
let a = 12;
上面代码浏览器会报错:
VM1232:1 Uncaught ReferenceError: Cannot access 'sssa' before initialization at <anonymous>:1:13
这是因为let定义的变量处在一个自块顶部到初始化处理的暂时性死区
中,我们可以理解为我们在使用变量的时候let定义的变量只完成了创建,没有进行初始化
const
const声明变量的方式:
const s = 1;
const 声明常量的特点:
-常量不能重复声明,同let
-常量不能被修改
例如:
const p = 1;
p=2;
上面的代码浏览器会报错:
VM875:1 Uncaught TypeError: Assignment to constant variable. at <anonymous>:1:2
- 必须先声明后使用
总结:
ES6变量的声明加入的常量的声明和变量块级作用域的新特性。
以下文字是菜鸟教程对const定义常量原理的描述
const 如何做到变量在声明初始化之后不允许改变的?其实 const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动。此时,你可能已经想到,简单类型和复合类型保存值的方式是不同的。是的,对于简单类型(数值 number、字符串 string 、布尔值 boolean),值就保存在变量指向的那个内存地址,因此 const 声明的简单类型变量等同于常量。而复杂类型(对象 object,数组 array,函数 function),变量指向的内存地址其实是保存了一个指向实际数据的指针,所以 const 只能保证指针是固定的,至于指针指向的数据结构变不变就无法控制了,所以使用 const 声明复杂类型对象时要慎重。
网友评论