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
|
---
title: Primitive
slug: Tu-dien-thuat-ngu/Primitive
translation_of: Glossary/Primitive
---
<p><span class="seoSummary">Trong {{Glossary("JavaScript")}}, <strong>một bản nguyên</strong> (giá trị nguyên thủy, giá trị sơ khai, kiểu dữ liệu sơ khai) là dữ liệu mà dữ liệu này không phải {{Glossary("object")}} và không có {{glossary("method","phương thức")}}. Có 7 kiểu dữ liệu bản nguyên: {{Glossary("string")}}, {{Glossary("number")}},</span> {{Glossary("bigint")}},<span class="seoSummary"> {{Glossary("boolean")}}, {{Glossary("null")}}, {{Glossary("undefined")}}, {{Glossary("symbol")}} (mới thêm vào trong {{Glossary("ECMAScript")}} 2015).</span></p>
<p>Most of the time, a primitive value is represented directly at the lowest level of the language implementation.</p>
<p>Tất cả bản nguyên đều là <strong>bất biến</strong>, tức là chúng không thể bị thay đổi. Đừng để bối rối giữa một bản nguyên với một biến được gán giá trị bản nguyên. Biến đó có thể được gán lại giá trị mới, nhưng giá trị đang tồn tại không thể bị thay đổi theo cái cách mà object, mảng và hàm có thể bị thay đổi.</p>
<h2 id="Ví_dụ">Ví dụ</h2>
<p>Ví dụ này sẽ giúp bạn hiểu rõ thực tế là các giá trị bản nguyên <strong>không thể bị thay đổi</strong>.</p>
<h3 id="JavaScript">JavaScript</h3>
<pre class="brush: js"> // Sử dụng phương thức chuỗi không làm biến đổi chuỗi
var bar = "baz";
console.log(bar); // baz
bar.toUpperCase();
console.log(bar); // baz
// Sử dụng một phương thức mảng để làm biến đổi mảng
var foo = [];
console.log(foo); // []
foo.push("plugh");
console.log(foo); // ["plugh"]
// Câu lệnh gán đã cho bản nguyên một giá trị mới (đây là giá trị mới chứ không phải biến đổi giá trị cũ)
bar = bar.toUpperCase(); // BAZ
</pre>
<p>Một bản nguyên có thể bị thay thế, nhưng không thể biến đổi nó trực tiếp.</p>
<h2 id="Ví_dụ_khác_Từng-bước">Ví dụ khác [ Từng-bước ]</h2>
<p>Ví dụ sau đây sẽ cho bạn thấy cách JavaScript làm việc với các bản nguyên.</p>
<h3 class="highlight-spanned" id="JavaScript_2"><span class="highlight-span">JavaScript</span></h3>
<pre class="brush: js line-numbers language-js">// Xác định bản nguyên
let foo = 5;
// Định nghĩa hàm để thay đổi giá trị bản nguyên
function addTwo(num) {
num += 2;
}
// Một hàm khác cố gắng làm điều tương tự
function addTwo_v2(foo) {
foo += 2;
}
// Gọi hàm thứ nhất và truyền bản nguyên của chúng ta vào như là một đối số
addTwo(foo);
// Nhận về giá trị bản nguyên hiện tại
console.log(foo); // 5
// Cố gắng một lần nữa với hàm thứ hai của chúng ta...
addTwo_v2(foo);
console.log(foo); // 5
</pre>
<p>Bạn có đang nghĩ rằng đó phải là <code>7</code> chứ không phải <code>5</code> không? Nếu có, dưới đây là cách đoạn mã hoạt động:</p>
<ul>
<li>Cả hai lần gọi hàm <code>addTwo</code> và <code>addTwo_v2</code>, JavaScript tra cứu giá trị cho định danh <code>foo</code>. Nó sẽ tìm đích xác biến của chúng ta, cái biến mà đã được thực thể hóa nên với câu lệnh đầu tiên của chúng ta.</li>
<li>Sau khi tìm thấy biến ấy rồi, biểu thức gắn với biến sẽ được đánh giá, <code>foo</code> sẽ được thay thế bằng 5 và JavaScript engine sẽ truyền giá trị đó (5) vào hàm như là một đối số.</li>
<li>Trước khi thực thi các lệnh trong thân hàm, <strong>JavaScript sẽ lấy một bản sao của đối số gốc được truyền vào</strong> (cái mà là một bản nguyên) và tạo ra một bản sao có phạm vi local. Các bản sao này, chỉ tồn tại bên trong phạm vi của các hàm, có thể được truy cập thông qua các định danh mà ta đã chỉ định trong câu lệnh khai báo hàm (<code>num</code> cho <code>addTwo</code>, <code>foo</code> cho <code>addTwo_v2</code>)</li>
<li>Sau đó, các lệnh trong thân hàm được thực thi:
<ul>
<li>Trong hàm thứ nhất, một biến cục bộ <code>num</code> đã trải qua xong quá trình khởi tạo ở trên. Ta ngay sau đó tăng giá trị của nó thêm 2, không phải giá trị của <code>foo</code> gốc!</li>
<li>Trong hàm thứ hai, một biến cục bộ <code>foo</code> đã trải qua xong quá trình khởi tạo ở trên. Ta tăng giá trị của nó thêm 2, không phải giá trị của <code>foo</code> gốc (<code>foo</code> nằm bên ngoài hàm)! Bên cạnh đó, trong trường hợp này, biến <code>foo</code> bên ngoài hàm không thể được truy cập trực tiếp. Đây là bởi vì JavaScript's lexical scoping và the resulting variable shadowing. Biến cục bộ <code>foo</code> che đi biến <code>foo</code> bên ngoài hàm. Để biết thêm chi tiết, xem <a href="/en-US/docs/Web/JavaScript/Closures">Closures</a>. (Chú ý rằng <font face="consolas, Liberation Mono, courier, monospace"><span style="background-color: rgba(220, 220, 220, 0.5);">window.foo</span></font> vẫn có thể sử dụng để truy cập vào biến ngoài hàm <code>foo</code>.) </li>
</ul>
</li>
<li>Tóm lại, mọi thay đổi trong hàm <strong>sẽ hoàn toàn không</strong> ảnh hưởng <code>foo</code> GỐC, bởi ta đang làm việc với <strong>bản sao </strong>của nó.</li>
</ul>
<p>Đó là lý do tại sao các Bản nguyên là bất biến - thay vì làm việc trực tiếp với chúng, chúng ta làm việc với bản sao, <em>không làm ảnh hưởng bản gốc</em>.</p>
<h2 id="Các_object_bọc_bản_nguyên_trong_JavaScript">Các object bọc bản nguyên trong JavaScript</h2>
<p>Ngoại trừ <code>null</code> và <code>undefined</code>, mọi giá trị bản nguyên đều có các object tương đương mà các object này sẽ bao bọc xung quanh các giá trị bản nguyên:</p>
<ul>
<li>{{jsxref("String")}} cho bản nguyên string.</li>
<li>{{jsxref("Number")}} cho bản nguyên number.</li>
<li>{{jsxref("BigInt")}} cho bản nguyên bigint.</li>
<li>{{jsxref("Boolean")}} cho bản nguyên boolean.</li>
<li>{{jsxref("Symbol")}} cho bản nguyên symbol.</li>
</ul>
<p>Phương thức <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf"><code>valueOf()</code></a> của màng bọc sẽ trả về giá trị bản nguyên.</p>
<h2 id="Tham_khảo_thêm">Tham khảo thêm</h2>
<h3 id="Hiểu_biết_chung">Hiểu biết chung</h3>
<ul>
<li><a href="/en-US/docs/Web/JavaScript/Data_structures">Giới thiệu kiểu dữ liệu trong JavaScript</a></li>
<li>{{Interwiki("wikipedia", "Kiểu dữ liệu sơ khai")}} trên Wikipedia</li>
</ul>
<section class="Quick_links" id="Quick_Links">
<ol>
<li><a href="/en-US/docs/Glossary">Từ điển thuật ngữ</a>
<ol>
<li>{{Glossary("JavaScript")}}</li>
<li>{{Glossary("string")}}</li>
<li>{{Glossary("number")}}</li>
<li>{{Glossary("bigint")}}</li>
<li>{{Glossary("boolean")}}</li>
<li>{{Glossary("null")}}</li>
<li>{{Glossary("undefined")}}</li>
<li>{{Glossary("symbol")}}</li>
</ol>
</li>
<li><a href="/en-US/docs/Web/JavaScript/Data_structures">Các kiểu dữ liệu JavaScript</a></li>
</ol>
</section>
|