基本概念:
在js中,var,let,const是用于声明变量的关键字。
var
函数作用域:使用`var`声明的变量具有函数的作用域,意味着函数内部声明的`var`变量,函数外部是不可访问的。而在函数外部声明的变量,函数内部是可以访问的。
变量提升:`var`变量存在变量提升现象,即在变量声明之前访问该变量,不会导致错误,只会返回`undefined`。
function example () {
console.log(a) // undefined
var a = 88
}
example()
let
块级作用域:let声明的变量具有块级作用域,常见的块级作用域包括if语句块,for循环块,while循环块等。
不存在函数声明的提升:在let声明变量之前访问会导致错误。
if (true) {
let b = 20
}
console.log(b) // 错误,b没有定义
const
常量:const声明的是一个常量,其值在初始化之后,不可以被赋值
块级作用域:和let一样,具有块级作用域
对于对象和数据类型的const变量,其属性或元素是可以修改的
const obj = {name: 'wikiHong'}
obj.name = 'tuantuan' // 可以修改属性
const arr = [1, 2, 3]
arr.push(1108) // 可以修改数组的元素
总结: let 和 const 是为了改进var 的一些缺陷和提供更清晰的作用域和变量而产生的。
var的缺陷如下:
1.作用域问题:函数作用域导致变量的可见性和可访问性范围较宽泛,可能会造成意外被修改或覆盖的情况。
function (var i = 0; i < 6; i++) {
}
console.log(i) // 5, i在循环外仍可访问
2.变量提升:变量提升可能会导致逻辑混乱和难以理解的代码。在代码块中,变量可以在声明之前被使用,只是其值为undefined。
console.log(b)
var b = 33
3.重复声明:在一个作用域内,使用var可以重复声明同一个变量,不会报错,后面的声明会覆盖前面的声明。
var a = 6
var a = 8
以上缺陷导致代码的可读性和可维护性降低。
使用场景:
coonst:
1. 当你知道一些变量的值在初始化之后,不会改变,应当使用const。如配置项,常量值,固定的api端口等
const API_URL= 'https://example.com/api'
const PI = '3.1415926'
2. 对于引用类型(对象或数组),为了确保该变量始终指向同一个对象或数组时,但可以修改其属性或者元素,也用const。
const person = {name: 'pingbaobei'}
person.name = 'tuantuan'
let:
当一个变量在其作用域里面可能会修改时,使用let。如for循环体内,if条件语句内。还有咱们不确定变量值是否会被修改的时候,也有用let。
宗旨:优先使用const,只有在变量的值需要改变的时候,用let。
底层原理:
var,const,let底层原理涉及到变量的存储、作用域的管理以及内存分配等方面。