Python.v.JavaScript

JavaScript for Pythonistas. Python for JavaScripters

Цикл for

Цикл for используется для двух основных целей:

  1. Выполнить некоторое действие заданное число раз.
  2. Обработать все элементы некоторой структуры данных (например, списка).
Python Javascript
Выполнить блок заданное число раз #
for i in range(4):
    print("i =", i)
i = 0
i = 1
i = 2
i = 3
for(var i=0; i<4; i++) {
    console.log("i =", i);
}
i = 0
i = 1
i = 2
i = 3
Обработать все элементы списка / массива #
my_list = [1, 2, 10]
for element in my_list:
    print(element)
1
2
10
var my_array = [1, 2, 10];
for (var i=0; i<my_array.length; i++) {
    console.log(my_array[i])
}
1
2
10

Это наиболее безопасный способ перебора элементов массива. Поддерживается во всех версиях JS, нет опасности включить в перебор свойства, не являющиеся индексированными элементами списка, см. другой пример.


var my_array = [1, 2, 10];
for (i in my_array) {
    console.log(my_array[i]);
}
1
2
10

var my_array = [1, 2, 10];
for (element of my_array) {
    console.log(element)
}
1
2
10
требует: es6
var my_array = [1, 2, 10];
my_array.forEach(function(v) {
    console.log(v)
})
1
2
10
Значение переменной цикла после его выполнения #
for i in range(4):
    print("Step", i)
print("Outside of loop, i =", i)
Step 0
Step 1
Step 2
Step 3
Outside of loop, i = 3
for (var i=0; i<4; i++) {
   console.log("Step", i)
}
console.log("Outside of loop, i =", i)
Step 0
Step 1
Step 2
Step 3
Outside of loop, i = 4

for (let i=0; i<4; i++) {
   console.log("Step", i)
}
console.log("Outside of loop, i =", i)
Step 0
Step 1
Step 2
Step 3
[stdin]:4
console.log("Outside of loop, i =", i)
                                    ^

ReferenceError: i is not defined
    at [stdin]:4:37
    at Script.runInThisContext (vm.js:132:18)
    at Object.runInThisContext (vm.js:315:38)
    at Object.<anonymous> ([stdin]-wrapper:10:26)
    at Module._compile (internal/modules/cjs/loader.js:1256:30)
    at evalScript (internal/process/execution.js:98:25)
    at internal/main/eval_stdin.js:29:5
    at Socket.<anonymous> (internal/process/execution.js:211:5)
    at Socket.emit (events.js:326:22)
    at endReadableNT (_stream_readable.js:1244:12)
требует: es6
Опасности перебора элементов списка с помощью in #
my_list = [1, 2, 10]
my_list.some_value = "I'm here!"
for element in my_list:
    print(element)
Exception: AttributeError
'list' object has no attribute 'some_value'

В объект стандартного типа list невозможно добавить свойства.


class MyList(list):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
brand_new_list = MyList([1, 2, 10])
brand_new_list.some_value = "I'm here!"
for element in brand_new_list:
    print(element)
1
2
10

Можно создать новый класс, наследуя от list (хотя в общем случае это не рекомендуется делать), и добавить к нему дополнительные свойства. Это не повлияет на перебор элементов списка с помощью for ... in ....

var my_array = [1, 2, 10];
my_array.some_value = "I'm here!";
for (i in my_array) {
    console.log(my_array[i]);
}
1
2
10
I'm here!

В JavaScript массив — это просто (хорошо оптимизированный) объект с числовыми индексами. Если вы добавите ещё одно свойство в этот объект, оно окажется в числе перечисляемых с помощью for ... in ....


var my_array = [1, 2, 10];
Array.prototype.some_value = "I'm here!";
for (i in my_array) {
    console.log(my_array[i]);
}
1
2
10
I'm here!
Перебор ключей в словаре / объекте #
my_dict = {'a': 10, 'b': 20}
for key in my_dict:
    print(key)
a
b
my_obj = {a: 10, b: 20}
Object.prototype.new_property = function() {
    return "Hello";
}
for (key in my_obj) {
    console.log(key);
}
a
b
new_property

В объектах JavaScript не различаются записи, свойства и методы. Более того: цикл for в данном случае перебирает не только по элементам самого объекта, но и по элементам его прототипа (если только они специально не отмечены как enumerable: false).


my_obj = {a: 10, b: 20}
Object.prototype.new_property = function() {
    return "Hello";
}
for (key in my_obj) {
    if (my_obj.hasOwnProperty(key)) {
        console.log(key);
    }
}
a
b
Перебор ключей и значений в словаре / объекте #
my_dict = {'a': 10, 'b': 20}
for key, value in my_dict.items():
    print(key, "=>", value)
a => 10
b => 20
my_obj = {a: 10, b: 20}
Object.prototype.new_property = function() {
    return "Hello";
}
for (key in my_obj) {
    if (my_obj.hasOwnProperty(key)) {
        console.log(key, "=>", my_obj[key]);
    }
}
a => 10
b => 20
ссылка

См. комментарий к другому примеру.

© Ilya V. Schurov and contributors, 2017
Licenses: CC BY (text), MIT (code).
contribute on github