2016-05-11 6 views
5

Я довольно новичок в Javascript и пытался выяснить, как работает цикл for...in, основанный на том, как работает оператор in.Операторы до и после байтов

This уточнено недоразумение.

Однако я теперь смущен, почему оператор in возвращает false во всех сценариях, кроме самого последнего.

Похоже, что цикл for...in создает ключевой ключTest в obj со значением его последней итерации.

Правильно ли я понимаю? Do for...in Петли создают ключ/значения в объекте, который они перебирают при использовании для прохождения всех ключей объектов?

Если это поможет любая помощь по пониманию.

var keyTest, obj = {} 
keyTest in obj; // false 
for(var keyTest in obj) { obj[keyTest] }; 
keyTest in obj; // false 

obj = { a : 1, b : 2 }; 
keyTest in obj; // false 
for(var keyTest in obj) { obj[keyTest] }; 
keyTest in obj; // true 
obj[keyTest] // 2 
+1

'in-in' просто выполняет итерации по объектным клавишам, не более того. – zerkms

+0

и 'in' вернет true, если объект содержит заданное свойство. keytest и obj - оба независимых объекта, ни один из них не является свойством другого. –

ответ

3

ли for...in петли создать ключ/значение в объекте они итерацию более, когда используется, чтобы пройти через все объекты ключей?

Нет, но они назначают ключи переменной итерации (var keyTest в вашем случае). Вот почему ваши примеры дают результаты, которые вы видите.

// keyTest = undefined (initialisation of the hoisted variable) 
var keyTest, obj = {} // keyTest === undefined 
keyTest in obj; // keyTest === undefined 
for(var keyTest in obj) { obj[keyTest] }; // `obj` is empty and `keyTest` stays what it is 
keyTest in obj; // false // keyTest === undefined 

// keyTest = undefined (initialisation of the hoisted variable) 
obj = { a : 1, b : 2 }; // keyTest === undefined 
keyTest in obj; // keyTest === undefined 
for(var keyTest in obj) { obj[keyTest] }; // keyTest = "a", keyTest = "b" 
keyTest in obj; // keyTest === "b" 
1

теперь я запутался, почему в операторе возвращает false

in оператор принимает 2 операнда:

  • осталось на е имя ключа для проверки
  • и правильный является объектом для испытания против

Так что для этого Фрагмент кода

var keyTest, obj = {} 
keyTest in obj; // false 

keyTest является undefined (вы не инициализируются его Значение). Таким образом, вы проверяете, есть ли "undefined" (он будет передан в строку, поскольку объекты могут только * удерживать свойства строки) является одним из объектных ключей obj, чего нет, следовательно false.

for(var keyTest in obj) { obj[keyTest] }; 
keyTest in obj; // true 

Здесь она возвращает true, поскольку переменная keyTest содержит значение последнего повторного ключа после того, как цикл будет завершен. Таким образом, вы проверяете, находится ли фактический ключ в объекте.

2

Это проблема с подъемом. В es5 нет области уровня блока, поэтому ваша keyTest переменная будет поднята и объявлена ​​в начале области (функция или глобальная, это зависит от того, где вы запускаете свой код).

Таким образом, var keyTest не является переменной блока, а переменной области видимости, соответственно, она относится к одной и той же переменной в каждой строке вашего кода, где она используется в этой области. И это причина, по которой ваш цикл for присваивает этой переменной последнее значение итерации.


Если говорить о вашем примере, причина, почему у вас есть два различных результата является то, что в первом примере, у вас нет ключей в вашем obj, так for цикла не будет делать какую-либо итерации, соответственно не будет присвойте любое значение вашему keyTest, так что оно будет оставаться неопределенным.


Но, например, у es6 есть переменные уровня блока. Поэтому, если вы измените var на let (ключевое слово с объявлением ключевого слова уровня блока) в вашем цикле for и запустите этот код в es6-совместимой среде, у вас будет другой вывод. Возможно, это поможет вам понять, что происходит.

//es6 code 
var keyTest; 
obj = { a : 1, b : 2 }; 
keyTest in obj; // false 
for(let keyTest in obj) { obj[keyTest] }; 
keyTest in obj; // false 
obj[keyTest] // undefined 

 Смежные вопросы

  • Нет связанных вопросов^_^