В этой статье мы рассмотрим цикл for…in js сценариев языка jscript. Данный js цикл for…in не предназначен, как остальные циклы, для выполнения n-го количества операций, его основное назначение – получение доступа к элементам массива и объекта. Он практичен в том случае, если надо просмотреть свойства какого-то объекта или произвести групповые операции над всеми элементами массива.
Давайте для начала посмотрим на общий синтаксис цикла for…in:
for (имя переменной in [имя объекта|имя массива]) {тело цикла}
Тут логика работы довольно проста, сразу после ключевого слова for в круглых скобках указывается имя переменной, которая будет хранить ссылку на нужный объект или массив, имя массива или объекта идёт после ключевого слова in, в фигурных скобках мы указываем нужные выражения.
Давайте рассмотрим следующий пример:
//******************************** // js цикл for...in // for_in.js //******************************** // простой массив var new_arr=[1,2,3,4,5,10,12,12,14] ; WScript.Echo (new_arr); for (var element in new_arr){ new_arr[element]*=2; } WScript.Echo (new_arr); //Матрица 3х3 //неверный подход var new_arr1=[[1,2,3],[4,5,10],[12,12,14]] ; WScript.Echo (new_arr1); for (var element in new_arr1){ new_arr1[element]*=2; } WScript.Echo (new_arr1); //Матрица 3х3 var new_arr2=[[1,2,3],[4,5,10],[12,12,14]] ; WScript.Echo (new_arr2); for (var element in new_arr2){ for (var element1 in new_arr2[element]){ new_arr2[element][element1]*=2; } } WScript.Echo (new_arr2); |
Тут мы вначале объявляем простой массив, далее с помощью цикла for in js скрипта мы перебираем все элементы и умножаем их на два. После, мы создаем матрицу размером 3 на 3 и снова пробуем увеличить значение элементов в два раз, но получаем тип NaN –не число, это и не удивительно, ведь матрица является двумерным массивом. В третьем примере мы уже дважды используем цикл for in для увеличения значений, в этот раз всё получилось. Как видим, цикл for in не нуждается в указании количества элементов и позволяет в групповом порядке произвести нужные манипуляции.
Хорошо, теперь давайте рассмотрим пример с объектом:
//******************************** // js цикл for...in // for_in_1.js //******************************** // объявляем объект Date var index=""; var dd=new Date(); //создаем новый объект new_obj var new_obj={a:100, b:25, c:"строка", d:dd.getYear()} ; //пробуем вывести свойства, но безуспешно WScript.Echo (new_obj); for (var element in new_obj){ index+=element + "\t" + new_obj[element] + "\n"; } WScript.Echo (index); |
В данном примере мы создали собственный объект с именем new_obj, ему мы прописали четыре свойства: a:100, b:25, c:»строка», d:dd.getYear(), тут getYear() – это метод объекта Date, который выводит текущий год. Если просто попытаться вывести напрямую через функцию Echo весь объект new_obj, то мы ничего не получим, тут-то и нужен js цикл for…in. Видим, что переменная element хранит в себе имя свойства, для доступа к самому значению мы используем конструкцию new_obj[element].
К сожалению, подобным образом нельзя достучаться ко свойствам внешнего объекта, например, Scripting.FileSystemObject:
//******************************** // js цикл for...in // for_in_2.js //******************************** var index=""; var dd=WScript.CreateObject("Scripting.FileSystemObject"); for (var element in dd){ index+=element + "\t" + dd[element] + "\n"; } WScript.Echo (index); |
В данном примере, вместо ожидаемых имен и значений свойств мы ничего не получим. Любопытно и то, что на JavaScript в теле HTML страницы похожий код всё-таки выдает нужные данные, но, будет работать не в каждом обозревателе.