Let,const,var 定义的变量都有什么区别

let 和 var 的区别

1.var 存在变量提升,let 不存在
//let
console.log(c) //Uncaught ReferenceError: Cannot access 'c' before initialization
let c = 100      

//var
console.log(c) //underfined
var c =100

因为 let 不存在变量提升,所以上面 let 定义的变量会报错,报错的意思是我们想要打印 c 的值,必须先要初始化,然后再去使用它,必须遵循 先声明,后使用 的使用规则。
var 定义的变量结果为 underfined 代码相当于:

var c;//变量提升,但是值不能提升,所以是underfined
console.log(c) //underfined
c = 100
2.let在同一个作用域下不可以重复定义同一个变量值,而var可以
//let
let c = 100 
let c = 200  //报错 Uncaught SyntaxError: Unexpected identifier

//var
var c = 100
var c = 200 
console.log(c) //200 正常运行,会覆盖前一个值
3.有严格的作用域,var属于函数作用域,let属于块级作用域

ES5 中作用域有:全局作用域、函数作用域,没有块作用域的概念。
ES6 中新增了块级作用域,块作用域由{ }包括,if 语句和 for 语句里面的 { } 也属于块作用域。

//let
function fun(){
  let n = 10
  if(true){
    let n = 20 //与上面的 n 不属于同一个作用域,所以不受影响
  }
  console.log(n) //10
}
fun()

//var
function fun(){
  var n = 10
  if(true){
    var n = 20 //会覆盖上面的 n 的值
  }
  console.log(n)//20
}
fun()

const

1.const 声明的变量为只读的,一旦声明,常量的值就不能改变

const a =2; 
a=3;//错误  Uncaught TypeError: Assignment to constant variable.

2.const 声明的变量一定要初始化,不能只声明不赋值,

const a; // 错误  Uncaught SyntaxError: Missing initializer in const declaration
 //(const声明中缺少初始化程序)

3.const 声明的变量只在块级作用域内有效。

{
  const  a = 3
}
console.log(a) // Uncaught ReferenceError: a is not defined

4.但是用 const 声明的对象的属性是可以更改的,const 实质上保证的并不是变量的值不得改动,而是变量指向的 内存地址 的值不得改动,对于简单类型数据,值就保存在变量指向的内存地址中,相当于常量。而对于复合型的数据,变量指向的是内存地址保存的是一个指针。const 只能保证指针是不可以被更改,但指针指向的数据结构是可以被改变的。

//以下代码正常执行
const  obj = {}
obj.name="xiaoke" 
console.log(obj) // {name: "xiaoke"}

const  arr = []
arr.push("xiaoke")
console.log(arr) // ["xiaoke"]

努力学习中的前端菜菜,如果有错误的地方,欢迎指正...

你可能感兴趣的:(Let,const,var 定义的变量都有什么区别)