Почему встроенная функция isValidSmi в V8 возвращает значение true для числа с плавающей запятой? - PullRequest
0 голосов
/ 27 мая 2020

Не понимаю, почему встроенная функция V8 %isValidSmi(2.2) возвращает true в Nodejs.

NodeJS версия: 8.9.4

Я думал, что номер SMI это что-то аналогично int32

1 Ответ

1 голос
/ 27 мая 2020

(здесь разработчик V8.) Короче говоря, потому что он выполняет преобразование NumberToInt32, прежде чем смотреть на значение.

Можно сказать, что это удивительный выбор реализации, и я действительно не могу вам сказать почему это было сделано именно так. Очевидно, для предполагаемых случаев использования этого внутреннего помощника результирующее поведение было приемлемым или даже желательным.

«внутренний помощник» - это ключевой термин. Внутренние «функции времени выполнения» V8 не предназначены для использования publi c, поэтому они не отображаются по умолчанию, они не указаны, не стандартизированы и не документированы, и обычно они довольно ограничивают аргументы, которые они принимают (для Например, %IsValidSmi({}) будет искать sh вместо того, чтобы возвращать false, потому что он не предназначен для обработки произвольных входных данных). Как разработчику V8 вам просто нужно взглянуть на код, чтобы узнать, выполняет ли данная функция времени выполнения то, что вам нужно, а как разработчик, не использующий V8, у вас не должно быть причин для беспокойства: -)

Помимо таких деталей реализации, вы правильно понимаете, что 2.2 не является допустимым Smi. Так получилось, что %IsValidSmi() не подходит для этого. FWIW, есть также %IsSmi(value), который проверяет, является ли value в настоящее время внутренне представленным как Smi, что заметно отличается от числа, которое могло бы быть представлено как Smi.

В любом случае, наша официальная рекомендация состоит в том, что ваш код не должен заботиться о том, какие значения V8 выбирает для представления как Smis. В частности, это также меняется с течением времени, как в ходе выполнения отдельной программы, так и по мере изменения версий V8.

...