簡體   English   中英

為什么 2 個空 JavaScript 函數或普通對象不相等

[英]Why are 2 empty JavaScript functions or plain objects not equal

在這段代碼中,我定義了兩個函數,將它們及其字符串表示輸出到控制台,並比較它們:

var a = function func() {},
    b = function func() {};

// string representations are equal
console.log(a.toString());
console.log(b.toString());
console.log(a.toString() == b.toString());
console.log(a.toString() === b.toString());

// functions seem to be equal
console.log(a);
console.log(b);

// but they're not really as this prints false
console.log(a == b);
console.log(a === b);

為什么它們不相等?

當然,空的普通對象也會發生同樣的情況,即{}

有趣的是 lodash isEqual在這種情況下返回true_.isEqual({}, {}); 在此為false_.isEqual(function () {}, function () {}) 但當然這不是任何證明,這只是實現平等的方式。

函數只不過是對象,所以這一切都回到了 2 個對象的比較,然后根據MDN

如果操作數的類型不同,則相等運算符會對其進行轉換,然后應用嚴格比較。 如果兩個操作數都是對象,那么當操作數引用內存中的同一個對象時,JavaScript 會比較內部引用是否相等。

ECMAScript® 語言規范中也描述了完整的相等比較算法,1.f 很明顯:

如果 x 和 y 引用同一個對象,則返回 true。 否則,返回false。

因此,按照設計,對象總是使用引用進行比較,引用是一種指向內存中地址的指針。 如果它指向相同,它將返回true ,如果不是false則產生。

這是因為函數是對象 在 javascript 中,您不能測試對象的相等性,例如

obj1 == obj2
obj1 === obj2

有關如何正確比較對象的信息,請參閱JavaScript 中的對象比較

就像兩個空盒子不相等,兩個雙胞胎不是同一個人一樣。

確定兩個函數的功能是相等的,但你不能單獨用相等的運算符來測試它。

函數是對象,就像兩個人類雙胞胎是不同的東西。 每個功能都是不同的東西。

您打算比較它們的價值,但您正在衡量它們的存在。 如果這是有道理的。

對於數字來說很簡單,它們的價值就是它們的存在。 但對於普通對象。 還沒有決定它們的價值是什么。 您可以將一個對象的所有屬性與其他屬性進行比較,看看它們是否都匹配。 那么你可以說它們是相同的對象,但仍然不能說它們是相同的。

字符串也是一樣,它們的價值是確定的。 字符串值被暗示為它所持有的文本。 當比較兩個字符串時,編譯器會檢查每個字符。 盡管 string 可能有其他屬性,但它們對 js 編譯器無關緊要。 這是一個很好的設計決策。

所以當你將函數的定義轉換為字符串時。 如果逐個字符進行比較,它恰好等於第二個函數的定義,這就是 == 運算符在處理字符串時所做的事情,將導致真實值。

當您比較 2 function , object ,它將比較變量的引用(地址),而不是值。

var a = function() {}, b = function() {};
(typeof a === typeof b) // true both are 'function'
(a() === b()); // true, both are undefined
(a === b) // false, different reference( address in memory).

/* more info */
var a = b = function() {};
(a === b) // true, they've same reference

 var objA = objB = { hi : 'hello'};
 objA === objB // true;
 objA.hi; // 'hello'
 objB.hi; // 'hello'
 objA.hi = 'aloha';
 objB.hi; // 'aloha';

 objB = null;
 objA === objB ; // false, objB was set new value and no longer hold the reference as objA anymore
console.log('now you got it!');

希望它可以幫助:)。

函數被視為對象。 當您嘗試登錄時,它們可能是相同的

const a = (c) => c
const b = (c) => c

console.log(typeof a) // returns "function"
console.log(typeof b) // returns "function"

它們的類型都返回“函數”。 另一個例子是這個

console.log(a(7)===b(7)) // returns true

類型和返回都是相同的。 但是,當您將其與 double equals 等同時,它會返回 false

console.log(a == b) // returns false

因為每個函數都有不同的 id 或實例。

函數是 JavaScript 世界中的一等對象公民。

暫無
暫無

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

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