有什么理由用!!而不是JavaScript中的布尔()?
我知道Boolean()、String()和Number()转换,以及有什么理由用!!而不是JavaScript中的布尔()?,javascript,Javascript,我知道Boolean()、String()和Number()转换,以及'+…,和+…转换方法 我想知道是否有任何理由不使用函数构造函数?可能只是使用更少的字符,使脚本更紧凑。我可以想到7: B o o l e a n 通常使用通常是不受欢迎的,因为以前没有见过它的人不清楚它的实际用途是什么。也就是说,它不到Boolean()字符的三分之一 此外,我不确定您在Javascript中实际需要转换为布尔值的频率,因为它通常是隐式转换的,因为Javascript是弱类型的。将new运算符与这些函数构造函
'+…
,代码>和+…
转换方法
我想知道是否有任何理由不使用函数构造函数?可能只是使用更少的字符,使脚本更紧凑。我可以想到7:
B
o
o
l
e
a
n
通常使用
通常是不受欢迎的,因为以前没有见过它的人不清楚它的实际用途是什么。也就是说,它不到Boolean()
字符的三分之一
此外,我不确定您在Javascript中实际需要转换为布尔值的频率,因为它通常是隐式转换的,因为Javascript是弱类型的。将new
运算符与这些函数构造函数一起使用可能会对typeof
运算符产生不可靠的影响。(编辑:正如注释正确指出的那样,这仅在使用new Boolean()
而不是Boolean()
时发生)
比如说,
var f = new Boolean(true);
if(typeof(f)==="boolean") {//false, since its an object, not boolean
....
}
有一些很好的例子 我发现对这些类型使用new
会导致容易混淆或棘手的错误:
var x = new Boolean(true);
console.log( x ); // true
console.log( typeof x ); // "object"
var y = new Boolean('false');
console.log( y ); // true
console.log( typeof y ); // "object"
var z = false;
console.log( z ); // false
console.log( typeof z ); // "boolean"
这不应该是一个问题,但是有人可以用他们自己的函数替换布尔值
函数,使这两种方法不等价。例如:
Boolean = function(x) {
alert('Evil');
return !x; // Oops
}
var x = 0;
console.log(!!x); // false
console.log(Boolean(x)); // true
这主要是一个理论上的差异,因为您不应该替换内置构造函数,但这是一个差异
由于名称查找和函数调用开销的原因,性能也可能存在微小差异。但在大多数情况下,我不会担心这两个问题。只需使用您喜欢的版本。
和其他都是无意的语法糖。我更喜欢构造函数方法,因为它更具可读性。如果你通过一个压缩器/缩微器来运行它,它可以将它转换成更丑陋、更紧凑的版本。代码>在我看来是完全可读的。我更喜欢那些快捷方式。不,两种方法产生相同的结果。@Travis:老实说,这是个坏例子。那个看起来很难看,因为那只是四个难看的标记。另外,您只需删除第一个中的空格。我的意思是,例如,!!someVariable
非常紧凑和漂亮。
和其他语言也可以使用,比如PHP,顺便说一句。如果没有new
关键字,它也可以正常工作typeof Boolean(1)==“Boolean”
。OP指的是Boolean()
,而不是new Boolean()
。这是两件不同的事情。另外,new
是一个运算符,而不是构造函数。@Sime Vidas已修复,并添加了一个说明,说明它不适用于未使用new
的情况。谢谢老实说,如果有人对JavaScript不太熟悉,不知道“!!”是什么意思,我不太确定我是否希望有人弄乱我的代码。:-)@尖刻的是,我认为可能有很多优秀的程序员没有接触过如果不停下来思考或查找它,就不会知道它试图做什么。我想我从没见过代码>在JS中使用,大多数情况下是在C/C++中使用的。就我个人而言,作为一名业余程序员,我已经见过很多次了。不过,我明白你的意思。我猜是否使用代码>取决于人们必须遵守的代码准则。我对此不是百分之百认真的,但我确实认为即使是不熟悉JavaScript的优秀程序员也应该真正研究它,因为有很多地雷——特别是对于长期以来以这种方式看待世界的Java或C程序员来说……@primvdb:当然@我同意,JavaScript肯定会让很多不熟悉语言的人(<代码> = /<代码> VS >代码>===/COD>,隐式<>代码>;<代码> >等,尤其是如果他们认为它只是一个浏览器脚本语言的话。它还返回正确的typeof
结果。typeof(新布尔值(false))==“object”
,而typeof false==“Boolean”
。我认为隐式版本因此不那么不透明。我想这是一个偏好的问题。