Что означает "если (! ''. Replace (/^/, String))" делать?
При просмотре миниатюрного кода Javascript я часто вижу следующее утверждение:
if (!''.replace(/^/, String)) {
// ...
}
Что это делает? Кажется, что любой интерпретатор JS, совместимый с ECMA, заменит начало строки на String('')
, что по-прежнему приводит к пустой строке, отрицание которой true
.
В каких обстоятельствах поведение будет отличаться?
Ответы
Ответ 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
}
};