Согласно Wikipedia, modulo operator (остаток целочисленного деления) на n
должен давать результат между 0
и n-1
.Javascript modulo operator ведет себя иначе, чем другие языки
Это действительно так в python
:
print(-1%5) # outputs 4
В Ruby
:
puts -1%5 # outputs 4
В Haskell
main = putStrLn $ show $ mod (-1) 5
Но в Javascript
:
console.log(-1%5);
Результат: -1
!!
Почему? есть ли логика этого дизайнерского решения?
В то время как -1
эквивалентно 4
по модулю 5
, отрицательные значения затрудняют использование в качестве показателей.
Например:
arr[x%5]
всегда будет допустимым выражением в python
и Ruby
, когда длина массива больше, чем 5
, но в Javascript
, это исключение для того чтобы случиться.
Вы ссылаетесь на Википедию, но в ней четко указано: «Если либо a, либо n отрицательно, наивное определение ломается, а языки программирования различаются в зависимости от того, как определяются эти значения». Так что это не значит, что языки прогамминга нарушают его, поскольку вы тоже претензии. – vlaz
Очевидно, что это так, вопрос в том, почему? –
Также я не вижу, как 'arr [x% 5]' является 'исключением, ожидающим, чтобы произойти' в JS - если вы передадите отрицательное число, вы получите отрицательный результат, так что вы получите' undefined' , Если бы оператор действительно работал как python или что-то еще, тогда он даст вам элемент _random_ из массива. Таким образом, у вас может быть ошибка и никогда не найти ее до конца позже, потому что она _seems_ нравится, как работает. – vlaz