我知道 Boolean()、String() 和 Number() 转换,以及
'' + ...
、!!...
和 +...
转换方法。
我想知道是否有任何理由不使用函数构造函数?
一般来说,不鼓励使用
!!
,因为那些以前没有见过它的人不清楚它的实际用途是什么。也就是说,它还不到 Boolean()
字符的三分之一。
此外,我不确定在 Javascript 中实际需要多久转换为布尔值,因为由于 Javascript 是弱类型,它通常是隐式转换的。
将
new
运算符与这些函数构造函数一起使用可能会对 typeof
运算符产生不可靠的影响。 (编辑:正如评论正确指出的那样,这仅在使用 new Boolean()
而不是 Boolean()
时)
例如,
var f = new Boolean(true);
if(typeof(f)==="boolean") {//false, since its an object, not boolean
....
}
JavaScript Garden 有一些很棒的例子。
我能想到7:
这不应该是一个问题,但是有人可以用自己的函数替换
Boolean
函数,这使得两种方法不等效。例如:
Boolean = function(x) {
alert('Evil');
return !x; // Oops
}
var x = 0;
console.log(!!x); // false
console.log(Boolean(x)); // true
这主要是理论上的差异,因为您不应该替换内置构造函数,但这是一个差异。
由于名称查找和函数调用开销,也可能存在小的性能差异。但在大多数情况下,我不会担心其中任何一个。只需使用您喜欢的版本即可。
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(...)
语法可能是最好的选择,特别是当您与多个开发人员一起开发大型应用程序时。对于任何加入该项目的开发人员来说,代码应该尽可能具有可读性。正如您应该避免在沟通中使用首字母缩略词以确保更广泛的受众的清晰度一样,您的代码也应该易于大多数开发人员理解,而不需要额外的研究。
这次我们讨论的是
!!
语法,但是JavaScript中有很多奇怪的语法。如果不努力确保可读性,第一次阅读此类代码可能会很困难。此外,即使对于经验丰富的开发人员来说,使用清晰易读的代码也更容易。这场争论在
!!
的规模上是有意义的,但在整个代码库的层面上,对我来说没有争论,所以应该避免
!!
。