繁体   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