2012-01-05 38 views
16

我一直在寻找的源代码qTip 2,看到以下内容:勘定的JavaScript原语,如“常量”的命名相当于可变

// Munge the primitives - Paul Irish tip 
var TRUE = true, 
    FALSE = false, 
    NULL = null; 

我不能拿出你曾经做的一个原因并且有强烈的感觉认为这只会鼓励糟糕的编码习惯。假设开发者在Yoda条件下输入错别字,如if (TRUE = someCondition()),那么TRUE可能最终实际上意味着false,或者您最终可能会将someObject指定为NULL

我想我只是想知道如果有这种做法,我失去了一些可取之处,或者这只是一个普通的老坏主意™

+3

顺便说一句,'+ 1'不仅是一个好问题,而且是使用术语*尤达条件* .. – 2012-01-05 17:22:05

+0

@MikeChristensen:您可能会对这篇文章感兴趣,然后:) -http://www.dodgycoder。净/ 2011/11/yoda-conditions-pokemon-exception.html – Tristan 2012-01-05 18:33:38

+0

嗯,实际上完成工作或阅读有趣的编码博客。这是博客! – 2012-01-05 18:36:19

回答

15

这样做的目的只是为了提高压缩率,Paul Irish自己称之为“反模式”。

他把它描述为“适合压缩和范围链遍历”以下演示:

在作用域链的遍历,我们不会请参阅null,false,true对文字的任何改进,因为范围链没有被检查,它们只是文字。

undefinedwindows的其他标识符上,实际上检查了范围链遍历。

Paul Irish Anti-patterns slide 55

+1

我想知道如果你使用gzip,它是否值得。我似乎回想起混淆结果确实较小的情况,但gzip结果大于等效gzip而没有进行消除。 – 2012-01-05 17:25:14

+0

从OP的确切代码出现在幻灯片55.如何适合... – hugomg 2012-01-05 17:26:44

+1

@missingno - qTip从这张幻灯片得到了主意。他们把它写在评论中(参见OP代码的第一行)。 – 2012-01-05 17:29:08

2

我相信这个建议压缩。

这些快捷方式变量将在压缩时进行压缩,从而产生较小的文件。但是,您所指出的缺点是绝对有效的。

4

你可以对代码压缩的缘故做到这一点。例如,YUI Compressor不会触摸truefalse,但它可以用A代替所有出现的例如TRUE,每次出现可保存四个字符。例如,在压缩之前:

if (foo === null) { 
     bar = true; 
    } 

在压缩之后,假定压缩机替换TRUEaNULLc

if(foo===c){bar=a;} 

对战此,没有 “的原语改写(munging)” 压缩后

if(foo===null){bar=true;} 

您在问题中正确引用的坏编码习惯危险这可能会超过额外压缩的小额节省。这取决于你保存几十个甚至几百个字节的绝望程度。

个人而言,我会(差不多)永远不会这样做。太危险。