在Javascript中用于对象的Bitshift运算符

use*_*313 4 javascript syntax operators

我最近一直在努力教自己Javascript,并且我注意到各种不同作者使用的几种略显古怪的语法选择.通常我可以把它们搞清楚,但是这个让我感到困惑.

这篇文章的作者创建了一个空对象colors,它将包含页面中每种背景颜色的一组属性.每个颜色属性的值等于该颜色覆盖的总面积.为此,他使用以下语法:

// ...set or override it in the colors object,
// adding the current element area to the
// existing value.
colors[bgColor] = (colors[bgColor] >> 0) + nodeArea;
Run Code Online (Sandbox Code Playgroud)

此时,由bgColor的值命名的属性可能存在也可能不存在于对象中.如果这是第一次看到颜色,则括号中表达式的意图可能是返回运行总计或0.我的问题是,这是右移操作符过载而我正在寻找错误的名称,或者为什么右移这样做?

T.J*_*der 5

如果这是第一次看到颜色,则括号中表达式的意图可能是返回运行总计或0.我的问题是,这是右移操作符过载而我正在寻找错误的名称,或者为什么右移这样做?

它没有重载(JavaScript没有运算符重载).它依靠的事实,undefined >> 00anyNumber >> 0anyNumber(警告跟随).如果该属性尚不存在,那么查找它就会产生undefined,因此>> 0将其转化为0.如果该属性定义,并包含适合在32位的整数,>> 0返回的数量而不改变它.(如果数字有一个小数部分,它被截断,如果它不适合32位,如果我正确读取它就会被包裹,但我不认为那是编码器试图做的.)所以通过这样做,然后添加区域,他们确实增加了一个运行总计(或者如果还没有那么初始化它).

它主要是一个速记版本:

if (colors[bgColor]) {
    colors[bgColor] += nodeArea;
}
else {
    colors[bgColor] = nodeArea;
}
Run Code Online (Sandbox Code Playgroud)

...(因为任何假值>> 0都是0)但是增加的特征是它总是会导致NaN提供nodeArea的非NaN数字是非数字,而对于colors[bgColor]({}例如)有一些真实的非数字值,"长" "上面的版本会导致字符串或在NaN.

  • 请注意,由于我在问题评论中注意到的细微差别,它实际上更像是`if(!_.isNumber(colors [bgColor]))`其中`_.isNumber`来自underscorejs.对于绝大多数情况来说,这种差异几乎肯定无关紧要 (2认同)