Как сравнить содержимое двух библиотек?

Мы можем ссылаться на спецификацию, и это замечательно и точно, но большинство случаев также можно объяснить более понятным образом со следующими утверждениями:

  • + и - работают только с примитивными значениями. Более конкретно + (дополнение) работает с любыми строками или числами, а + (унарный) и - (вычитание и унарный) работает только с числами.
  • Все нативные функции или операторы, которые ожидают примитивное значение как аргумент, сначала преобразует этот аргумент в нужный примитивный тип. Это делается с помощью 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).
11
задан Lanorkin 21 March 2014 в 11:28
поделиться

4 ответа

Я предполагаю, что вы не можете полагаться на управление версиями сборки, чтобы ответить на этот вопрос.

Быстрый поиск в google обнаружил это сообщение Скотта Хансельмана , которое указывает на несколько инструментов, которые могут решить вашу проблему.

7
ответ дан 2 December 2019 в 20:39
поделиться

Почему бы не использовать Dependency Walker? Скопируйте все экспортированные функции в текстовый файл. Повторите то же самое с другой DLL. Затем сравните два текстовых файла.

Я сделал это один раз, чтобы исправить ошибку 127, в которой говорилось, что не удалось загрузить DLL из-за отсутствия «неизвестной» зависимости.

3
ответ дан 2 December 2019 в 20:39
поделиться

Я постоянно использую WinMerge для выполнения этой задачи. Вы даже можете сравнивать целые каталоги. Это, конечно, если вам просто нужно знать, одинаковы ли они, поскольку он не покажет вам никакого кода.

3
ответ дан 2 December 2019 в 20:39
поделиться

Изменить: Для подсказок непрограммного определения см. Ответ confusedGeeks: -)

Я бы использовал сборку SN для определения «версии», тогда;

Если ABI не отражается в версии, выполните вторичную md5sum для файлов или выполните рефлексивное сравнение двух сборок. Конечно, md5sum «уловит» внутренние изменения / изменения компиляции, даже если ABI не изменился. Отражение ABI, хотя и более сложное и потенциально медленное, может точно определить изменения ABI.

Самым простым и достаточным может быть просто «перезаписать» любую сборку той же версией (и оставить предыдущие / более поздние версии до тех пор, пока они не будут удалены тем, кто их поставил).

2
ответ дан 2 December 2019 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: