目录
语法:var varname1 [= value1] [, varname2 [= value2] ... [, varnameN [= valueN]]];
语法:let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]];
语法:const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
1.var
语法:var varname1 [= value1] [, varname2 [= value2] ... [, varnameN [= valueN]]];
varnameN
变量名。变量名可以定义为任何合法标识符。
valueN
可选
变量的初始化值。该值可以是任何合法的表达式。默认值为 undefined
。
var
语句 用于声明一个函数范围或全局范围的变量,并可将其初始化为一个值(可选)。
下面的代码块中,a输出的是 2,b输出的是 ‘111’。也就是说 var 创建变量时,会将重复命名的变量给覆盖了,同时可以随意的给之前声明好的变量赋值。
var a = 1
var a = 2
console.log(a)
var b = 3
b = '111'
console.log(b)
2.let
语法:let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]];
var1
, var2
, …, varN
变量名。必须是合法的标识符。
value1
, value2
, …, valueN
变量的初始值。可以是任意合法的表达式。
let 语句声明一个块级作用域的本地变量,并且可选的将其初始化为一个值。
下面的代码块中,变量a在第二次声明的时候就报错,打印的时候也是报错的,let声明的变量不可以被重复声明,但是可以重新赋值,也就是下面的输出的b为“33”。
let a = 1
let a = 2
console.log(a)
let b = "2"
b = "33"
console.log(b)
3.const
语法:const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
nameN
常量名称,可以是任意合法的标识符。
valueN
常量值,可以是任意合法的表达式。
常量是块级范围的,非常类似用 let 语句定义的变量。但常量的值是无法(通过重新赋值)改变的,也不能被重新声明。
下面的代码块中,a的情况和let声明时一样,不能重复声明。b的话也报错,不能重新被赋值。
const a = 1
const a = 2
console.log(a)
const b = '11'
b = '22'
console.log(b)
从上面的代码中我们可以看到一些区别。let 和 const 是es6推出的新的变量声明方式,将变量的类型值都有了新的确定。var在最外层声明变量时,作用域是全局的,同时变量也会提升,也就是说我可以在声明变量钱去使用它,系统会对其进行初始化,所以得到的值是undefined。但是var有一个缺点,同一变量可以被多次声明,这会照成程序中某些数据混乱。
这就有了let,现在let也成为了声明变量的首选,一个变量名只能声明一次但是同时又可以多次赋值。这样既保留了某个变量的唯一,又可做到对变量值的重新修改。同时,如果我们let是在{}里面声明的变量,那么这个变量就是块级变量,只能在{}里面使用。let同样可以提升变量,但是系统不会对其进行初始化,所以我们得到的值为Reference Error。
最后是const,和let有一点像,他在{}声明的变量只能在{}里面使用。const声明的变量不能被修改且不能重新声明,这就意味着const声明的值会保持不变。虽然我们不能更新const对象,但是可以更新const对象的属性。这样我们更改了greeting.message的值,而没有报错。
const greeting = {
message: 'say Hi',
times: 4,
};
//同样不能像下面这样做:
const greeting = {
words: 'Hello',
number: 'five',
}; // error: Assignment to constant variable.
//但我们可以这样做:
greeting.message = 'say Hello instead';