Operator Sama Dengan Ekamasript

判断两个变量是否相等是程序设计中非常重要的运算。在处理原始值时,这种运算相当简单,但涉及对象,任务就稍有点复杂。

ECMAScript 提供了两套等性运算符:等号和非等号用于处理原始值,全等号和非全等号用于处理对象。

等号和非等号

在 ECMAScript 中,等号由双等号(==)表示,当且仅当两个运算数相等时,它返回 true。非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回 true。为确定两个运算数是否相等,这两个运算符都会进行类型转换。

执行类型转换的规则如下:

  • 如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
  • 如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。
  • 如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
  • 如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。

在比较时,该运算符还遵守下列规则:

  • 值 null 和 undefined 相等。
  • 在检查相等性时,不能把 null 和 undefined 转换成其他值。
  • 如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
  • 如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。

重要提示:即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。

下表列出了一些特殊情况,以及它们的结果:

表达式
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true

Tanda sama penuh dan tidak sama dengan penuh

Tanda sama dan tidak sama dengan jenis yang sama adalah tanda sama penuh dan tidak sama dengan penuh. Tindakan yang dilakukan oleh kedua operator ini sama dengan tanda sama dan tidak sama, hanya mereka tidak melaksanakan penukaran jenis sebelum memeriksa kesamaan.

Tanda sama penuh disebutkan dengan tiga tanda sama (===), hanya kembali ke true jika penggunaan bilangan sama tanpa penukaran jenis.

Contohnya:

var sNum = "66";
var iNum = 66;
alert(sNum == iNum);	//Output "true"
alert(sNum === iNum);	//Output "false"

Dalam kod ini, alert pertama menggunakan tanda sama untuk membandingkan string "66" dan nombor 66, output "true". Seperti yang disebutkan sebelumnya, kerana string "66" akan diubah ke nombor 66, lalu dihubungkan dengan nombor lain 66. Alert kedua menggunakan tanda sama penuh tanpa penukaran jenis. Tentu, string tidak sama dengan nombor, jadi output "false".

Tidak sama dengan disebutkan dengan tanda seru dan dua tanda sama (!==), hanya kembali ke true jika penggunaan bilangan tidak memerlukan penukaran jenis.

Contohnya:

var sNum = "66";
var iNum = 66;
alert(sNum != iNum);	//Output "false"
alert(sNum !== iNum);	//Output "true"

Di sini, alert pertama menggunakan tidak sama dengan untuk merubah string "66" ke nombor 66, supaya ia sama dengan penggunaan bilangan kedua 66. Oleh itu, hasil perhitungan adalah "false", kerana kedua bilangan adalah sama. Alert kedua menggunakan tidak sama dengan penuh. Pertanyaan yang dijawab adalah: "sNum" berbeza dengan "iNum"? Jawapan kepada pertanyaan ini adalah: Ya (true), kerana sNum adalah string, sementara iNum adalah nombor, mereka pasti berbeza.