Мы можем ссылаться на спецификацию, и это замечательно и точно, но большинство случаев также можно объяснить более понятным образом со следующими утверждениями:
+
и -
работают только с примитивными значениями. Более конкретно +
(дополнение) работает с любыми строками или числами, а +
(унарный) и -
(вычитание и унарный) работает только с числами. valueOf
или toString
, которые доступны для любого объекта. Вот почему такие функции или операторы не вызывают ошибок при вызове на объекты. Таким образом, мы можем сказать, что:
[] + []
как String([]) + String([])
, который аналогичен '' + ''
. Я упомянул выше, что +
(дополнение) также справедливо для чисел, но в JavaScript нет допустимого числа в массиве, поэтому вместо этого используется добавление строк. [] + {}
такое же, как String([]) + String({})
, который аналогичен '' + '[object Object]'
{} + []
. Это заслуживает большего объяснения (см. Ответ Вентеро). В этом случае фигурные скобки обрабатываются не как объект, а как пустой блок, поэтому он оказывается таким же, как +[]
. Unary +
работает только с числами, поэтому реализация пытается получить номер из []
. Сначала он пытается valueOf
, который в случае массивов возвращает один и тот же объект, поэтому он пытается использовать последнее средство: преобразование результата toString
в число. Мы можем записать его как +Number(String([]))
, который аналогичен +Number('')
, который аналогичен +0
. Array(16).join("wat" - 1)
вычитание -
работает только с числами, поэтому это то же самое, что: Array(16).join(Number("wat") - 1)
, поскольку "wat"
не может быть преобразовано в действительное число. Мы получаем NaN
, и любая арифметическая операция на NaN
получается с NaN
, поэтому мы имеем: Array(16).join(NaN)
. Я предполагаю, что вы не можете полагаться на управление версиями сборки, чтобы ответить на этот вопрос.
Быстрый поиск в google обнаружил это сообщение Скотта Хансельмана , которое указывает на несколько инструментов, которые могут решить вашу проблему.
Почему бы не использовать Dependency Walker? Скопируйте все экспортированные функции в текстовый файл. Повторите то же самое с другой DLL. Затем сравните два текстовых файла.
Я сделал это один раз, чтобы исправить ошибку 127, в которой говорилось, что не удалось загрузить DLL из-за отсутствия «неизвестной» зависимости.
Я постоянно использую WinMerge для выполнения этой задачи. Вы даже можете сравнивать целые каталоги. Это, конечно, если вам просто нужно знать, одинаковы ли они, поскольку он не покажет вам никакого кода.
Изменить: Для подсказок непрограммного определения см. Ответ confusedGeeks: -)
Я бы использовал сборку SN для определения «версии», тогда;
Если ABI не отражается в версии, выполните вторичную md5sum для файлов или выполните рефлексивное сравнение двух сборок. Конечно, md5sum «уловит» внутренние изменения / изменения компиляции, даже если ABI не изменился. Отражение ABI, хотя и более сложное и потенциально медленное, может точно определить изменения ABI.
Самым простым и достаточным может быть просто «перезаписать» любую сборку той же версией (и оставить предыдущие / более поздние версии до тех пор, пока они не будут удалены тем, кто их поставил).