文档章节

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

 吴华惺
发布于 2017/04/17 09:42
字数 1437
阅读 18
收藏 0

这问题的重点在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也可以正常运作,只是没优化与这习惯不好而已。

eyesofkids2.5k 声望

答案对人有帮助,有参考价值2答案没帮助,是错误的答案,答非所问

1.let的优点是严格了变量声明,不会允许你在同一作用域下重复声明,同时也加入了块级作用域的概念,比如
if(**){这使用let就是一个作用域}for(){let a = *};每一次循环体中声明的a是相互独立的分属于不同的作用域;

2.const除了let的作用还多了:改变值或者指针的时候const会报错。比如

const a =1 ;
a=2;//改基本数据类型的值,这就会报错
const a = {b:1};
a = {};//改指针报错
a.b =2//不会报错

一般是能够确定声明的量不会发生变化才会使用const,可以保证你的量不被改掉。比如一个很长的配置项的字符串。

toBeTheLight4.7k 声望

答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问

let与const 是var的升级版 用var声明都不会出现问题,用let当然不会,使用const的好处是完全不会出现变量名冲突的问题,兼容性另说了就

怪我咯QAQ117 声望

答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问

简单的说就两点

  1. const 可以避免对不需要再赋值的变量进行赋值,比如把 if (a == b) {} 错写成 if (a = b) {} 这种情况就很容易发现

  2. const 已经申明了变量不会再赋值,解释器/编译器就可以对代码进行优化,提高性能。

本文转载自:

共有 人打赏支持
粉丝 0
博文 6
码字总数 0
作品 0
深圳
私信 提问
[译] 在JavaScript中何时使用var、let及const

原文链接:var vs let vs const in javascript 原文作者:Tyler McGinnis 译者:Alisa 在这篇文章中,你将学习两种在JavaScript(ES6)中创建变量的新方法,let和const。 在此过程中,我们将...

AlisaLi
01/12
0
0
5分钟掌握var,let和const异同

转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://dzone.com/articles/javascript-difference-between-var-let-and-const-...

葡萄城技术团队
2018/09/19
0
0
现代 JavaScript 的变量作用域

原文链接:Variable Scope in Modern JavaScript 译者:OFED 现代 JavaScript 的变量作用域 当与其他 JavaScript 开发人员交谈时,令我经常感到惊讶的是,有很多人不知道变量作用域是如何在 ...

涂鸦码龙
2018/08/17
0
0
var、 let 和const区别

最近在学习尤达上面的一些Es6语法,记录一下。 在 JavaScript 中声明变量的唯一方式是使用关键字 var。 本质上var在使用过程中有时候会带来一些问题,在执行任何 JavaScript 代码之前,所有变...

随心摆文
2018/08/22
0
0
ES6、ES7、ES8特性-学习提炼总结(一)

ES6 ECMAScript 6.0,简称ES6是JavaScript语言的下一代标准,在2015年6月发布。目的是让JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 Babel转码器 Babel是一个广泛使...

永远保留内心的简单和单纯
2018/11/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

容器服务

简介 容器服务提供高性能可伸缩的容器应用管理服务,支持用 Docker 和 Kubernetes 进行容器化应用的生命周期管理,提供多种应用发布方式和持续交付能力并支持微服务架构。 产品架构 容器服务...

狼王黄师傅
昨天
3
0
高性能应用缓存设计方案

为什么 不管是刻意或者偶尔看其他大神或者大师在讨论高性能架构时,自己都是认真的去看缓存是怎么用呢?认认真真的看完发现缓存这一块他们说的都是一个WebApp或者服务的缓存结构或者缓存实现...

呼呼南风
昨天
12
0
寻找一种易于理解的一致性算法(扩展版)

摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可...

Tiny熊
昨天
3
0
聊聊GarbageCollectionNotificationInfo

序 本文主要研究一下GarbageCollectionNotificationInfo CompositeData java.management/javax/management/openmbean/CompositeData.java public interface CompositeData { public Co......

go4it
昨天
3
0
阿里云ECS的1M带宽理解

本文就给大家科普下阿里云ECS的固定1M带宽的含义。 “下行带宽”和“上行带宽” 为了更好的理解,需要先给大家解释个词“下行带宽”和“上行带宽”: 下行带宽:粗略的解释就是下载数据的最大...

echojson
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部