[英]Comparison Behaviour of JavaScript Objects
我們假設我們有3個變量:a,b和c
var a = new Boolean(true);
var b = true;
var c = new Boolean(true);
console.log("First comparison : ", a == b);
// true
console.log("Second comparison : ", b == c);
// true
console.log("Contradiction : ", a == c);
// false
我已經知道關鍵字'new'會創建一個新對象。 這個對象的類型就是對象。
在數學上,我們如何解釋這一矛盾呢?
在前兩個示例中,由於比較涉及b
的原始值,因此a
和c
最終被強制轉換為基元。 另一方面,在最后一種情況下,您要比較兩個不同的對象,因此不會發生強制。
確切地說,與布爾值的雙重等價比較使用規范中的這個規則(以b == c
):
如果
Type(x)
是Boolean
,則返回比較結果ToNumber(x) == y
。
所以這意味着將ToNumber(b)
與c
進行比較。 ToNumber(b)
是1.所以我們將1
與c
進行比較。 接下來,應用以下規則:
如果
Type(x)
是String
或Number
而Type(y)
是Object
,則返回比較結果x == ToPrimitive(y)
。
因此,這意味着我們比較1
與ToPrimitive(c)
這是ToPrimitive(Boolean(true))
ToPrimitive
調用valueOf
,產生1
。 所以我們比較1
比1
。 QED。
在第三個示例的情況下,規范的以下部分適用:
如果
Type(x)
與Type(y)
相同,則...如果x
和y
引用同一個對象,則返回true。 否則,返回false。
回答你的問題:
在數學上,我們如何解釋這一矛盾呢?
這不是數學問題。 這是JS規范中比較定義的問題。
此問題是Javascript如何比較對象和文字值。
本文討論javascript中的“對象平等”: http : //adripofjavascript.com/blog/drips/object-equality-in-javascript.html
總之,對於Objects Javascript 只比較引用(如果兩個變量引用同一個對象)。
我不認為這種行為可以從數學的角度來解釋。
您在變量a和c上所做的通常被稱為“裝箱”:在new
運算符中使用Javascript原始值(未定義,null,字符串,數字,布爾值,ES6中的符號)。
的結果:
var a = new Boolean(true);
是一個包裝Boolean
原始值的Javascript Object
。
當您在某些語言內置工具(如Function.prototype.call
和Function.prototype.apply
)中使用原始值作為上下文( this
)時,會隱式發生相同的調用模式。
即使用===
替換==
也會產生相同的結果,這是因為對象比較在JS中是如何工作的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.