相关疑难解决方法(0)

使用for循环解释`let`和块作用域

据我所知,这let可以防止重复的声明,这很好.

let x;
let x; // error!
Run Code Online (Sandbox Code Playgroud)

声明的变量let也可以用在可以预期的闭包中

let i = 100;
setTimeout(function () { console.log(i) }, i); // '100' after 100 ms
Run Code Online (Sandbox Code Playgroud)

我有点难以理解的是如何let应用于循环.这似乎是for循环特有的.考虑一下经典问题:

// prints '10' 10 times
for (var i = 0; i < 10; i++) { process.nextTick(_ => console.log(i)) }
// prints '0' through '9'
for (let i = 0; i < 10; i++) { process.nextTick(_ => console.log(i)) }
Run Code Online (Sandbox Code Playgroud)

为什么let在这种情况下使用起作用?在我的想象中,即使只有一个块是可见的,for实际上为每个迭代创建一个单独的块,并且let声明在该块内完成......但是只有一个let声明来初始化该值.这只是ES6的语法糖吗?这是怎么回事?

我理解上面和之间的差异 …

javascript ecmascript-6

31
推荐指数
3
解决办法
3821
查看次数

为什么在`for`循环中使用`let`在Chrome上这么慢?

主要更新.

考虑到Chrome主要版本尚未发布,Chrome Canary 59 的新型Ignition + Turbofan引擎已经解决了这个问题.测试显示相同的时间letvar声明的循环变量.


原始(现在是静音)问题.

当使用letforChrome上循环运行速度非常缓慢,相比于移动变量外刚内循环的范围.

for(let i = 0; i < 1e6; i ++); 
Run Code Online (Sandbox Code Playgroud)

需要两倍的时间

{ let i; for(i = 0; i < 1e6; i ++);}
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?

Snippet演示了差异,只影响Chrome,只要我记得Chrome支持,就一直如此let.

var times = [0,0]; // hold total times
var count = 0;  // number of tests

function test(){
    var start = performance.now();
    for(let i = 0; i < 1e6; i += 1){};
    times[0] += performance.now()-start;
    setTimeout(test1,10) …
Run Code Online (Sandbox Code Playgroud)

javascript performance google-chrome let ecmascript-6

23
推荐指数
2
解决办法
2612
查看次数

为什么使用循环从数组的开始迭代到结束比从开始到结束和结束开始更快地迭代?

给定具有阵列.length 100包含具有值的元素0,以99在相应的索引,其中,所述要求是找到的阵列等于元件n:51.

为什么使用循环从数组的开始迭代到结束比从开始到结束和结束开始更快地迭代?

const arr = Array.from({length: 100}, (_, i) => i);
const n = 51;
const len = arr.length;

console.time("iterate from start");
for (let i = 0; i < len; i++) {
  if (arr[i] === n) break;
}
console.timeEnd("iterate from start");
Run Code Online (Sandbox Code Playgroud)

const arr = Array.from({length: 100}, (_, i) => i);
const n = 51;
const len = arr.length;

console.time("iterate from start and end");
for (let i = 0, k …
Run Code Online (Sandbox Code Playgroud)

javascript arrays iteration performance

21
推荐指数
1
解决办法
1485
查看次数

for循环中的javascript'let'和'var'

在我搜索具体数字以支持constJavascript中关键字的使用时,我偶然发现了所有三种变量声明类型var,let和const之间的性能比较.我不喜欢测试设置,所以我创建了一个简化版.

我没想到会有太大差异,Firefox的测量结果符合我的预期:

Firefox 52上的jsPerf结果

但在Chromium发生了一些奇怪的事情:

Chrome 57上的jsPerf结果

不仅所有测试结果都显着降低,而且let在循环内部分解为速度的一小部分.

我决定在Browserstack中运行测试,以确保它不是我古怪的Linux设置.同样与那里发生Firefox 53,并Chrome 58在Windows 10,我甚至测试年纪较大的Chrome 50,并得到了相同的行为.

到底是怎么回事?这是一个错误吗?

编辑:有人评论说,循环可能只是因为它什么都不做而被优化掉了.为了表明,事实并非如此,我改变了测试.

javascript performance firefox google-chrome ecmascript-6

11
推荐指数
1
解决办法
1899
查看次数

为什么不慢于var?

为了使一个极端的总结,之间的差异var,并let是一个范围之内他们的生活.

所以如果我们要从这个答案中得到这样的例子:

(function() {
  for (var i = 0; i < 5; i++) {
    setTimeout(function() {
      console.log(`i: ${i}`);
    }, i * 100);
  }
  // 5, 5, 5, 5, 5


  for (let j = 0; j < 5; j++) {
    setTimeout(function() {
      console.log(`j: ${j}`);
    }, 1000 + j * 100);
  }
  // 0, 1, 2, 3, 4
}());
Run Code Online (Sandbox Code Playgroud)

  • i(声明var)生活在整个function
  • j(声明着let)仅存在于for循环内.

对我来说,这意味着javascript,在每次迭代之后,除了声明和赋值给变量之外,let还需要执行额外的步骤:清理 …

javascript performance var let

9
推荐指数
1
解决办法
182
查看次数

让vs var表现

我一直在阅读有关ES6 Let关键字与现有var关键字的内容.

我有几个问题.我理解"范围"是let和var之间的唯一区别,但它对大局意味着什么?

function allyIlliterate() {
    //tuce is *not* visible out here

    for( let tuce = 0; tuce < 5; tuce++ ) {
        //tuce is only visible in here (and in the for() parentheses)
    };

    //tuce is *not* visible out here
};

function byE40() {
    //nish *is* visible out here

    for( var nish = 0; nish < 5; nish++ ) {
        //nish is visible to the whole function
    };

    //nish *is* visible out here
};
Run Code Online (Sandbox Code Playgroud)

现在我的问题:

  1. 是否比var具有任何内存(/性能)优势?

  2. 除了浏览器支持,我应该使用let over var的原因是什么? …

javascript ecmascript-6

8
推荐指数
1
解决办法
1805
查看次数

Javascript临时死区NodeJS 7.9.0性能下降?

我在另一个问题中注意到使用letvar变量声明时循环的性能差异.

最初的问题是正确回答,letfor循环中使用较慢,因为let为每次迭代创建一个新的作用域来保存let声明的变量的值.还有更多工作要做,所以慢一点是正常的.作为参考,我在NodeJS(7.9.0)执行时给出代码和结果:

请注意,以下所有javascript代码均与NodeJS版本7.9.0相关

常规代码:

'use strict';
console.time('var');
for (var i = 0; i < 100000000; i++) {}
console.timeEnd('var');


console.time('let');
for (let j = 0; j < 100000000; j++) {}
console.timeEnd('let');
Run Code Online (Sandbox Code Playgroud)

输出:

var: 55.792ms
let: 247.123ms
Run Code Online (Sandbox Code Playgroud)

为了避免j在循环的每次迭代中额外的范围声明,我们j在循环之前声明变量.人们可能会认为这应该使let循环性能与之匹配var.但不是!!!这是代码和结果供参考:

let前循环定义的代码:

'use strict';
console.time('var');
for (var i = 0; i < 100000000; i++) {}
console.timeEnd('var');


console.time('let');
let j;
for …
Run Code Online (Sandbox Code Playgroud)

javascript variable-declaration node.js ecmascript-6

5
推荐指数
1
解决办法
110
查看次数

在JavaScript中过滤字符串数组的最快方法

我正在使用存储在S3上的一些xml文件.我使用Node中的xml2js模块来解析xmls,然后我提取其中包含.jpg的字符串.我正在使用过滤器方法,然后尝试使用我自己的for循环但是没有任何时间关闭.有没有更快的方法来编写代码的这一部分,或者这是完成它的最快方法.任何帮助赞赏.

使用过滤方法:

//this took 52393ms
var file = JSON.stringify(data);
var arrayOfStrings = file.split('"');
var images = arrayOfStrings.filter(function(str) {
    return str.indexOf('.jpg') !== -1;
});
resolve(images);
Run Code Online (Sandbox Code Playgroud)

使用for循环:

//this took 52681ms
var file = JSON.stringify(data);
var arrayOfStrings = file.split('"');
var images =[];
for(let i = 0; i < arrayOfStrings.length; i++) {
    if(arrayOfStrings[i].indexOf('.jpg') !== -1) {
        images.push(arrayOfStrings[i]);
    }
}
resolve(images);
Run Code Online (Sandbox Code Playgroud)

使用file.split('"')后,数据如下所示:

[ '{','rstuv',':{','options',':[{','![alt](CKrgUgiYMflaWnsGZ009.jpg)']];
Run Code Online (Sandbox Code Playgroud)

javascript arrays performance

0
推荐指数
1
解决办法
659
查看次数