我最近一直在努力教自己Javascript,并且我注意到各种不同作者使用的几种略显古怪的语法选择.通常我可以把它们搞清楚,但是这个让我感到困惑.
The author of the post here创建一个空对象colors,它将包含页面中每种背景颜色的一组属性.每个颜色属性的值等于该颜色覆盖的总面积.为此,他使用以下语法:
// ...set or override it in the colors object,
// adding the current element area to the
// existing value.
colors[bgColor] = (colors[bgColor] >> 0) + nodeArea;
此时,由bgColor的值命名的属性可能存在也可能不存在于对象中.如果这是第一次看到颜色,则括号中表达式的意图可能是返回运行总计或0.我的问题是,这是右移操作符过载而我正在寻找错误的名称,或者为什么右移这样做?
解决方法:
The intent of the expression in the parenthesis is presumably to return the running total or 0 if this is the first time the color is seen. My question is, is this the right shift operator being overloaded and I’m searching for the wrong name, or why does the right shift behave this way?
它没有重载(JavaScript没有运算符重载).它依赖于undefined>>这一事实0是0且anyNumber>> 0是anyNumber(需要注意的警告).如果该属性尚不存在,查找它会产生未定义的,因此>> 0将其转换为0.如果属性已定义且包含适合32位的整数,则>> 0返回数字而不更改它. (如果数字有一个小数部分,它被截断,如果它不适合32位,如果我正确读取它是wrapped,但我不认为这是编码器试图做的.)所以通过这样做,然后添加区域,他们确实增加了一个运行总计(或者如果它还没有那么初始化它).
它主要是一个速记版本:
if (colors[bgColor]) {
colors[bgColor] += nodeArea;
}
else {
colors[bgColor] = nodeArea;
}
…(因为任何假值>>> 0都是0)但添加的特性是它总是会产生非NaN数,前提是nodeArea是非NaN数,而有一些真正的非数字值colors [bgColor]({},例如),上面的“long”版本会产生一个字符串或NaN.