这两个比较有什么区别?

shm*_*uli 3 javascript function

这有什么区别......

(function () {})() === (function () {})()
// => true
Run Code Online (Sandbox Code Playgroud)

还有这个...

(function () {}) === (function () {})
// => false
Run Code Online (Sandbox Code Playgroud)

先前的比较评估为true,而后者评估为false.这是为什么?

Seb*_*mon 8

(function () {})()
Run Code Online (Sandbox Code Playgroud)

是一个IIFE(立即调用函数表达式).这意味着,它是一个立即执行的函数,它的实际值是它的return值.此函数没有return语句,因此值为undefined.undefined === undefinedtrue.

(function () {})
Run Code Online (Sandbox Code Playgroud)

但是,是一个功能.函数不是原始值,而是像对象一样.在JavaScript中,比较对象(或函数)时,会比较引用.因为这两个(function () {})S创建一个新的功能,这些都不是相同的功能,因此比较产生false.


the*_*eye 5

在第一种情况下,

(function () {})() === (function () {})()
Run Code Online (Sandbox Code Playgroud)

你创建两个不同但相似的函数对象 ; 执行它们然后比较它们的结果.由于这两个函数都没有显式返回任何内容,因此undefined默认情况下会返回JavaScript .所以,这有效地变成了

undefined === undefined
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,

(function () {}) === (function () {})
Run Code Online (Sandbox Code Playgroud)

您创建两个不同但相似的函数对象并进行比较.该===操作将返回true,只有在两个相关的函数对象是相同的.因为它们在这种情况下是不同的,所以它返回false.让这种比较返回true的唯一方法是比较相同的函数,就像这样

var func = (function () {});
console.log(func === func);
// true
Run Code Online (Sandbox Code Playgroud)