За и против использования util.inspect для проверки глубокого равенства объектов - PullRequest
0 голосов
/ 18 мая 2018

Каковы плюсы и минусы использования функции проверки в модуле util узла для проверки глубокого равенства объектов с точки зрения точности и производительности?Я считаю, что он, по крайней мере, более всеобъемлющий, чем 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\' ]'

Но меня беспокоят любые ошибки, а также последствия для производительности.

1 Ответ

0 голосов
/ 09 апреля 2019

Существует два основных недостатка использования util.inspect для проверки глубокого равенства объектов:

  • преобразование строки: неоптимизированная производительность
  • не обрабатывает угловые случаи, например:
    • util.inspect({x: 10, y: 20}) == '{ x: 10, y: 20 }' но util.inspect({y: 20, x: 10}) == '{ y: 20, x: 10 }' (кстати, да, в ES6 упорядочены ключи )
    • извлечение одинаковых записей WeakSet дважды может привести к разным выводам

Проверка на глубокое равенство объектов может быть на 99% успешной с JSON.stringify и на 99,9% успешной с util.inspect, но именно этот 0,1% странных угловых случаев все еще делает ее непригодной для правильногопроизводственный код.

К счастью, util предоставляет isDeepStrictEqual, который был разработан специально для глубокого равенства объектов: он более производительный, чем util.inspect (без преобразования строк), делает код чище(вместо того, чтобы сравнивать преобразованные строки, сравнивайте непосредственно объекты, используя удобочитаемую функцию), и обрабатывает все угловые случаи.

...