Почему циклы for-in не могут иметь несколько объявлений переменных? - PullRequest
0 голосов
/ 30 апреля 2020

let example = {
a:20,
b:40,
c:60
}

for(let j=0,i in example){
console.log(example[i]*j);
j++;
}

Почему для l oop normal может иметь несколько объявлений переменных, а для l oop for-in - нет? Или я что-то не так делаю?

Ответы [ 4 ]

2 голосов
/ 30 апреля 2020

Вы пишете код, который не является синтаксически правильным.

в JavaScript Вы не можете использовать выражение for-in с любым другим выражением присваивания.

Вы может просто вытащить j=0 назначение из для l oop, и это должно исправить ошибку

    let example = {
        a:20,
        b:40,
        c:60
    }
    
    
    let j=0
    for(i in example){
        console.log(example[i]*j);
        j++;
    }

[Редактировать] Я нашел следующее содержание на официальном сайте MDN для того же сценария
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

Что касается сайта - это общеизвестная проблема, которую ChromeV8 и другие браузеры пытаются изучить enter image description here

Для получения дополнительной информации проверьте следующие ссылки
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_for-in_initializer
https://bugzilla.mozilla.org/show_bug.cgi?id=748550
https://bugzilla.mozilla.org/show_bug.cgi?id=1164741

1 голос
/ 30 апреля 2020

Я могу понять разочарование, вы используете одно и то же ключевое слово, так почему же оно не ведет себя одинаково? Но я думаю, что вы должны подумать об этом следующим образом:
for - это способ определения al oop, пока какое-либо условие выполняется, с другим способом определения этого условия.

В обычном для l oop вы l oop, пока средняя часть (условие) выполняется:
for(let i = 0; i < 10; i++)

Это похоже на то, как некоторое время l oop может работать, но это сокращение syntacti c:

let i = 0;
while (i < 10) {
    i++;
}

Так что for..in - это для l oop, у которого есть условие другого типа для каждого свойства в этом объекте, поэтому пока у вас есть больше свойств, он будет продолжать цикл. Вы также можете написать это так:

const keys = Object.keys(example);
for (let i = 0; i < keys.length; i++) {
    const key = keys[i];
    const value = example[key];
}

У вас также есть for ... of, который перебирает элементы в массиве, но это syntacti c sugar для:
for(let i = 0; i < array.length; i++) { const item = array[i]; }

Также рассмотрим, как делать ... в то время как l oop похоже на некоторое время l oop, но с некоторыми немного другими правилами и поведением. Вместо того, чтобы расстраиваться из-за синтаксиса, попытайтесь понять, как он экономит ваше время, сделав ваш код немного менее многословным, но для этого он должен быть немного разным в каждом конкретном случае. Альтернативой было бы иметь очень много языковых ключевых слов.

1 голос
/ 30 апреля 2020

Я попытался изменить ваш код, чтобы не объявлять переменные внутри скобок для l oop. Я никогда не видел, чтобы это было сделано; возможно, это возможно, но было бы проще объявить переменную выше для для l oop, например так (при условии, что это то, что вы надеялись сделать):

let example = {
    a:20,
    b:40,
    c:60
}


let j=0
for(let i in example){
    console.log(example[i]*j);
    j++;
}

Редактировать: Как упомянуто в комментариях: "Вы, вероятно, должны добавить let перед объявлением i, иначе это будет глобально определены ". Я только что изменил это во фрагменте!

0 голосов
/ 30 апреля 2020

Вы не можете иметь более одного выражения в for-loop в таком случае. Правильным способом было бы объявить j перед l oop следующим образом:

let example = {
     a:20,
     b:40,
     c:60
}
let j = 0;
for(let i in example){
     console.log(example[i]*j);
     j++;
}
...