“if(!''。replace(/ ^ /,String))”是做什么的?

时间:2013-06-28 21:17:40

标签: javascript regex

浏览缩小的Javascript代码时,我经常会看到以下声明:

if (!''.replace(/^/, String)) {
    // ...
}

这是做什么的?似乎任何符合ECMA的JS解释器都会用String('')替换字符串的开头,这仍然会产生一个空字符串,其否定为true

在什么情况下行为会有所不同?

2 个答案:

答案 0 :(得分:18)

这似乎来自于打包者,例如例如Dean Edwards javascript packer

所以,让我们下载代码,看看它的内容......

// code-snippet inserted into the unpacker to speed up decoding
const JSFUNCTION_decodeBody =
//_decode = function() {
// does the browser support String.replace where the
//  replacement value is a function?

'    if (!\'\'.replace(/^/, String)) {
        // decode all the values we need
        while ($count--) {
            $decode[$encode($count)] = $keywords[$count] || $encode($count);
        }
        // global replacement function
        $keywords = [function ($encoded) {return $decode[$encoded]}];
        // generic match
        $encode = function () {return \'\\\\w+\'};
        // reset the loop counter -  we are now doing a global replace
        $count = 1;
    }
';

似乎检查当前浏览器是否支持回调作为replace()的第二个参数,如果是,则利用它来加快速度。

作为其余部分,javascript中的String是一个函数,就是你在执行var foo = String('bar');时使用的函数,尽管你可能很少使用该语法。

答案 1 :(得分:3)

这可用于检查String函数是否未被粗心的开发人员覆盖。

在JavaScript中,没有任何东西是不可变的:

!''.replace(/^/, String)
true //console prints
String
function String() { [native code] } //console prints
String()
"" //console prints
String = "eDSF"
"eDSF" //console prints
String() 
TypeError: string is not a function //console prints
!''.replace(/^/, String)
false //console prints

当然,这不是大多数人使用它的原因。

Github显示1053示例具有相同用途。

   // code-snippet inserted into the unpacker to speed up decoding
    var _decode = function() {
        // does the browser support String.replace where the
        //  replacement value is a function?
        if (!''.replace(/^/, String)) {
            // decode all the values we need
            while ($count--) $decode[$encode($count)] = $keywords[$count] || $encode($count);
           //...code code 
        }
    };