我经常使用Array.from()或[...foo]从可迭代对象中获取数组.我也可以迭代它并手动推送到一个数组,但我更喜欢原生数据,因为它很简单,我认为本机实现会更有效率.
但是,我发现一些基准测试结果显示那些原生方式较慢.
https://jsperf.com/set-iterator-vs-foreach/4
我还在Chrome和Firefox上运行了更少(50)和更多(10k)元素的测试,但最终得到了类似的结果.
https://jsfiddle.net/unarist/k0cu8wta/2/
我可以理解[...foo]比Array.from()因为Array.from()必须处理类似数组的对象和mapFn参数更快,但我找不到关于之间[...foo]和for..of+ push()方式的合理理由.
是什么让for..of+ push()比Array.from()和更快[...foo]?
更新:我关心的不是速度,也不应该使用.我很惊讶本机版本比JS版本慢,我想知道为什么,因为我认为"一般来说,本机版本很快".
(例如,本地人比循环+推送方式做更多的工作,对某事物进行特殊优化等)
我在Windows 10 x64上测试了Chrome 60和Firefox 54.
MDN说location.reload()一个可选参数.
forcedReload
是一个布尔标志,如果为true,则会导致始终从服务器重新加载页面.如果为false或未指定,则浏览器可以从其缓存重新加载页面.
但是这个论点在IE和Chrome中不起作用.
下表显示了发送到服务器的标头(no-cache均值Pragma: no-cache):
+---------------+----------+-------------------+-------------------+
| | IE11 | Firefox47 | Chrome54 |
+---------------+----------+-------------------+-------------------+
| reload(false) | no-cache | If-Modified-Since | If-Modified-Since |
+---------------+----------+-------------------+-------------------+
| reload(true) | no-cache | no-cache | If-Modified-Since |
+---------------+----------+-------------------+-------------------+
Run Code Online (Sandbox Code Playgroud)
IE和Chrome会发送不同的缓存标头,不仅会忽略forcedReload参数.
此外,这种方法的W3C Spec似乎没有提到缓存.
所以我的问题是......
location.reload()关于缓存,我应该期待什么?我正在编写C#程序,而VisualStudio的VSTO向导会生成以下代码.
private static string GetResourceText(string resourceName)
{
Assembly asm = Assembly.GetExecutingAssembly();
string[] resourceNames = asm.GetManifestResourceNames();
for (int i = 0; i < resourceNames.Length; ++i)
{
if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
{
using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
{
if (resourceReader != null)
{
return resourceReader.ReadToEnd();
}
}
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
我认为 if (resourceReader != null)是多余的,因为构造函数总是返回非null.不是吗?
首先,let可用于循环计数器声明。这也在MDN 中进行了描述。
for(let i = 0; i < 2; ++i) {
setTimeout(function(){
document.write(i + "<br>");
}, 0);
}
Run Code Online (Sandbox Code Playgroud)
结果:
0
1
Run Code Online (Sandbox Code Playgroud)
由于let使用了,i可以在for块内部更改值。
for(let i = 0; i < 2; ++i) {
setTimeout(function(){
document.write(i + "<br>");
}, 0);
i = 123; // I want to block this assignment!!
}
Run Code Online (Sandbox Code Playgroud)
所以我考虑使用const而不是let.
for(const i = 0; i < 2; ++i) { // throws Assignment to constant variable
setTimeout(function(){
document.write(i …Run Code Online (Sandbox Code Playgroud)