【问题标题】:Comparison of strict equality of objects in JS [duplicate]JS中对象严格相等的比较[重复]
【发布时间】:2018-09-20 17:45:41
【问题描述】:

我正在查看规范:

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6

http://www.ecma-international.org/ecma-262/5.1/#sec-9.12

我已经看到 JS 代码这样做了:

var a = function(){}
var b = function(){}
var c = a;

console.log(a === b);
console.log(a === c);

代码按预期工作,它似乎使用严格相等 - 它不会将函数转换为字符串然后比较字符串 - 这太疯狂了 - 它使用内存地址或类似 Java 的东西,对吧?

它实际上是如何工作的?有人知道吗?规范似乎没有提到函数比较或对象。

【问题讨论】:

  • ac 是同一个对象。 JS 具有按值共享的语义。
  • 注意,我第一次看到函数标识比较是在 Node.js 事件发射器库中,所以很常用
  • @elclanrs 是的,JS 知道某物是否指的是同一个确切的对象,但如何
  • 换一种说法,作为 JS 的最终用户,我无法像其他语言那样获取对象的内存地址。例如,为了比较 Java 中的严格相等性,我们比较内存位置。
  • @AlexanderMills — 哦,我引用的是当前规范 ECMAScript 2017,而您引用了 ECMA-262 ed 5.1。我没有指向 EMCAScript 2018 的链接,我想它会在它发布时提供,也许是在 6 月?最新的草稿是ECMAScript 2019

标签: javascript node.js


【解决方案1】:

它使用内存地址或类似 Java 的东西,对吧?

差不多。引用对象的变量本质上是对内存位置的引用——对象(和函数)只有在它们引用内存中的相同位置时才相等。因此,{ foo: 'bar' } !== { foo: 'bar' } 因为每个对象都是单独创建的。

不过,所有非对象(原语)都可以考虑按进行比较。

【讨论】:

  • 但是它是如何获取内存位置的呢?如果引擎能得到它,我应该也能在运行时得到它
  • 这一切都在幕后——除了与===进行比较时,没有办法找出任何特定函数或对象的内存地址——这对于Javascript来说太低级了对程序员可见。
  • 是的,很遗憾,我很奇怪 C/C++ 可以知道内存位置,但我们无法在 JS 领域获得它。哦,好吧。
  • 它不在规范中也很奇怪,但也许它在规范中,我只是没有挖得那么深
  • 在 NodeJS 中无需获取内存地址,因为内存会自动为您管理。仍然有一些方法可以将相同的功能与缓冲区一起用于高性能应用程序。一般来说,如果您真的需要 内存管理,那么您可能不需要 JavaScript。 There are ways in V8/Node to use C++ code if needed。 JS 中缺乏内存管理也部分是由于 JavaScript 在浏览器中产生的残余物,出于安全原因,您不希望它具有内存访问权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多