From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- .../reference/statements/const/index.html | 152 +++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 files/zh-cn/web/javascript/reference/statements/const/index.html (limited to 'files/zh-cn/web/javascript/reference/statements/const/index.html') diff --git a/files/zh-cn/web/javascript/reference/statements/const/index.html b/files/zh-cn/web/javascript/reference/statements/const/index.html new file mode 100644 index 0000000000..75a1676299 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/statements/const/index.html @@ -0,0 +1,152 @@ +--- +title: const +slug: Web/JavaScript/Reference/Statements/const +tags: + - ECMAScript 2015 + - JavaScript + - Reference + - Statement + - constants +translation_of: Web/JavaScript/Reference/Statements/const +--- +
{{jsSidebar("Statements")}}
+ +

常量是块级范围的,非常类似用 let 语句定义的变量。但常量的值是无法(通过重新赋值)改变的,也不能被重新声明。

+ +
{{EmbedInteractiveExample("pages/js/statement-const.html")}}
+ + + +

语法

+ +
const name1 = value1 [, name2 = value2 [, ... [, nameN = valueN]]];
+ +
+
nameN
+
常量名称,可以是任意合法的{{Glossary("identifier","标识符")}}。
+
valueN
+
常量值,可以是任意合法的表达式
+
+ +

描述

+ +

此声明创建一个常量,其作用域可以是全局或本地声明的块。 与var变量不同,全局常量不会变为 window 对象的属性。需要一个常数的初始化器;也就是说,您必须在声明的同一语句中指定它的值(这是有道理的,因为以后不能更改)。

+ +

const声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。例如,在引用内容是对象的情况下,这意味着可以改变对象的内容(例如,其参数)。

+ +

关于“暂存死区”的所有讨论都适用于letconst

+ +

一个常量不能和它所在作用域内的其他变量或函数拥有相同的名称。

+ +

示例

+ +

const 基本用法

+ +

常量在声明的时候可以使用大小写,但通常情况下全部用大写字母。

+ +
// 定义常量MY_FAV并赋值7
+const MY_FAV = 7;
+
+// 报错 - Uncaught TypeError: Assignment to constant variable.
+MY_FAV = 20;
+
+// MY_FAV is 7
+console.log('my favorite number is: ' + MY_FAV);
+
+// 尝试重新声明会报错
+// Uncaught SyntaxError: Identifier 'MY_FAV' has already been declared
+const MY_FAV = 20;
+
+// MY_FAV 保留给上面的常量,这个操作会失败
+var MY_FAV = 20;
+
+// 也会报错
+let MY_FAV = 20;
+
+
+ +

块作用域

+ +

注意块作用域的性质很重要

+ +
if (MY_FAV === 7) {
+  // 没问题,并且创建了一个块作用域变量 MY_FAV
+  // (works equally well with let to declare a block scoped non const variable)
+  let MY_FAV = 20;
+
+  // MY_FAV 现在为 20
+  console.log('my favorite number is ' + MY_FAV);
+
+  // 这被提升到全局上下文并引发错误
+  var MY_FAV = 20;
+}
+
+// MY_FAV 依旧为7
+console.log('my favorite number is ' + MY_FAV);
+
+ +

常量要求一个初始值

+ +
// 报错
+// Uncaught SyntaxError: Missing initializer in const declaration
+
+const FOO;
+
+ +

常量可以定义成对象和数组

+ +

常量可以定义成对象和数组

+ +
const MY_OBJECT = {'key': 'value'};
+
+// 重写对象和上面一样会失败
+// Uncaught TypeError: Assignment to constant variable.
+MY_OBJECT = {'OTHER_KEY': 'value'};
+
+// 对象属性并不在保护的范围内
+// 下面这个声明会成功执行
+MY_OBJECT.key = 'otherValue'; // Use Object.freeze() to make object immutable
+
+// 也可以用来定义数组
+const MY_ARRAY = [];
+// 可以向数组填充数据
+MY_ARRAY.push('A'); // ["A"]
+// 但是,将一个新数组赋给变量会引发错误
+// Uncaught TypeError: Assignment to constant variable.
+MY_ARRAY = ['B'];
+ +

规范

+ + + + + + + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName('ES2015', '#sec-let-and-const-declarations', 'Let and Const Declarations')}}{{Spec2('ES2015')}}Initial definition.
{{SpecName('ESDraft', '#sec-let-and-const-declarations', 'Let and Const Declarations')}}{{Spec2('ESDraft')}}No changes.
+ +

浏览器兼容性

+ + + +

{{Compat("javascript.statements.const")}}

+ +

相关链接

+ + -- cgit v1.2.3-54-g00ecf