var、let、const三者之间的区别和使用

var、let、const 都是用于声明变量的关键字,可以通过作用域、可变性、变量提升几个方面进行区分;

1,作用域

1)var的属于函数作用域,只能在函数内使用。若在函数外部声明变量,会变为全局变量;

function varfun(){
  //函数内声明的变量,只能在函数内部调用;
  var a1 = '11111' 
  if(true) { //属于块级作用域
      console.log(a1)   // 可以访问数据;
  }
}
varfun(); // 11111
console.log(a1); //报错 Uncaught ReferenceError: a1 is not defined

2)let 、const 拥有块级作用域,块级作用域是指用{}包裹的代码块,像,if、for、while等,在块级作用域声明的变量,只可以在块内访问。

function example() {
  if(true) {
    let y = 1;
    const z = 2;
    console.log(y); // 1
    console.log(z); // 2
  }
  console.log(y); // ReferenceError: y is not defined
  console.log(z); // ReferenceError: z is not defined
}
example()
2,变量提升:

1)var:存在变量提升的现象,变量提升表示在变量声明之前就可以访问变量,但变量值是undefind。

2)let、const不存在变量提升,在变量声明之前访问let或者const变量,会引发ReferenceError 错误。这种现象也被称作暂时性死区。

function example() {
  console.log(a); // undefined
  console.log(b); // ReferenceError: Cannot access 'b' before initialization
  console.log(c); // ReferenceError: Cannot access 'c' before initialization
  var a = '1'
  let b = '2'
  const c = '3'
}
example(); 
3,可变性

1)var和let 声明的变量可以重新赋值

function example() {
  var a = 1; 
  let b = 2;
  a = 4
  b = 5; 
  console.log(a, b); // 4 5
}
example(); 

2)const 一旦声明,必须初始化,并且赋值后不可以重新赋值。若const声明的是对象或者数组,对象的属性或者数组的元素是可以修改的。

function example() {
  const c = 3;
  const arr = [1, 2, 3];
  const obj = { name: 'John' };
  c = 4; //报错: TypeError: Assignment to constant variable.
  arr[1] = 4; // OK
  arr.push(5); // OK
  arr = [1, 8, 6]; //报错: TypeError: Assignment to constant variable.
  obj.name = 'Doe'; // OK
  obj = { name: 'Doe' }; //报错: TypeError: Assignment to constant variable.
  console.log(arr); // [1, 4, 3]
  console.log(obj); // { name: 'Doe' }
}
example(); 
4,重复声明:

1)var可以重复声明

2)let、const不可以重复声明

function example() {
//  var可以重复声明
  var a = 1;
  var a = 2;
  console.log(a); // 2
//  let不可以重复声明
  let b = 1;
  // let b = 2; // SyntaxError: Identifier 'b' has already been declared
  console.log(b); // 1
//  const不可以重复声明
  const c = 1;
  // const c = 2; // SyntaxError: Identifier 'c' has already been declared
  console.log(c); // 1
  if(true) {
    var a = 3; // 这里的a是example函数作用域
    let b = 4; // 这里的b是块级作用域
    const c = 5; // 这里的c是块级作用域
    console.log(a); // 3  
    console.log(b); // 4
    console.log(c); // 5
  }
}
example(); 
5,使用场景

1)var:鉴于其函数作用域和变量提升的特点,容易引发错误,所以现在javascript开发中,var使用频率较低,一般在旧代码或者需要兼容老版本浏览器时使用。

2)let:当需要再块级作用域中声明变量,并且后续需要重新赋值时,建议使用let。例如:for循环

3)const:变量赋值后不需要再改变时,应该使用const,可以增强代码的可读性或者可维护性;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值