Javascript:为什么要与null进行比较?
我参与的一个开源JavaScript项目包括以下代码:Javascript:为什么要与null进行比较?,javascript,Javascript,我参与的一个开源JavaScript项目包括以下代码: if (color) { tapeDiv.style.backgroundColor = color; // set color here if defined by event. Else use css } 一个贡献者想将其更改为 if (color != null) { // this line changed tapeDiv.style.backgroundColor = color;
if (color) {
tapeDiv.style.backgroundColor = color;
// set color here if defined by event. Else use css
}
一个贡献者想将其更改为
if (color != null) { // this line changed
tapeDiv.style.backgroundColor = color;
// set color here if defined by event. Else use css
}
颜色是字符串变量。只有超过0个字符的字符串才能显式设置颜色
既然JS将“”和null强制转换为布尔值false,为什么要进行比较!=需要空值吗
我认为第一种形式和第二种形式一样好(而且稍微短一点),这是不是遗漏了什么
我在JS源代码中经常看到与null的比较。当所有JS简单对象都转换为布尔值时具有已知结果时,为什么需要它们
谢谢
拉里
另外,我假设如果0(一个整数)是一个有效的案例,那么如果(0)为false[一个问题],如果(0!=null)为true[允许0案例]。还有其他原因吗
pps。应该提到tapeDiv是新创建的。因此,没有必要将样式重置为“”,因为div是全新的。没有,而且您的ps是正确的。Null的计算结果为false,如果需要将Null与空字符串或0区分开来,则需要执行Null检查 或者只是为了清楚起见。更具描述性的是,表示您特别查找null。backgroundColor=“”有什么作用吗?这是否将颜色设置为默认颜色?如果是这样的话,那么作为重置颜色的一种方式,它是有意义的 如果(颜色){}
如果颜色为“”,则将失败,但在第二种情况下,它将重置背景颜色。如果颜色可以作为整数输入,则无法将背景设置为黑色(
\000000
=0
)。使用所有可能的错误值评估分配,您将得到答案:
tapeDiv.style.backgroundColor = false; // does nothing
tapeDiv.style.backgroundColor = 0; // sets as "black",
// but ignored by FF
tapeDiv.style.backgroundColor = null; // resets the background-color
// to use whatever is defined
// in a stylesheet (if any),
// but ignored by IE.
tapeDiv.style.backgroundColor = ''; // resets the background-color
// to use whatever is defined
// in a stylesheet (if any).
对“if(color)
”的检查将不允许任何人通过
检查“if(color!=null)
”将允许1)、2)和4)通过。1) 不做任何事情,2)在Firefox中无法按预期工作,4)始终按预期工作。但是,“工作”取决于您的上下文(您没有提供)
希望有帮助
只能使用超过0个字符的字符串来显式设置颜色
为什么??分配空字符串意味着颜色将被重置(即将使用CSS定义的默认值),这是一个非常有效的用例
您所要做的就是检查是否定义了color
,即
typeof color !== 'undefined'
或者如果它是一个字符串变量
// checks for primitive strings
typeof color === 'string'
// checks for primitive strings and string objects
typeof color === 'string' || color instanceof String
// checks for primitive strings and string objects, cross-frame safe
Object.prototype.toString.call(color) === '[object String]'
如果它可能包含不正确类型的值。if(typeof color=='string'&&color.length)
对于typeof,使用“==”就足够了,如果typeof是字符串,那么它将检查color.length。否则,它将在检查第二个条件之前退出。我相信这是最完整的解决办法
但是,如果您确定颜色是一个字符串变量,并且在初始化之前在某个地方定义了颜色,那么您可以像以前一样使用“if(color)”,但是请记住,如果在if语句的那一刻没有定义颜色,您将得到一个ReferenceError。对我来说,我希望代码稍微短一点,并假设读者理解种姓和布尔逻辑。也许这就是我身上的Ruby程序员。js中的传统做法可能是更详细地解释事情……通常不是这样。记住,JS的源代码实际上是下载的,所以简洁是一个加号。我同意拉里的看法。避免承认JS打字和铸造的工作方式是没有用的。但是jpot(下面)理解将样式设置为0不会在FF上显示黑色,所以不应该使用。这是最全面的答案。简洁并不比确定性行为更重要。