
使用var在块{}中声明变量会重新声明块外的同名变量。
var x = 1;
{
var x = 2;
}
console.log(x);//此处的x为2
在for循环中使用var定义变量,会导致其他位置同名变量值的改变。
var x = 1;
for(var x = 0;x < 5; x++){
}
console.log(x);//此处的x为5
使用var在函数外声明变量,该变量为全局变量;使用var在函数内声明变量,该变量为局部变量。
var x = 1;//全局变量
function En(){
var x = 3;//局部变量
}
En();//执行函数
console.log(x);//此处的x为1,函数内的代码在函数执行时创建,在函数结束执行时自动销毁。
var关键字声明的全局作用域变量对于HTML来说是属于window对象。
var name = "En";
console.log(window.name);//可以使用window.name访问,相当于var定义的全局作用域变量是HTML的window对象的属性。
var在相同或不同作用域都可以重新声明赋值。
var x = 1;
var x = 2;
console.log(x);//x=2
{
var x = 3;
}
console.log(x);//x=3
相同的作用域中,var不能重新声明被let声明过的变量。
let x = 1;
var x = 2;//Uncaught SyntaxError: Identifier 'x' has already been declared
{
let y = 3;
var y = 4;//Uncaught SyntaxError: Identifier 'y' has already been declared
}
使用var声明的变量可以在声明之前使用。
x = 3;
console.log(x); //x=3
var x;
let
let声明的代码只能在它所在的代码块有效,即let声明的变量具有块作用域的特性。
var x = 1;
{
let x = 3;
}
console.log(x);//此处的x为1
在for循环中使用let定义变量,不会导致其他位置同名变量值的改变。
var x = 1;
for(let x = 0;x < 5; x++){
}
console.log(x);//此处的x为1
使用let在函数外声明变量,该变量为全局变量;使用let在函数内声明变量,该变量为局部变量。
let x = 1;//全局变量
function En(){
let x = 2;//局部变量
}
console.log(x);//此处的x为1
在相同作用域中,let不能重新声明被var或let声明过的变量。
var x = 1;
let x = 2;//Uncaught SyntaxError: Identifier 'x' has already been declared
{
var i = 3;
let i = 4;//Uncaught SyntaxError: Identifier 'i' has already been declared
}
let y = 5;
let y = 6;//Uncaught SyntaxError: Identifier 'y' has already been declared
{
let j = 7;
let j = 8;//Uncaught SyntaxError: Identifier 'j' has already been declared
}
在不同作用域中,let可以重新声明被var或let声明过的变量。
var x = 1;
{
let x = 2;
}
console.log(x);//x=1
let y = 3;
{
let y = 4;
}
console.log(y);//y=3
const
const用于声明常量,声明时必须初始化,初始化之后的值不可修改。
const x = 1;
x = 3;//Uncaught TypeError: Assignment to constant variable.
x = 3 + x;//Uncaught TypeError: Assignment to constant variable.
const y;//Uncaught SyntaxError: Missing initializer in const declaration
const定义的变量具有块级作用域的性质。
const x = 1;
{
const x = 2;
}
console.log(x);//x=1
const定义的“常量”并非真正的常量。
const cat = {name:"Lucy", age:"2", gender:"girl"};
//可以修改对象内的属性
cat.name = "Marry";
//可以添加属性
cat.color = "blue";
console.log(cat);//{name: 'Marry', age: '2', gender: 'girl', color: 'blue'}
//不可以重新赋值对象
cat = {name:"Jury", age:"3", gender:"girl"};//Uncaught TypeError: Assignment to constant variable.
const color = ["pink", "blue", "yellow"];
//可以修改数组内的值
color[0] = "purple";
//可以往数组内添加新值
color.push("red");
console.log(color);//['purple', 'blue', 'yellow', 'red']
//不可以重新赋值数组
color = [];//Uncaught TypeError: Assignment to constant variable.
总结
let和const都声明的变量具有块作用域的性质。在相同作用域,let和const所声明的值无法被重新声明。
拓展
使用const声明对象,可以 *** 作对象内的属性;使用const声明数组,可以 *** 作数组内的值。什么时候不可 *** 作呢?
const cat = {name:"Lucy", age:"2"};
Object.freeze(cat);
cat.name = "Marry";
console.log(cat);//{name: 'Lucy', age: '2'}
//使用freeze对对象进行冻结,不能再对其进行 *** 作(增删改查)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)