js基础---var与let的区别以及const的使用
var与let的区别
在较旧的JavaScript,使用关键字var来声明变量,而不是let。var现在开发中一般不再使用它,只是我们可能再老版程序中看到它。let的出现为了解决var的一些问题。
var 声明存在以下三种问题:
- 可以先使用在声明 (不合理)
- var声明过的变量可以重复声明(不合理)
- 比如变量提升、全局变量、没有块级作用域等等
举例说明
变量提升
-
var
的情况 :javascriptconsole.log(a); // 输出undefined var a = 10;
解释:
var
声明的变量会被提升到函数或全局作用域的顶部,但此时变量的值还未被初始化,所以输出undefined
。 -
let
的情况 :javascriptconsole.log(b); // 报错,ReferenceError: b is not defined let b = 20;
解释:
let
声明的变量也会被提升,但不会被初始化,处于暂时性死区,所以访问它会报错。
重复声明
-
var
的情况 :javascriptvar c = 30; var c = 40; console.log(c); // 输出40
解释:
var
声明的变量可以重复声明,后面的声明会覆盖前面的声明。 -
let
的情况 :javascriptlet d = 50; let d = 60; // 报错,SyntaxError: Identifier 'd' has already been declared
解释:
let
声明的变量不能重复声明,否则会报错。
作用域
-
var
的情况 :javascriptif (true) { var e = 70; } console.log(e); // 输出70
解释:
var
声明的变量具有函数作用域或全局作用域,没有块级作用域,所以在if
块外部也可以访问到e
。 -
let
的情况 :javascriptif (true) { let f = 80; } console.log(f); // 报错,ReferenceError: f is not defined
解释:
let
声明的变量具有块级作用域,在if
块外部无法访问到f
。
全局变量
-
var
的情况 :javascriptfunction g() { var h = 90; } g(); console.log(h); // 报错,ReferenceError: h is not defined
javascriptvar i = 100; console.log(window.i); // 输出100
解释:在函数内部使用
var
声明的变量不会成为全局变量。在全局作用域中使用var
声明的变量会成为全局对象(如浏览器中的window
)的属性。 -
let
的情况 :javascriptfunction j() { let k = 110; } j(); console.log(k); // 报错,ReferenceError: k is not defined
javascriptlet l = 120; console.log(window.l); // 输出undefined
解释:
let
声明的变量不会成为全局对象的属性,无论是函数内部还是全局作用域。
var
确实存在一些问题,如变量提升可能导致的逻辑错误、重复声明带来的混淆以及缺乏块级作用域等。在现代JavaScript开发中,推荐使用let
来声明变量,以避免这些问题,提高代码的可读性和可维护性。
常量const
概念
使用const
声明的变量称为"常量"。常量与变量的主要区别在于,常量一旦被赋值后,其值就不能再被改变。这使得常量在程序中具有稳定性和可预测性,有助于减少因意外修改而导致的错误。
使用场景
当某个变量的值在程序的整个生命周期中都不会改变时,就可以使用const
来声明。例如,一些数学常数、配置参数、枚举值等都可以使用const
声明。使用const
声明常量可以明确地表达出该值不应当被修改的意图,同时也能够让阅读代码的人更容易理解代码的意图。
命名规范
常量的命名规范与变量基本一致,但有一些细微的差别。通常情况下,常量的名称使用大写字母,单词之间用下划线连接,以突出其常量的特性。例如:
javascript
const MAX_VALUE = 100;
const PI = 3.14159;
这种命名方式可以让开发者在阅读代码时,能够快速识别出这是一个常量,而不是一个普通变量。
常量使用示例
javascript
// 声明一个常量
const G = 9.8;
// 输出这个常量
console.log(G);
注意事项
-
不允许重新赋值:常量一旦被赋值后,就不能再被重新赋值。如果尝试对常量重新赋值,将会导致语法错误。例如:
javascriptconst G = 9.8; G = 9.9; // TypeError: Assignment to constant variable.
这一特性确保了常量的值在程序运行过程中始终保持不变。
-
声明时必须赋值(初始化) :使用
const
声明常量时,必须在声明的同时进行初始化赋值。不能先声明常量,然后再赋值。例如:javascriptconst G; // SyntaxError: Missing initializer in const declaration G = 9.8;
这是因为
const
声明的常量必须有一个明确的初始值,以保证其在整个作用域内的值都是确定的。
小技巧
对于不需要重新赋值的数据,使用const
是一个很好的选择。这不仅可以避免意外修改数据,还可以提高代码的可读性和可维护性。在实际开发中,养成使用const
的习惯,可以让你的代码更加健壮和清晰。
常量与对象属性
需要注意的是,虽然使用const
声明的对象本身不能被重新赋值,但对象的属性是可以被修改的。例如:
javascript
const obj = { name: 'Kimi', age: 20 };
obj.name = 'Moonshot'; // 合法操作,修改对象属性
console.log(obj); // 输出 { name: 'Moonshot', age: 20 }
这是因为const
只是保证了变量指向的对象引用不能改变,而不是对象内部的属性不能改变。如果需要保证对象的属性也不被修改,可以使用Object.freeze()
方法来冻结对象,使其成为不可变对象。例如:
javascript
const obj = { name: 'Kimi', age: 20 };
Object.freeze(obj);
obj.name = 'Moonshot'; // 不会改变对象属性,因为对象被冻结了
console.log(obj); // 输出 { name: 'Kimi', age: 20 }
通过这种方式,可以确保对象及其属性在整个程序中都不会被修改,从而实现更严格的数据保护。
总之,合理使用const
声明常量,可以在很大程度上提高代码的质量和稳定性。在编写JavaScript代码时,建议尽可能多地使用const
来声明那些不需要改变的值。