aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/javascript/reference/statements/const/index.html
blob: 75a1676299854ac567d1cc688103b63a3f9c038d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
---
title: const
slug: Web/JavaScript/Reference/Statements/const
tags:
  - ECMAScript 2015
  - JavaScript
  - Reference
  - Statement
  - constants
translation_of: Web/JavaScript/Reference/Statements/const
---
<div>{{jsSidebar("Statements")}}</div>

<p>常量是块级范围的,非常类似用 <a href="/zh-CN/docs/Web/JavaScript/Reference/Statements/let">let</a> 语句定义的变量。但常量的值是无法(通过重新赋值)改变的,也不能被重新声明。</p>

<div>{{EmbedInteractiveExample("pages/js/statement-const.html")}}</div>



<h2 id="语法">语法</h2>

<pre class="syntaxbox notranslate">const <em>name1 = <em>value1 [</em>, <em>name2</em> = <em>value2</em><em> [</em>, ... [</em>, <em>nameN</em> = <em>valueN]]]</em>;</pre>

<dl>
 <dt><code>nameN</code></dt>
 <dd>常量名称,可以是任意合法的{{Glossary("identifier","标识符")}}</dd>
 <dt><code>valueN</code></dt>
 <dd>常量值,可以是任意合法的<a href="/zh-CN/docs/Web/JavaScript/Guide/Expressions_and_Operators#Expressions">表达式</a></dd>
</dl>

<h2 id="描述">描述</h2>

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

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

<p>关于“<a href="/zh-CN/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let">暂存死区</a>”的所有讨论都适用于<code><a href="/zh-CN/docs/Web/JavaScript/Reference/Statements/let">let</a></code><code>const</code></p>

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

<h2 id="示例">示例</h2>

<h3 id="const_基本用法">const 基本用法</h3>

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

<pre class="brush: js; notranslate">// 定义常量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;

</pre>

<h3 id="块作用域">块作用域</h3>

<p>注意块作用域的性质很重要</p>

<pre class="brush: js notranslate">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);
</pre>

<h3 id="常量要求一个初始值">常量要求一个初始值</h3>

<pre class="brush: js notranslate">// 报错
// Uncaught SyntaxError: Missing initializer in const declaration

const FOO;
</pre>

<h3 id="常量可以定义成对象和数组">常量可以定义成对象和数组</h3>

<p>常量可以定义成对象和数组</p>

<pre class="brush: js notranslate">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'];</pre>

<h2 id="规范">规范</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Specification</th>
   <th scope="col">Status</th>
   <th scope="col">Comment</th>
  </tr>
  <tr>
   <td>{{SpecName('ES2015', '#sec-let-and-const-declarations', 'Let and Const Declarations')}}</td>
   <td>{{Spec2('ES2015')}}</td>
   <td>Initial definition.</td>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-let-and-const-declarations', 'Let and Const Declarations')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td>No changes.</td>
  </tr>
 </tbody>
</table>

<h2 id="浏览器兼容性">浏览器兼容性</h2>

<div class="hidden">The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</div>

<p>{{Compat("javascript.statements.const")}}</p>

<h2 id="相关链接">相关链接</h2>

<ul>
 <li>{{jsxref("Statements/var", "var")}}</li>
 <li>{{jsxref("Statements/let", "let")}}</li>
 <li><a href="/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Constants">Constants in the JavaScript Guide</a></li>
</ul>