gpt4 book ai didi

javascript - Math.random() 在此 JavaScript 片段中做了什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:25:22 24 4
gpt4 key购买 nike

我正在观看 2011 年的 Google I/O 演示 https://www.youtube.com/watch?v=M3uWx-fhjUc

在 39:31 分,Michael 展示了闭包编译器的输出,它看起来像下面包含的代码。

我的问题是这段代码到底在做什么(如何以及为什么)

// Question #1 - floor & random? 2147483648?
Math.floor(Math.random() * 2147483648).toString(36);

var b = /&/g,
c = /</g,d=/>/g,
e = /\"/g,
f = /[&<>\"]/;

// Question #2 - sanitizing input, I get it...
// but f.test(a) && ([replaces]) ?
function g(a) {
a = String(a);

f.test(a) && (
a.indexOf("&") != -1 && (a = a.replace(b, "&amp;")),
a.indexOf("<") != -1 && (a = a.replace(c, "&lt;")),
a.indexOf(">") != -1 && (a = a.replace(d, "&gt;")),
a.indexOf('"') != -1 && (a = a.replace(e, "&quot;"))
);

return a;
};

// Question #3 - void 0 ???
var h = document.getElementById("submit-button"),
i,
j = {
label: void 0,
a: void 0
};
i = '<button title="' + g(j.a) + '"><span>' + g(j.label) + "</span></button>";
h.innerHTML = i;

编辑

感谢您富有洞察力的回答。我仍然很好奇编译器为什么会在脚本顶部生成随机字符串。当然必须有一个很好的理由。有人吗???

最佳答案

1) 此代码是从 Closure 库中提取的。这段代码只是创建随机字符串。在更高版本中,它已被替换为简单地创建一个大的随机整数,然后将其连接到一个字符串:

'closure_uid_'  + ((Math.random() * 1e9) >>> 0)

这个简化版本更容易被 Closure Compiler 移除,所以你不会像以前那样看到它被遗留下来。具体来说,编译器假定没有参数的“toString”不会导致可见状态更改。但是,它没有对带参数的 toString 调用做出相同的假设。您可以在此处阅读有关编译器假设的更多信息:

https://code.google.com/p/closure-compiler/wiki/CompilerAssumptions

2) 在某些时候,有人确定在假设大多数字符串不需要转义的情况下进行“替换”调用之前测试可能需要替换的字符会更快。

3) 正如其他人所说,void 运算符总是返回 undefined,而“void 0”只是写“undefined”的合理方式。它在正常使用中毫无用处。

关于javascript - Math.random() 在此 JavaScript 片段中做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18368703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com