Подтвердить что ты не робот

Что означает "если (! ''. Replace (/^/, String))" делать?

При просмотре миниатюрного кода Javascript я часто вижу следующее утверждение:

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

Что это делает? Кажется, что любой интерпретатор JS, совместимый с ECMA, заменит начало строки на String(''), что по-прежнему приводит к пустой строке, отрицание которой true.

В каких обстоятельствах поведение будет отличаться?

4b9b3361

Ответ 1

Кажется, что это происходит от упаковщиков, например, 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(), и если да использует это, чтобы ускорить процесс.

В качестве остатка String в javascript - это функция, которую вы используете, когда выполняете var foo = String('bar');, хотя вы, вероятно, редко используете этот синтаксис, если когда-либо.

Ответ 2

Это можно использовать, чтобы проверить, не была ли перезаписана функция 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 
        }
    };