【发布时间】:2017-04-03 04:28:09
【问题描述】:
根据 Wikipedia,n 上的 modulo operator(整数除法的余数)应产生介于 0 和 n-1 之间的结果。
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]
当数组长度大于5 时,在python 和Ruby 中始终是有效表达式,但在Javascript 中,这是一个等待发生的异常。
【问题讨论】:
-
你引用了维基百科,但它明确指出
When either a or n is negative, the naive definition breaks down and programming languages differ in how these values are defined.所以它不像你声称的那样违反它。 -
显然是这样,问题是为什么?
-
另外我看不出
arr[x%5]在 JS 中是怎样的an exception waiting to happen- 如果你传入一个负数,你会得到一个否定的结果,所以你会得到undefined。如果该运算符确实像 python 或其他什么那样工作,那么它将为您提供数组中的 random 元素。所以你可能有一个错误,直到很久以后才发现它,因为它似乎可以工作。 -
至于“为什么”是这样的——你上次链接的骗子确实有答案——
%被视为“给我剩下的”。这似乎是基本原理。 -
最终结果是
%n函数在应用于其他语言时具有n可能值(例如python,ruby,haskell)但在javascript中它具有2n-1可能的值
标签: javascript division modulo