为什么2个空JavaScript函数或普通对象不相等

时间:2015-06-25 22:31:06

标签: javascript function

在这段代码中,我定义了两个函数,将它们和字符串表示输出到控制台,并比较它们:

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 () {})。但当然,这不是任何证据,它只是实现平等的方式。

6 个答案:

答案 0 :(得分:2)

这是因为函数是对象。在javascript中,您无法像

那样测试对象的相等性
obj1 == obj2
obj1 === obj2

有关如何正确比较对象的信息,请参阅Object comparison in JavaScript

答案 1 :(得分:2)

函数只不过是对象,所以这一切都回到了2个对象的比较,然后根据MDN

  

如果操作数不是,则等于运算符会转换操作数   相同的类型,然后应用严格的比较。如果两个操作数都是   对象,然后JavaScript比较相同的内部引用   当操作数引用内存中的同一个对象时。

ECMAScript® Language Specification中描述了完全相等比较算法,1.f显而易见:

  

如果x和y引用同一个对象,则返回true。否则,返回   假的。

因此,设计对象总是使用引用进行比较,引用是指向内存中地址的指针。如果它指向相同,则会返回true,如果不是false则生成。

答案 2 :(得分:1)

就像两个空盒子不相等以及两个双胞胎不是同一个人一样。

当然,两个函数的功能是相同的,但你不能仅使用相同的运算符来测试它。

函数是对象,就像两个人类双胞胎是不同的东西。每个功能都是另一回事。

你的意思是比较它们的价值,但你正在衡量它们的存在。如果这是有道理的。

对于简单的数字,它们的价值在于它们的存在。但对于普通物体。它没有决定它们的价值。您可以将对象的所有属性与其他属性进行比较,看看它们是否都匹配。然后你可以说它们是相同的物体,但仍然不能说它们是相同的。

字符串相同,它们的价值是明确的。字符串值隐含在它所持有的文本中。而当比较两个字符串编译器遍历每个字符。尽管string可能有其他属性,但它们对js编译器并不重要。这是一个很好的设计决策。

所以当你将函数的定义转换为字符串时。它恰好等于第二个函数的定义,如果逐个字符进行比较,这就是==运算符在处理字符串时会做的事情,会导致真值。

答案 3 :(得分:0)

当您比较2 functionobject时,它会比较变量的引用(地址),而不是值。

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!');

希望它可以帮助:)。

答案 4 :(得分:0)

函数被视为对象。当您尝试登录时,它们可能是相同的

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 或实例。

答案 5 :(得分:-1)

函数是JavaScript世界中的第一类对象公民。