Semua bahasa pemrograman menyediakan struktur data built-in, namun berbeda antara bahasa yang satu dengan lainnya. Artikel ini berupaya membuat daftar struktur data built-in yang tersedia dalam JavaScript beserta properti yang dimilikinya; ini akan dapat digunakan untuk membentuk struktur data lainnya. Bila mungkin, perbandingan dengan bahasa lain dilakukan.
Tipe Dinamis
JavaScript merupakan suatu bahasa yang bertipe longgar atau bahasa dinamis. Itu berarti sebelumnya Anda tidak perlu mendeklarasikan tipe variabel. Tipe variabel akan ditentukan secara otomatis saat program sedang diproses. Itu juga berarti bahwa Anda dapat memiliki nama variabel yang sama dengan tipe yang berbeda:
var foo = 42; // foo saat ini sebagai Numerik var foo = "bar"; // foo saat ini sebagai String var foo = true; // foo saat ini sebagai Boolean
Tipe Data
Standar ECMAScript terbaru mendefinisikan tujuh tipe data :
- Enam tipe antara lain {{Glossary("Primitive", "primitives")}}:
- {{Glossary("Boolean")}}
- {{Glossary("Null")}}
- {{Glossary("Undefined")}}
- {{Glossary("Number")}}
- {{Glossary("String")}}
- {{Glossary("Symbol")}} (new in ECMAScript 6)
- dan {{Glossary("Object")}}
Nilai-nilai Primitif
Semua tipe kecuali objek mendefinisikan nilai-nilai tetap (nilai-nilai, yang tidak mampu berubah). Misalnya dan tidak seperti ke C, Strings yang tetap. Kami mengacu pada nilai-nilai dari tipe ini sebagai "nilai-nilai primitif".
Tipe Boolean
Boolean merepresentasikan suatu entitas logika dan dapat memiliki dua nilai: benar, dan salah.
Tipe Null
Tipe Null memiliki hanya satu nilai: null. Lihat {{jsxref("null")}} dan {{Glossary("Null")}} untuk lebih jelasnya.
Tipe Undefined
Suatu variabel yang belum ditetapkan dengan suatu nilai akan memilik nilai undefined
. Lihat {{jsxref("undefined")}} dan {{Glossary("Undefined")}} untuk lebih jelasnya.
Tipe Numerik
Merujuk pada standar ECMAScript, terdapat hanya satu tipe numerik: yaitu double-precision 64-bit binary format IEEE 754 value (bilangan antara -(253 -1) and 253 -1). Tidak terdapat tipe khusus untuk integer. Sebagai tambahan agar dapat merepresentasikan bilangan floating-point, tipe numerik mempunyai tiga nilai-nilai simbolik : +Infinity
, -Infinity
, and NaN
(not-a-number).
Untuk memeriksa nilai-nilai yang lebih besar atau lebih kecil dari +/-Infinity
, Anda dapat menggunakan konstanta {{jsxref("Number.MAX_VALUE")}} atau {{jsxref("Number.MIN_VALUE")}} dan mulai dari ECMAScript 6, Anda juga dapat memeriksa jika suatu bilangan berada dalam daerah nilai double-precision floating-point number dengan menggunakan {{jsxref("Number.isSafeInteger()")}} sebaik {{jsxref("Number.MAX_SAFE_INTEGER")}} dan {{jsxref("Number.MIN_SAFE_INTEGER")}}. Di luar daerah nilai ini, bilangan dalam JavaScript tidak aman lagi.
Tipe numerik hanya mempunyai satu integer yang mempunyai dua representasi: 0 direpresentasikan sebagai -0 dan +0. ("0" merupakan alias untuk +0). Dalam praksis, ini hampir tidak memiliki dampak. Misalnya 0 === -0 benar. Namun, Anda dapat melihat ini ketika Anda membagi dengan nol:
> 42 / +0 Infinity > 42 / -0 -Infinity
Meskipun angka sering hanya mewakili nilai, JavaScript menyediakan beberapa operator biner. Ini dapat digunakan untuk mewakili beberapa nilai Boolean dalam nomor tunggal menggunakan bit masking. Hal ini biasanya dianggap sebagai praktek yang buruk, namun, JavaScript tidak menawarkan cara lain untuk mewakili satu set Booleans (seperti sebuah array dari boolean atau objek dengan nilai-nilai Boolean ditugaskan untuk properti bernama). Bit masking juga cenderung untuk membuat kode lebih sulit untuk membaca, memahami, dan memelihara. Mungkin perlu untuk menggunakan teknik tersebut dalam lingkungan yang sangat dibatasi, seperti ketika mencoba untuk mengatasi keterbatasan penyimpanan dari suatu penyimpanan lokal atau dalam kasus yang ekstrim ketika setiap bit melebihi sejumlah jaringan. Teknik ini hanya boleh dipertimbangkan ketika itu menjadi ukuran terakhir yang dapat diambil untuk mengoptimalkan ukuran.
Tipe String
TIpe JavaScript's {{jsxref("Global_Objects/String", "String")}} yang digunakan untuk merepresentasikan data teks. Ini merupakan sekumpulan "elements" dari 16-bit nilai-nilai unsigned integer. Setiap elemen String menempati suatu posisi tertentu dalam String. Elemen pertama menempati pada indeks 0, selanjutnya pada indeks 1, dan seterusnya. Panjang String adalah jumlah elemen di dalamnya.
Unlike in languages like C, JavaScript strings are immutable. This means that once a string is created, it is not possible to modify it. However, it is still possible to create another string based on an operation on the original string. For example:
- A substring of the original by picking individual letters or using {{jsxref("String.substr()")}}.
- A concatenation of two strings using the concatenation operator (
+
) or {{jsxref("String.concat()")}}.
Beware of "stringly-typing" your code!
It can be tempting to use strings to represent complex data. Doing this comes with short-term benefits:
- It is easy to build complex strings with concatenation.
- Strings are easy to debug (what you see printed is always what is in the string).
- Strings are the common denominator of a lot of APIs (input fields, local storage values, {{ domxref("XMLHttpRequest") }} responses when using
responseText
, etc.) and it can be tempting to only work with strings.
With conventions, it is possible to represent any data structure in a string. This does not make it a good idea. For instance, with a separator, one could emulate a list (while a JavaScript array would be more suitable). Unfortunately, when the separator is used in one of the "list" elements, then, the list is broken. An escape character can be chosen, etc. All of this requires conventions and creates an unnecessary maintenance burden.
Use strings for textual data. When representing complex data, parse strings and use the appropriate abstraction.
Symbol type
Symbols are new to JavaScript in ECMAScript Edition 6. A Symbol is a unique and immutable primitive value and may be used as the key of an Object property (see below). In some programming languages, Symbols are called atoms. You can also compare them to named enumerations (enum) in C. For more details see {{Glossary("Symbol")}} and the {{jsxref("Symbol")}} object wrapper in JavaScript.
Objects
In computer science, an object is a value in memory which is possibly referenced by an {{Glossary("Identifier", "identifier")}}.
Properties
In JavaScript, objects can be seen as a collection of properties. With the object literal syntax, a limited set of properties are initialized; then properties can be added and removed. Property values can be values of any type, including other objects, which enables building complex data structures. Properties are identified using key values. A key value is either a String or a Symbol value.
There are two types of object properties which have certain attributes: The data property and the accessor property.
Data property
Associates a key with a value and has the following attributes:
Attribute | Type | Description | Default value |
---|---|---|---|
[[Value]] | Any JavaScript type | The value retrieved by a get access of the property. | undefined |
[[Writable]] | Boolean | If false , the property's [[Value]] can't be changed. |
false |
[[Enumerable]] | Boolean | If true , the property will be enumerated in for...in loops. See also Enumerability and ownership of properties |
false |
[[Configurable]] | Boolean | If false , the property can't be deleted and attributes other than [[Value]] and [[Writable]] can't be changed. |
false |
Attribute | Type | Description |
---|---|---|
Read-only | Boolean | Reversed state of the ES5 [[Writable]] attribute. |
DontEnum | Boolean | Reversed state of the ES5 [[Enumerable]] attribute. |
DontDelete | Boolean | Reversed state of the ES5 [[Configurable]] attribute. |
Accessor property
Associates a key with one or two accessor functions (get and set) to retrieve or store a value and has the following attributes:
Attribute | Type | Description | Default value |
---|---|---|---|
[[Get]] | Function object or undefined | The function is called with an empty argument list and retrieves the property value whenever a get access to the value is performed. See also get . |
undefined |
[[Set]] | Function object or undefined | The function is called with an argument that contains the assigned value and is executed whenever a specified property is attempted to be changed. See also set . |
undefined |
[[Enumerable]] | Boolean | If true , the property will be enumerated in for...in loops. |
false |
[[Configurable]] | Boolean | If false , the property can't be deleted and can't be changed to a data property. |
false |
Note: Attribute is usually used by JavaScript engine, so you can't directly access it(see more about Object.defineProperty()).That's why the attribute is put in double square brackets instead of single.
"Normal" objects, and functions
A JavaScript object is a mapping between keys and values. Keys are strings (or {{jsxref("Symbol")}}s) and values can be anything. This makes objects a natural fit for hashmaps.
Functions are regular objects with the additional capability of being callable.
Dates
When representing dates, the best choice is to use the built-in Date
utility in JavaScript.
Indexed collections: Arrays and typed Arrays
Arrays are regular objects for which there is a particular relationship between integer-key-ed properties and the 'length' property. Additionally, arrays inherit from Array.prototype
which provides to them a handful of convenient methods to manipulate arrays. For example, indexOf
(searching a value in the array) or push
(adding an element to the array), etc. This makes Arrays a perfect candidate to represent lists or sets.
Typed Arrays are new to JavaScript with ECMAScript Edition 6 and present an array-like view of an underlying binary data buffer. The following table helps you to find the equivalent C data types:
{{page("/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray", "TypedArray_objects", "", 0, 3)}}
Keyed collections: Maps, Sets, WeakMaps, WeakSets
These data structures take object references as keys and are introduced in ECMAScript Edition 6. {{jsxref("Set")}} and {{jsxref("WeakSet")}} represent a set of objects, while {{jsxref("Map")}} and {{jsxref("WeakMap")}} associate a value to an object. The difference between Maps and WeakMaps is that in the former, object keys can be enumerated over. This allows garbage collection optimizations in the latter case.
One could implement Maps and Sets in pure ECMAScript 5. However, since objects cannot be compared (in the sense of "less than" for instance), look-up performance would necessarily be linear. Native implementations of them (including WeakMaps) can have look-up performance that is approximately logarithmic to constant time.
Usually, to bind data to a DOM node, one could set properties directly on the object or use data-*
attributes. This has the downside that the data is available to any script running in the same context. Maps and WeakMaps make it easy to privately bind data to an object.
Structured data: JSON
JSON (JavaScript Object Notation) is a lightweight data-interchange format, derived from JavaScript but used by many programming languages. JSON builds universal data structures. See {{Glossary("JSON")}} and {{jsxref("JSON")}} for more details.
More objects in the standard library
JavaScript has a standard library of built-in objects. Please have a look at the reference to find out about more objects.
Determining types using the typeof
operator
The typeof
operator can help you to find the type of your variable. Please read the reference page for more details and edge cases.
Specifications
Specification | Status | Comment |
---|---|---|
{{SpecName('ES1')}} | {{Spec2('ES1')}} | Initial definition. |
{{SpecName('ES5.1', '#sec-8', 'Types')}} | {{Spec2('ES5.1')}} | |
{{SpecName('ES6', '#sec-ecmascript-data-types-and-values', 'ECMAScript Data Types and Values')}} | {{Spec2('ES6')}} | |
{{SpecName('ESDraft', '#sec-ecmascript-data-types-and-values', 'ECMAScript Data Types and Values')}} | {{Spec2('ESDraft')}} |