在这段代码中,我定义了两个函数,将它们和字符串表示输出到控制台,并比较它们:
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 () {})
。但当然,这不是任何证据,它只是实现平等的方式。
答案 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 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!');
希望它可以帮助:)。
答案 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世界中的第一类对象公民。