【问题标题】:Pro and cons of using util.inspect for checking deep object equality使用 util.inspect 检查深度对象相等性的优缺点
【发布时间】:2018-10-28 18:26:25
【问题描述】:

在节点的util 模块中使用inspect 函数来检查深度对象相等性,在准确性和性能方面的优缺点是什么?我相信它至少比 JSON.stringify() 更全面

下面的一些节点日志说明了 util.inspect 优于 toString() 和 JSON.stringify() 的准确性:

> ([1,2, undefined]).toString()
'1,2,'
> ([1,2,null]).toString()
'1,2,'

 JSON.stringify([1,2,null])
'[1,2,null]'
> JSON.stringify([1,2,undefined])
'[1,2,null]'

> require("util").inspect([1,2,undefined])
'[ 1, 2, undefined ]'
> require("util").inspect([1,2,null])
'[ 1, 2, null ]'
> require("util").inspect([1,2,"null"])
'[ 1, 2, \'null\' ]'

但我担心任何问题,以及性能影响。

【问题讨论】:

  • IMO 使用JSON.stringify() 深入比较对象并不是一个好主意,因为它可能以不同的方式失败,首先是字符串化本身,例如当对象中有循环引用时。 Stringify 也会忽略你对象中的函数
  • 嗨@kaddath,是的,我知道 JSON.stringify 的问题,这就是为什么我要询问 util.inspect 作为替代方案
  • 您的目标是只检查相等还是检测差异?因为对于第一种情况,我看到有一个函数util.isDeepStrictEqual 返回一个布尔值,似乎就是为此而生的。对于你必须测试的性能,我不知道,但我觉得它可能应该比stringify 慢一点,因为它必须采取额外的措施来处理边缘情况stringify 没有

标签: javascript node.js equality


【解决方案1】:

使用util.inspect 检查深层对象相等性基本上有两个缺点:

  • 字符串转换:性能未优化
  • 不处理极端情况,例如:
    • util.inspect({x: 10, y: 20}) == '{ x: 10, y: 20 }'util.inspect({y: 20, x: 10}) == '{ y: 20, x: 10 }'(顺便说一句,是的,keys are ordered in ES6
    • 两次检索相同的 WeakSet 条目可能会导致不同的输出

使用JSON.stringifyutil.inspect 检查深度对象相等性可能成功率为 99%,但正是这 0.1% 的奇怪极端情况仍然不适合正确的生产代码。

幸运的是,util 提供了专门为深度对象相等而设计的isDeepStrictEqual:它比util.inspect(无字符串转换)更高效,使代码更清晰(而不是比较转换后的字符串,直接比较对象使用一个人类可读的函数),并处理所有极端情况。

【讨论】:

    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2017-06-07
    • 2015-12-23
    • 2015-07-19
    • 2016-01-31
    相关资源
    最近更新 更多