Javascript模运算符的行为与其他语言不同
根据维基百科的说法,Javascript模运算符的行为与其他语言不同,javascript,division,modulo,Javascript,Division,Modulo,根据维基百科的说法,n上的(整数除法的余数)应该产生一个介于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,但负值使其更难用作索引 例如: ar
n
上的(整数除法的余数)应该产生一个介于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
中,这是一个等待发生的异常。如果通过“模”理解欧几里德除法的剩余部分在数学中是常见的,则不是模运算符。它被称为余数运算符,其结果总是与被除数具有相同的符号。(在哈斯凯尔,这一点由政府负责)
这种行为在编程语言中非常常见,尤其是在C和Java中,JavaScript的算术约定就是从这两种语言中产生的。如果通过“模”理解欧几里德除法的剩余部分在数学中很常见,则不是模运算符。它被称为余数运算符,其结果总是与被除数具有相同的符号。(在哈斯凯尔,这一点由政府负责)
这种行为在编程语言中非常常见,尤其是在C和Java中,JavaScript的算术约定就是从这两种语言中产生的。您参考了Wikipedia,但它清楚地说明了当a或n为负时,幼稚的定义出现了问题,编程语言在定义这些值的方式上有所不同。
因此,编程语言并不像您所说的那样违反了它。很明显,情况就是这样,问题是为什么?我也不知道arr[x%5]是如何定义的
在JS中是一个等待发生的异常
——如果你传入一个负数,你会得到一个负数,因此你会得到未定义的
。如果操作符确实像python或其他什么东西一样工作,那么它将从数组中给您一个随机元素。所以你可能会有一个bug,直到后来才发现它,因为它似乎是有效的。至于“为什么”是这样的-上次链接到的DUP确实有答案-%
被视为“给我剩余的”。这似乎就是基本原理。最终结果是%n
函数在其他语言中应用时具有n
可能的值(例如python
,ruby
,haskell
)但是在javascript
中,它有2n-1
可能的值,您可以参考维基百科,但它清楚地指出当a或n为负时,幼稚的定义出现了问题,编程语言在定义这些值的方式上有所不同。
因此,编程语言并不像您所说的那样违反了它。很明显,情况就是这样,问题是为什么?我也不知道arr[x%5]是如何定义的
在JS中是一个等待发生的异常——如果你传入一个负数,你会得到一个负数,因此你会得到未定义的
。如果操作符确实像python或其他什么东西一样工作,那么它将从数组中给您一个随机元素。所以你可能会有一个bug,直到后来才发现它,因为它似乎是有效的。至于“为什么”是这样的-上次链接到的DUP确实有答案-%
被视为“给我剩余的”。这似乎就是基本原理。最终的结果是%n
函数在其他语言(例如python
,ruby
,haskell
)中应用时具有n
可能值,但在javascript
中它具有2n-1
可能值