Javascript JS双感叹号——有什么好的理由使用它吗?
我已经和一个同事讨论这个话题大约一个星期了。我非常喜欢速记代码,尽可能地使用ternaries等等。最近,他对我使用双重感叹词的事一直挑剔我。经过多次测试,我开始同意他的观点。。。在我的代码中使用双感叹号可能不明智。考虑这一点:Javascript JS双感叹号——有什么好的理由使用它吗?,javascript,operators,boolean,shorthand,Javascript,Operators,Boolean,Shorthand,我已经和一个同事讨论这个话题大约一个星期了。我非常喜欢速记代码,尽可能地使用ternaries等等。最近,他对我使用双重感叹词的事一直挑剔我。经过多次测试,我开始同意他的观点。。。在我的代码中使用双感叹号可能不明智。考虑这一点: var myvar = "Hello"; return (!!myvar ? "Var is set" : "Var is not set"); 上面的示例按预期工作。然而,如果我们检查一个可能返回未定义的变量,我们会得到一个错误,尤其是在IE7中。但是,如果我们在控
var myvar = "Hello";
return (!!myvar ? "Var is set" : "Var is not set");
上面的示例按预期工作。然而,如果我们检查一个可能返回未定义的变量,我们会得到一个错误,尤其是在IE7中。但是,如果我们在控制台中运行此命令,则会得到预期结果:
if(randomvar) alert('Works');
使用这种方法,如果变量未定义,它将以静默方式失败。这使我怀疑双重感叹词的用法。是否存在使该操作员受益的情况?
!!x
强制x
为布尔值,属性为x==!!x
和类型!!x==“布尔值”
。(如果您重写valueOf
,通常情况下可能不正确,但我现在不想考虑它。)有的有效用法代码>在javascript中。这是一个表达式,它将获取一个值并转换为布尔值true
或false
。它本质上是将当前状态强制为布尔值
这对双方都有好处
捕捉价值的真实性
释放原始对象以进行收集(应为最终引用)
有助于防止以后不正确地使用强制相等的对象(=
)。这并不能完全阻止它们,但将其强制为bool会删除一组场景李>
所以,我理解typeof!!x==“boolean”
及其背后的逻辑(!x
转换为反向布尔,!!x
反向,等等),但我想知道它是否本质上有问题?如果您强制转换一个未定义的变量,那么最终会出现脚本错误。我希望!!x==false
iftypeof!!x==“未定义”
,但事实并非如此。这似乎是更安全的选择:
if((typeof x != "undefined") && (x != null)) { ... }
有人能提供一个使用!!x
更合适吗?目前,我看不到使用它的好处
挠头…我在IE中测试了-!!未定义
返回false。我相信这是正确的行为
至于何处代码>是(或可能是)有用的
下面是一个例子:
假设您有一个接受参数的函数:
功能测试(参数)
{
如果(参数===真)
{
警报(“正常”);
}
}
使用以下命令调用:test(1)
将不会弹出警报窗口-尽管通常认为1是true
或true
-ish值。是的,有人可能会争辩说,传递currect数据类型取决于团队中的一致意见和每个开发人员的责任——但是JavaScript中正确的数据类型是什么?尤其是当你没有编译器来验证哪个是哪个的时候
因此,在上面的情况下,我将使用if(!!param)
而不是if(param==true)
(使用单词“truthiness”时向上投票!)这是一个很好的解释,值得注意的是,当您像这样使用此运算符时:return!!(window.Object&(obj1.function1 | | obj.2function2))代码>它将整个“强制转换”扩展到所有内容。转换所有内容.jpeg!!param
和param===true
不相同<代码>!!param
将为每个“falsy”值返回false
,未定义的,NaN
),而param===true
仅在param
为布尔类型且设置为“true”时返回true
。正如您所说,如果团队同意该类型应为布尔类型,则不要将其传递给其他类型。我个人在将参数传递到函数中时,如果需要严格的类型,我会使用将参数命名为与其类型相关的东西的约定,作为提醒。像功能巧克力海星(xInt,yBool){//stuff}代码>等。