我正在使用基于UglifyJS的缩小工具附带的Enyo2编写应用程序。 我注意到:Javascript minification为什么用false替换!1和true用0
var t = false
被替换
var t=!1
用同样的方法真正被替换为0!我确信有一个很好的解释,我无法找到它。任何想法?
我正在使用基于UglifyJS的缩小工具附带的Enyo2编写应用程序。 我注意到:Javascript minification为什么用false替换!1和true用0
var t = false
被替换
var t=!1
用同样的方法真正被替换为0!我确信有一个很好的解释,我无法找到它。任何想法?
显然有一个。如果您使用1或0来翻译真或假,它会更短,但看作整数。如果你添加!在前面并且将它们倒过来,它会合并成布尔值,并且仍然很短。
这是表达该值的最小非模糊方式。
true
在导线上使用4个字符,而false
使用5个字符。 !1
& !0
使用2个字符。
否定将非布尔值,但真值转换为纯布尔值。
我在Chrome开发者工具跑了这一点:
> !1
false
> !0
true
因此,!1
是可以互换的false
和!0
是true
互换。所以现在我们知道改变它是安全的,下一个问题就是为什么。那么,因为它的字节更少。缩小的目的是使代码更小,但兼容。
长话短说,它是一种安全的方式来压缩文字true
和false
,因此它们在通过导线传输时占用的空间较少。
在JavaScript中,0是falsy value。这意味着0
等同于false
,表示为布尔类型。 1另一方面;或任何其他正面的数字,这不是一个虚假价值,将等于true
。
在这里,我们可以只设置:
t = 0; // false
t = 1; // true
这样做的问题是,这些值是整数(数字),而不是布尔值(真或假)。使用全等检查(===
),我们会发现:
t = 0;
t == false; // true
t === false; // false
The !
operator执行对值的逻辑非操作,并且可以作为一种快速的任何值转换为布尔:
t = !1;
t == false; // true
t === false; // true
从性能上看,if (!t)
和if (t == true)
之间有not really much difference,但是从缩小的角度来看,这使我们的JavaScript减少了7个字节,从而使它的下载速度更快。
很好的答案。但是表演呢?写更多高性能!0还是假? – Cyril
那么,为什么不简单地使用1作为真,0作为假? –
因为1&0也可以是数字值。这就是为什么我添加了非含糊 – Jason
@ArekS 1和0不是布尔值;他们是数字。比较可能会搞砸 – Ian