javascript - js声明一个值不会改变的变量时,const相比let有什么优势?

查看:76
本文介绍了javascript - js声明一个值不会改变的变量时,const相比let有什么优势?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

最近在学习es6,看到很多人说声明常量时建议使用const而不是let, 想了解一下这个是什么原因, 不论变量的值是否发生变化都使用let会出现问题吗

解决方案

这问题的重点在const与let的相较,我先说明一下const。

在ES6之前,并没有"常量"这个东西,只有"变量"而已,也就是用var所声明的识别名称。在这份旧的Google JavaScript样式风格指引中,会告诉你要用全大写英文字符来作为常量定义,像是var MAX_HEIGHT = 10这种定义方式,甚至是使用非常特别的注释中的@const标记,有可能Google Chrome浏览器会在内部处理时认得它是个常量,但很少见到有人这样用,毕竟也只有对Chrome有用而已。对JavaScript来说,用var来声明就是个变量。

const针对是常量的声明,常量在一声明时就必定要赋给值,不然会产生错误。而对于常量在ES6的定义是:

不可再赋值(can't re-assignment)

赋值的意思就是用等号(=)作赋值运算,像下面这例子就是再赋值(或重覆赋值),所以会产生错误:

const a = 10
a = 20  // 错误TypeError: Assignment to constant variable. 

注: JS中的赋值运算符除了等号(=)外,还有多种等号(=)与其他运算符组合而成的赋值运算符,请参考MDN的Assignment_Operators

声明了一个常量,代表这个识别名称的参照(reference)是唯读的(read-only),并不代表这个参照赋到的值是不可改变的(immutable),"const"只是针对存取层级的限制(access limitations),并不是不可改变性(immutability)。

上面这段这是在讲什么?这是在讲如果你声明的常量是一个对象、函数(也是对象)或数组类型,像这种参照类型的值,里面的值是可以再作改变的。像下面的例子都是合法的使用:

const a = []
a[0] = 1

const b = {}
b.foo = 123

所以对于对象、数组、函数来说,使用const常量来声明就可以,除非你有需要再对这个数组或对象的参照重新赋值。

虽然"const"是来自英文中的"constant"(常量)字词的缩写,但在ES6的标准文档中,经常会在规则中,用对"variable"(变量)这个字词,一并说明这两个共同的特性,上面的错误消息中就可以看到"constant variable"(固定的变量/不会变的变量),这意思较为接近,也就是把它当成是一种拥有固定值特性的变量来看待。ES6中对"const"与"let"仍然有区分,在区分中的说明章节,是对于词法环境绑定(就块级作用域),是否为可改变的(lexEnvRec.CreateMutableBinding)或不可改变的(lexEnvRec.CreateImmutableBinding)两种情况。


回答原先的问题:

看到很多人说声明常量时建议使用const而不是let, 想了解一下这个是什么原因, 不论变量的值是否发生变化都使用let会出现问题吗

主要几个原因:

  1. const可以用在对象、数组与函数上,常量一声明时就要赋值,犯错的机会会减少很多。

  2. JS引擎也可以作优化。虽然JS语言上并没有感受差异,但实际上引擎里有区分出常量与变量,而最重要的是因为JS语言是弱(动态)类型的脚本语言,常量一声明就赋值,代表它立即决定好是什么类型与值,自然效能比变量好得多。

所以大概9成的情况都是用const,优先使用const是推荐的撰写风格,只有像for回圈语句,或一些需要再赋值的情况才会用到let。当然,你要全部用let也可以正常运作,只是没优化与这习惯不好而已。

这篇关于javascript - js声明一个值不会改变的变量时,const相比let有什么优势?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆