Tipe asal ECMAScript

ECMAScript memiliki 5 jenis tipe asli (primitive type), yaitu Undefined, Null, Boolean, Number, dan String.

Operator typeof

Operator typeof memiliki parameter, yaitu variabel atau nilai yang akan dicek. Contohnya:

var sTemp = "test string";
alert (typeof sTemp);    //keluaran "string"
alert (typeof 86);    //keluaran "number"

Panggilan operator typeof terhadap variabel atau nilai akan mengembalikan salah satu nilai berikut:

  • undefined - jika variabel adalah tipe Undefined
  • boolean - jika variabel adalah tipe Boolean
  • number - jika variabel adalah tipe Number
  • string - jika variabel adalah tipe String
  • object - jika variabel adalah jenis tipe referensi atau tipe Null

Keterangan:Anda mungkin akan bertanya, mengapa operator typeof untuk nilai null akan mengembalikan "Object". Ini sebenarnya adalah kesalahan dalam implementasi awal JavaScript, kemudian diikuti ECMAScript. Sekarang, null dianggap sebagai pengganti objek, sehingga menjelaskan konflik ini, tetapi secara teknis, itu tetap adalah nilai asli.

Tipe Undefined

Sebagai disebutkan sebelumnya, tipe Undefined hanya memiliki nilai satu, yaitu undefined. Saat variabel yang dideklarasikan belum diinisialisasi, nilai baku variabel adalah undefined.

var oTemp;

Baris kode di atas mendeklarasikan variabel oTemp tanpa nilai awal. Variabel ini akan diberikan nilai undefined, yaitu ekuivalen ekuivalen tipe undefined. Dapat menguji nilai variabel apakah sama dengan undefined menggunakan kode berikut:

var oTemp;
alert(oTemp == undefined);

Kode ini akan menampilkan "true", yang menunjukkan bahwa kedua nilai ini sebenarnya sama. Dapat juga menampilkan nilai variabel apakah undefined menggunakan operator typeof:

var oTemp;
alert(typeof oTemp); // output "undefined"

Peringatan:Nilai undefined tidak sama dengan nilai yang belum diatur. Tetapi, operator typeof tidak benar-benar membedakan kedua nilai ini. Berikan contoh kode di bawah ini:

var oTemp;
alert(typeof oTemp);  // output "undefined"
alert(typeof oTemp2);  // output "undefined"

Kode di atas mengeluarkan "undefined" untuk kedua variabel, walaupun hanya variabel oTemp2 yang belum pernah dideklarasikan. Jika menggunaan operator selain typeof untuk oTemp2, akan memicu kesalahan, karena operator lain hanya dapat digunakan untuk variabel yang telah dideklarasikan.

Contohnya, kode di bawah ini akan memicu kesalahan:

var oTemp;
alert(oTemp2 == undefined);

Ketika fungsi tidak memiliki nilai kembalian yang jelas, nilai kembaliannya juga adalah "undefined", seperti yang ditunjukkan di bawah ini:

function testFunc() {
}
alert(testFunc() == undefined);  // output "true"

Tipe Null

Tipe yang lain yang hanya memiliki satu nilai adalah Null, yang hanya memiliki nilai khusus null, yaitu ekuivalennya. Nilai undefined sebenarnya berasal dari nilai null, sehingga ECMAScript mengdefinisikan keduanya sebagai sama.

alert(null == undefined);  // output "true"

Walaupun kedua nilai ini sama, arti mereka berbeda. undefined adalah nilai yang diberikan kepada variabel yang belum diinisialisasi, sementara null digunakan untuk menunjukkan objek yang belum ada (disebutkan dengan singkat dalam diskusi tentang operator typeof). Jika fungsi atau method mengembalikan objek, biasanya nilai yang kembali adalah null ketika objek tidak ditemukan.

Tipe Boolean

Tipe Boolean adalah salah satu jenis yang paling sering digunakan dalam ECMAScript. Ia memiliki dua nilai true dan false (yang demikian adalah dua ekuivalen Boolean).

即使 false 不等于 0,0 也可以在必要时被转换成 false,这样在 Boolean 语句中使用两者都是安全的。

var bFound = true;
var bLost = false;

Number 类型

ECMA-262 中定义的最特殊的类型是 Number 类型。这种类型既可以表示 32 位的整数,还可以表示 64 位的浮点数。

直接输入的(而不是从另一个变量访问的)任何数字都被看做 Number 类型的字面量。例如,下面的代码声明了存放整数值的变量,它的值由字面量 86 定义:

var iNum = 86;

八进制数和十六进制数

整数也可以被表示为八进制(以 8 为底)或十六进制(以 16 为底)的字面量。八进制字面量的首数字必须是 0,其后的数字可以是任何八进制数字(0-7),如下面的代码所示:

var iNum = 070;  //070 等于十进制的 56

要创建十六进制的字面量,首位数字必须为 0,后面接字母 x,然后是任意的十六进制数字(0 到 9 和 A 到 F)。这些字母可以是大写的,也可以是小写的。例如:

var iNum = 0x1f;  //0x1f 等于十进制的 31
var iNum = 0xAB;  //0xAB 等于十进制的 171

Peringatan:尽管所有整数都可以表示为八进制或十六进制的字面量,但所有数学运算返回的都是十进制结果。

浮点数

要定义浮点值,必须包括小数点和小数点后的一位数字(例如,用 1.0 而不是 1)。这被看作浮点数字面量。例如:

var fNum = 5.0;

对于浮点字面量的有趣之处在于,用它进行计算前,真正存储的是字符串。

科学计数法

对于非常大或非常小的数,可以用科学计数法表示浮点数,可以把一个数表示为数字(包括十进制数字)加 e(或 E),后面加乘以 10 的倍数。例如:

var fNum = 5.618e7

该符号表示的是数 56180000。把科学计数法转化成计算式就可以得到该值:5.618 x 107

也可以用科学计数法表示非常小的数,例如 0.00000000000000008 可以表示为 8-e17(Di sini, 10 diangkat ke -17 pangkat, yang berarti perlu dibagi 10 17 kali). ECMAScript secara default mengkonversi bilangan floating-point dengan 6 atau lebih digit awal 0 ke notasi bilangan ilmiah.

Peringatan:Nilai bilangan floating-point juga dapat disimpan dalam bentuk 64-bit IEEE 754, yang berarti nilai desimal hanya dapat memiliki 17 digit desimal. Nilai setelah 17 digit akan dihilangkan, sehingga mengakibatkan beberapa kesalahan matematika kecil.

Nilai Number khusus

Beberapa nilai khas juga didefinisikan sebagai Type Number. Dua yang pertama adalah Number.MAX_VALUE dan Number.MIN_VALUE, yang mendefinisikan batas ekstrem koleksi nilai Number. Semua bilangan ECMAScript harus berada di antara kedua nilai ini. Namun, hasil penghitungan dapat berada di luar kedua nilai ini.

Ketika angka yang dihitung melebihi Number.MAX_VALUE, ia akan diberikan nilai Number.POSITIVE_INFINITY, yang berarti tidak ada nilai angka lagi. sama seperti, penghitungan nilai yang kecil dari Number.MIN_VALUE juga akan diberikan nilai Number.NEGATIVE_INFINITY, yang berarti tidak ada nilai angka lagi. Jika penghitungan mengembalikan nilai tak bilang, hasilnya tidak dapat digunakan dalam perhitungan lainnya.

Dalam faktanya, ada nilai khusus yang mewakili tak bilang (seperti yang anda duga), yaitu Infinity. Nilai Number.POSITIVE_INFINITY adalah Infinity. Nilai Number.NEGATIVE_INFINITY adalah -Infinity.

Karena bilangan tak bilang dapat positif atau negatif, jadi ada metode untuk mengecek apakah suatu bilangan adalah terbatas (tidak saja tes setiap bilangan tak bilang). Metode isFinite() dapat dipanggil untuk setiap bilangan untuk memastikan bahwa bilangan tersebut bukan tak bilang. Contohnya:

var iResult = iNum * some_really_large_number;
if (isFinite(iResult)) {
    alert("finite");
}
else {
    alert("infinite");
}

Bilangan khas terakhir adalah NaN, yang berarti Bukan Bilangan (Not a Number). NaN adalah nilai khas yang aneh. Secara umum, hal ini terjadi saat konversi tipe (String, Boolean dll) gagal. Contohnya, konversi kata 'blue' ke bilangan akan gagal, karena tidak ada nilai numerik yang setara dengannya. Seperti tak bilang, NaN juga tidak dapat digunakan dalam perhitungan aritmetika. Salah satu hal yang aneh lainnya tentang NaN adalah ia tidak sama dengan dirinya sendiri, yang berarti kode di bawah ini akan kembalikan nilai false:

alert(NaN == NaN);  //输出 "false"

出于这个原因,不推荐使用 NaN 值本身。函数 isNaN() 会做得相当好:

alert(isNaN("blue"));  //输出 "true"
alert(isNaN("666"));  //输出 "false"

String 类型

String 类型的独特之处在于,它是唯一没有固定大小的原始类型。可以用字符串存储 0 或更多的 Unicode 字符,有 16 位整数表示(Unicode 是一种国际字符集,本教程后面将讨论它)。

字符串中每个字符都有特定的位置,首字符从位置 0 开始,第二个字符在位置 1,依此类推。这意味着字符串中的最后一个字符的位置一定是字符串的长度减 1:

Panjang string dan lokasi karakter

字符串字面量是由双引号(")或单引号(')声明的。而 Java 则是用双引号声明字符串,用单引号声明字符。但是由于 ECMAScript 没有字符类型,所以可使用这两种表示法中的任何一种。例如,下面的两行代码都有效:

var sColor1 = "red";
var sColor2 = 'red';

String 类型还包括几种字符字面量,Java、C 和 Perl 的开发者应该对此非常熟悉。

下面列出了 ECMAScript 的字符字面量:

字面量 含义
\n 换行
\t 制表符
\b 空格
\r 回车
\f 换页符
\\ 反斜杠
\' 单引号
\" 双引号
\0nnn 八进制代码 nnn 表示的字符(n 是 0 到 7 中的一个八进制数字)
\xnn 十六进制代码 nn 表示的字符(n 是 0 到 F 中的一个十六进制数字)
\unnnn 十六进制代码 nnnn 表示的 Unicode 字符(n 是 0 到 F 中的一个十六进制数字)