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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
|
---
title: Toán tử số học
slug: Web/JavaScript/Reference/Operators/Arithmetic_Operators
translation_of: Web/JavaScript/Reference/Operators
translation_of_original: Web/JavaScript/Reference/Operators/Arithmetic_Operators
---
<div>{{jsSidebar("Operators")}}</div>
<p><strong>Toán tử số học</strong> lấy giá trị số học (cả chuỗi hoặc biến) làm toán hạng của nó và trả về một giá trị số học. Các toán tử số học thông thường là cộng (+), trừ (-), nhân (*), và chia (/).</p>
<div>{{EmbedInteractiveExample("pages/js/expressions-arithmetic.html")}}</div>
<p class="hidden">Mã nguồn cho các ví dụ tương tác trong bài được lưu trên GitHub. Nếu bạn muốn đóng góp thêm ví dụ tương tác, làm ơn <em>clone</em> lại <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> và gửi cho chúng tôi một <em>pull request</em>.</p>
<h2 id="Cộng_()"><a name="Addition">Cộng (+)</a></h2>
<p>Toán tử cộng xuất ra tổng của toán hạng số học hoặc để nối chuỗi.</p>
<h3 id="Cú_pháp">Cú pháp</h3>
<pre class="syntaxbox"><strong>Toán tử:</strong> x + y
</pre>
<h3 id="Examples">Examples</h3>
<pre class="brush: js">// Number + Number -> addition
1 + 2 // 3
// Boolean + Number -> addition
true + 1 // 2
// Boolean + Boolean -> addition
false + false // 0
// Number + String -> concatenation
5 + 'foo' // "5foo"
// String + Boolean -> concatenation
'foo' + false // "foofalse"
// String + String -> concatenation
'foo' + 'bar' // "foobar"
</pre>
<h2 id="Trừ_(-)"><a name="Subtraction">Trừ (-)</a></h2>
<p>Toán tử trừ thực hiện trừ hai toán hạng, xuất ra chênh lệch giữa chúng.</p>
<h3 id="Cú_pháp_2">Cú pháp</h3>
<pre class="syntaxbox"><strong>Toán tử:</strong> x - y
</pre>
<h3 id="Ví_dụ">Ví dụ</h3>
<pre class="brush: js">5 - 3 // 2
3 - 5 // -2
'foo' - 3 // NaN</pre>
<h2 id="Chia_()"><a name="Division">Chia (/)</a></h2>
<p>Toán tử chia xuất ra thương của phép chia với toán hạng bên trái là số bị chia và toán hạng bên phải là số chia.</p>
<h3 id="Cú_pháp_3">Cú pháp</h3>
<pre class="syntaxbox"><strong>Toán tử:</strong> x / y
</pre>
<h3 id="Ví_dụ_2">Ví dụ</h3>
<pre class="brush: js">1 / 2 // trả về 0.5 trong JavaScript
1 / 2 // trả về 0 trong Java
// (neither number is explicitly a floating point number)
1.0 / 2.0 // ?trả về 0.5 trong cả JavaScript lẫn Java
2.0 / 0 // ?trả về Infinity trong JavaScript
2.0 / 0.0 // cũng trả về Infinity
2.0 / -0.0 // trả về -Infinity trong JavaScript</pre>
<h2 id="Nhân_(*)"><a name="Multiplication">Nhân (*)</a></h2>
<p>Toán tử nhân xuất ra tích của các toán hạng.</p>
<h3 id="Cú_pháp_4">Cú pháp</h3>
<pre class="syntaxbox"><strong>Toán tử:</strong> x * y
</pre>
<h3 id="Ví_dụ_3">Ví dụ</h3>
<pre class="brush: js">2 * 2 // 4
-2 * 2 // -4
Infinity * 0 // NaN
Infinity * Infinity // Infinity
'foo' * 2 // NaN
</pre>
<h2 id="Chia_lấy_dư_()"><a name="Remainder">Chia lấy dư (%)</a></h2>
<p>Toán tử chia lấy dư trả về phần dư khi toán hạng thứ nhất chia cho toán hạng thứ hai. Dấu của kết quả luôn cùng dấu với số bị chia.</p>
<h3 id="Cú_pháp_5">Cú pháp</h3>
<pre class="syntaxbox"><strong>Toán tử:</strong> var1 % var2
</pre>
<h3 id="Ví_dụ_4">Ví dụ</h3>
<pre class="brush: js">12 % 5 // 2
-1 % 2 // -1
1 % -2 // 1
NaN % 2 // NaN
1 % 2 // 1
2 % 3 // 2
-4 % 2 // -0
5.5 % 2 // 1.5
</pre>
<h2 id="Luỹ_thừa_(**)"><a name="Exponentiation">Luỹ thừa (**)</a></h2>
<p>Toán tử luỹ thừa trả về kết quả là luỹ thừa bậc là toán hạng thứ hai của toán hạng thứ nhất, tức là, <code>var1</code><sup><code>var2</code></sup>, như đã khẳng định trước đó, với <code>var1</code> và <code>var2</code> là biến số. Toán tử luỹ thừa là dạng liên hợp phải. <code>a ** b ** c</code> bằng với <code>a ** (b ** c)</code>.</p>
<h3 id="Cú_pháp_6">Cú pháp</h3>
<pre class="syntaxbox"><strong>Toán tử:</strong> var1 ** var2
</pre>
<h3 id="Ghi_chú">Ghi chú</h3>
<p>Trong hầu hết các ngôn ngữ như PHP và Python và một số khác mà có toán tử luỹ thừa (**), toán tử luỹ thừa được định nghĩa là có độ ưu tiên cao hơn toán tử một ngôi như là toán tử + một ngôi và toán tử - một ngôi, nhưng cũng có vài ngoại lệ. Chẳng hạn, trong Bash, toán tử ** được định nghĩa là có độ ưu tiên thấp hơn toán tử một ngôi. Trong JavaScript, hoàn toàn có thể viết một biểu thức luỹ thừa nhập nhằng, như là bạn không thể đặt toán tử một ngôi (<code>+/-/~/!/delete/void/typeof</code>) ngay trước cơ số.</p>
<pre class="brush: js">-2 ** 2;
// 4 trong Bash, -4 trong các ngôn ngữ khác.
// Không hợp lệ trong JavaScript, vì toán tử không nhập nhằng.
-(2 ** 2);
// -4 trong JavaScript và ý định của tác giả không nhập nhằng.
</pre>
<h3 id="Ví_dụ_5">Ví dụ</h3>
<pre class="brush: js">2 ** 3 // 8
3 ** 2 // 9
3 ** 2.5 // 15.588457268119896
10 ** -1 // 0.1
NaN ** 2 // NaN
2 ** 3 ** 2 // 512
2 ** (3 ** 2) // 512
(2 ** 3) ** 2 // 64
</pre>
<p>To invert the sign of the result of an exponentiation expression:</p>
<pre class="brush: js">-(2 ** 2) // -4
</pre>
<p>Để ép cơ số trong biểu thức luỹ thừa thành số âm:</p>
<pre class="brush: js">(-2) ** 2 // 4
</pre>
<div class="note">
<p><strong>Ghi chú:</strong> JavaScript cũng có <a href="/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_XOR"> toán tử thao tác bit ^ (XOR)</a>. <code>**</code> và <code>^</code> khác nhau (chẳng hạn: <code>2 ** 3 === 8</code> trong khi <code>2 ^ 3 === 1</code>.)</p>
</div>
<p> </p>
<h2 id="Tăng_()"><a name="Increment">Tăng (++)</a></h2>
<p> </p>
<p>Toán tử tăng tăng (thêm một vào) toán hạng của nó và trả về một giá trị.</p>
<ul>
<li>Nếu dùng như hậu tố, toán tử ở sau toán hạng (chẳng hạn, x++), thí nó trả về giá trị trước khi tăng.</li>
<li>Nếu dùng như tiền tố, toán tử ở trước toán hạng (chẳng hạn, ++x), thí nó trả về giá trị sau khi tăng.</li>
</ul>
<h3 id="Cú_pháp_7">Cú pháp</h3>
<pre class="syntaxbox"><strong>Toán tử:</strong> x++ hoặc ++x
</pre>
<h3 id="Ví_dụ_6">Ví dụ</h3>
<pre class="brush: js">// Hậu tố
var x = 3;
y = x++; // y = 3, x = 4
// Tiền tố
var a = 2;
b = ++a; // a = 3, b = 3
</pre>
<h2 id="Giảm_(--)"><a name="Decrement">Giảm (--)</a></h2>
<p>Toán tử giảm giảm (bớt một khỏi) toán hạng của nó và trả về một giá trị.</p>
<ul>
<li>Nếu dùng như hậu tố (chẳng hạn, x--), thì nó trả về giá trị trước khi giảm.</li>
<li>Nếu dùng như tiền tố (chẳng hạn, --x), thì nó trả về giá trị sau khi giảm.</li>
</ul>
<h3 id="Cú_pháp_8">Cú pháp</h3>
<pre class="syntaxbox"><strong>Toán tử:</strong> x-- hoặc --x
</pre>
<h3 id="Ví_dụ_7">Ví dụ</h3>
<pre class="brush: js">// Hậu tố
var x = 3;
y = x--; // y = 3, x = 2
// Tiền tố
var a = 2;
b = --a; // a = 1, b = 1
</pre>
<h2 id="Phủ_định_một_ngôi_(-)"><a name="Unary_negation">Phủ định một ngôi (-)</a></h2>
<p>Toán tử phủ định một ngôi đứng trước và phủ định toán hạng của nó.</p>
<h3 id="Cú_pháp_9">Cú pháp</h3>
<pre class="syntaxbox"><strong>Toán tử:</strong> -x
</pre>
<h3 id="Ví_dụ_8">Ví dụ</h3>
<pre class="brush: js">var x = 3;
y = -x; // y = -3, x = 3
//toán tử phủ định một ngôi có thể chuyển giá-trị-không-phải-kiểu-số về dạng số học
var x = "4";
y = -x; // y = -4
</pre>
<h2 id="Cộng_một_ngôi_()"><a name="Unary_plus">Cộng một ngôi (+)</a></h2>
<p>Toán tử cộng một ngôi đứng trước và định lượng toán hạng của nó nhưng cố gắng chuyển kiểu cho toán hạng sang dạng số, nếu ban đầu không phải ở dạng đó. Mặc dù toán tử phủ định một ngôi (-) cũng có thể chuyển kiểu như vậy, nhưng toán tử cộng một ngôi lại nhanh nhất và được dùng ưu tiên dùng nhiều hơn khi phải chuyển đổi kiểu dữ liệu về dạng số, bởi vì nó không thực hiện bất cứ phép toán nào khác trên số. Nó có thể chuyển kiểu từ biểu diễn dạng chuỗi của số nguyên hoặc số thực, thậm chí cả các giá trị không phải số như <code>true</code>, <code>false</code>, và <code>null</code>. Số thực ở dạng thập phân và bát phân (tiền tố - "0x") đều được hỗ trợ. Đồng thời hỗ trợ cả số âm (trừ số âm dạng bát phân). Nếu nó không thể truyền đúng dữ liệu đã định, nó sẽ định lượng thành <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN">NaN</a>.</p>
<h3 id="Cú_pháp_10">Cú pháp</h3>
<pre class="syntaxbox"><strong>Toán tử:</strong> +x
</pre>
<h3 id="Ví_dụ_9">Ví dụ</h3>
<pre class="brush: js">+3 // 3
+'3' // 3
+true // 1
+false // 0
+null // 0
+function(val){ return val } // NaN
</pre>
<h2 id="Đặc_tả">Đặc tả</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Đặc tả</th>
<th scope="col">Trạng thái</th>
<th scope="col">Bình luận</th>
</tr>
<tr>
<td>{{SpecName('ES1')}}</td>
<td>{{Spec2('ES1')}}</td>
<td>Initial definition.</td>
</tr>
<tr>
<td>{{SpecName('ES5.1', '#sec-11.3')}}</td>
<td>{{Spec2('ES5.1')}}</td>
<td>Defined in several sections of the specification: <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.6">Additive operators</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.5">Multiplicative operators</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.3">Postfix expressions</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.4">Unary operators</a>.</td>
</tr>
<tr>
<td>{{SpecName('ES2015', '#sec-postfix-expressions')}}</td>
<td>{{Spec2('ES2015')}}</td>
<td>Defined in several sections of the specification: <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-additive-operators">Additive operators</a>, <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-multiplicative-operators">Multiplicative operators</a>, <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-postfix-expressions">Postfix expressions</a>, <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-unary-operators">Unary operators</a>.</td>
</tr>
<tr>
<td>{{SpecName('ES2016', '#sec-postfix-expressions')}}</td>
<td>{{Spec2('ES2016')}}</td>
<td>Added <a href="https://github.com/rwaldron/exponentiation-operator">Exponentiation operator</a>.</td>
</tr>
<tr>
<td>{{SpecName('ES2017', '#sec-postfix-expressions')}}</td>
<td>{{Spec2('ES2017')}}</td>
<td> </td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-additive-operators')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td> </td>
</tr>
</tbody>
</table>
<h2 id="Tương_thích_trình_duyệt">Tương thích trình duyệt</h2>
<p>{{Compat("javascript.operators.arithmetic")}}</p>
<h2 id="Đọc_thêm">Đọc thêm</h2>
<ul>
<li><a href="/en-US/docs/Web/JavaScript/Reference/Operators/Assignment_Operators">Toán tử gán</a></li>
</ul>
|