我最近一直在尝试自学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。我的问题是,这是右移操作符过载而我正在寻找错误的名称,或者为什么右移这样做?
答案 0 :(得分:5)
括号中表达式的意图可能是返回运行总计,如果这是第一次看到颜色,则返回0。我的问题是,这是右移操作员是否过载而我正在寻找错误的名称,或者为什么右移这样做?
它没有超载(JavaScript没有运营商重载)。它依赖于undefined >> 0
为0
而anyNumber >> 0
为anyNumber
这一事实(需要注意的事项)。如果该属性尚未存在,则查找它会产生undefined
,因此>> 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
。
答案 1 :(得分:1)
这只是避免if
条件的伎俩之一。当您使用bgColor
中的值创建属性时,您可能会执行类似这样的操作
if (colors[bgColor] === undefined) {
colors[bgColor] = 0;
}
colors[bgColor] += nodeArea;
这是为了确保初始值为0,如果bgColor
中没有colors
,则undefined
将是值。因此,为避免这种情况,如果我们可以将undefined
转换为0
,我们可以简单地避免if
条件。
console.log(undefined >> 0);
# 0
因此,如果colors[bgColor] >> 0
尚未定义,bgColor
将为0,否则实际值为原样,因为右移0并不会改变实际值。
答案 2 :(得分:1)
可能是尝试将颜色值转换为32位值,因为Javascript通常将所有值存储为IIRC 64位浮点数(具有53位精度),但在按位运算时,它将它们视为32位整数。这可能是在添加NodeArea之前强制要对值进行处理的尝试。
我认为它也会强制它被解释为一个数字,但NodeArea的隐式类型通常会产生这种效果。
编辑 - T.J. Crowder还提出了另一个我试图从MDN中找到但没有找到的点:如果属性不存在,则操作的返回值将为0,因此也设置该值。面对他的整个帖子提出了一个很好的观点:P。