簡體   English   中英

JavaScript對象的比較行為

[英]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的原始值,因此ac最終被強制轉換為基元。 另一方面,在最后一種情況下,您要比較兩個不同的對象,因此不會發生強制。

確切地說,與布爾值的雙重等價比較使用規范中的這個規則(以b == c ):

如果Type(x)Boolean ,則返回比較結果ToNumber(x) == y

所以這意味着將ToNumber(b)c進行比較。 ToNumber(b)是1.所以我們將1c進行比較。 接下來,應用以下規則:

如果Type(x)StringNumberType(y)Object ,則返回比較結果x == ToPrimitive(y)

因此,這意味着我們比較1ToPrimitive(c)這是ToPrimitive(Boolean(true)) ToPrimitive調用valueOf ,產生1 所以我們比較11 QED。

在第三個示例的情況下,規范的以下部分適用:

如果Type(x)Type(y)相同,則...如果xy引用同一個對象,則返回true。 否則,返回false。

回答你的問題:

在數學上,我們如何解釋這一矛盾呢?

這不是數學問題。 這是JS規范中比較定義的問題。

此問題是Javascript如何比較對象和文字值。

本文討論javascript中的“對象平等”: http//adripofjavascript.com/blog/drips/object-equality-in-javascript.html

總之,對於Objects Javascript 比較引用(如果兩個變量引用同一個對象)。

在數學上,我們如何解釋這一矛盾呢?

如果你認為這是一個矛盾可能是因為你假設==定義了等價關系

但它沒有:

  • 它不滿足反射性 ,例如NaN != NaN
  • 你注意到它並不滿足傳遞性
  • 但它滿足對稱性 ,但僅靠這一點是不夠的。

我不認為這種行為可以從數學的角度來解釋。

您在變量a和c上所做的通常被稱為“裝箱”:在new運算符中使用Javascript原始值(未定義,null,字符串,數字,布爾值,ES6中的符號)。

的結果:

var a = new Boolean(true);

是一個包裝Boolean原始值的Javascript Object

當您在某些語言內置工具(如Function.prototype.callFunction.prototype.apply )中使用原始值作為上下文( this )時,會隱式發生相同的調用模式。

即使用===替換==也會產生相同的結果,這是因為對象比較在JS中是如何工作的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM