在浏览缩小的 Javascript 代码时,我经常看到以下语句:
if (!''.replace(/^/, String)) {
// ...
}
这是做什么的?似乎任何符合 ECMA 的 JS 解释器都会用 替换字符串的开头String('')
,这仍然会导致一个空字符串,其否定是true
.
在什么情况下行为会有所不同?
在浏览缩小的 Javascript 代码时,我经常看到以下语句:
if (!''.replace(/^/, String)) {
// ...
}
这是做什么的?似乎任何符合 ECMA 的 JS 解释器都会用 替换字符串的开头String('')
,这仍然会导致一个空字符串,其否定是true
.
在什么情况下行为会有所不同?
这似乎来自打包程序,例如Dean Edwards javascript打包程序
所以,让我们下载代码,看看它说什么......
// 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');
尽管你可能很少使用这种语法。
这可用于检查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
}
};