Што робіць "в" ключавое слова ў JavaScript азначае?

Я знайшоў гэты код:

if (!("aa" in window)) {  
    alert('oh my god');
    var aa = 1;  
}  
alert("aa" in window);
alert(aa);

Гэты код другога папярэджання пільны True , але, трэцяе папярэджанне «не вызначанае», і папярэджанне ў «калі» не запускаецца. Чаму?

Я думаю, што прычына заключаецца ў у ; які яго эфект?

I searched on Google, but found nothing, because Google thinks the word ‘in&srquo; is a filter word.

We always use the in in loops, but, frankly speaking, I use it but don’t really understand it.

2
@LIXer Я адрэдагаваў мой адказ, каб адказаць на новае пытанне, але, калі ласка, паспрабуйце выправіць ваша пытанне адразу ў наступны раз ці задаць новы, калі вы разумееце код, які вы далі першы раз не было правільным для вас.
дададзена аўтар Denys Séguret, крыніца
@LIXer Я адрэдагаваў мой адказ, каб адказаць на новае пытанне, але, калі ласка, паспрабуйце выправіць ваша пытанне адразу ў наступны раз ці задаць новы, калі вы разумееце код, які вы далі першы раз не было правільным для вас.
дададзена аўтар Denys Séguret, крыніца
Я мяркую, што зменная з імем аа быў створаны ў глабальным кантэксце. <�Код> абвесткі ( «аа» у акне); вяртае хлусня для мяне, але аа = «Foo»; папярэджанне ( «аа» у акне); вяртае ісціну.
дададзена аўтар andyb, крыніца
Я думаю, што гэта зусім іншае пытанне зараз, калі вы пытаеце пра папярэджанні. Я б рэкамендаваў рэдагаванне загалоўка пытання для лепшага апісання вашай праблемы.
дададзена аўтар andyb, крыніца
Божа мой, я думаю, што я страціў некаторы код, калі я wroten пытанне ...
дададзена аўтар LIXer, крыніца

6 адказы

Гэта тэсты, калі акно аб'ект мае ўласцівасць (запоўнены ці не), чый ключ «аа» .

Гэты аператар з'яўляецца вельмі карысным, паколькі ён працуе, нават калі значэнне не вызначана :

window.aa = undefined;//or just aa=undefined if you're in the global scope
console.log('aa' in window);//logs true

Ён таксама працуе, калі ўласцівасць не перечислимы:

console.log('length' in []);//logs true

У вашым выпадку, не можа быць аа значэння, але калі сігнал паказвае, праўда, ўласцівасць было дададзена ў вокны .

MDN reference on in

Звярніце ўвагу, што для ... у аператар адрозніваецца тым, што ён на самай справе не выкарыстоўваць у аператара, але канкрэтная канструкцыя.

<�Моцны> MDN спасылка на за .. .у


EDIT : an explanation of your edited question (very different from the first one) :

Ваша замяшанне, здаецца, узнікае з таго факту, вы абвесціў вар аа = 1; у блоку. Вы павінны ведаць, што вобласць бачнасці зменнай у JavaScript з'яўляецца альбо функцыяй глабальнага маштабу і што дэкларацыі падымаюцца. Так што ваш код фактычна эквівалентна

var aa = undefined;
if (!("aa" in window)) {//aa is in window, so we don't enter here
    alert('oh my god');
    aa = 1;  
}  
alert("aa" in window);//yes, the property exists, it's true
alert(aa);//aa is still undefined
10
дададзена
Калі ласка. Але вы павінны выдаліць EDIT частка вашага пытання: пытанні не павінны ўключаць у адказ на SO. Давайце зробім гэта чыстае для іншых будучых карыстальнікаў, якія зайшлі на.
дададзена аўтар Denys Séguret, крыніца
дзякуй, і я шкадую аб апісанні майго пытання ў
дададзена аўтар LIXer, крыніца

Гэта тэсты, калі акно аб'ект мае ўласцівасць (запоўнены ці не), чый ключ «аа» .

Гэты аператар з'яўляецца вельмі карысным, паколькі ён працуе, нават калі значэнне не вызначана :

window.aa = undefined;//or just aa=undefined if you're in the global scope
console.log('aa' in window);//logs true

Ён таксама працуе, калі ўласцівасць не перечислимы:

console.log('length' in []);//logs true

У вашым выпадку, не можа быць аа значэння, але калі сігнал паказвае, праўда, ўласцівасць было дададзена ў вокны .

MDN reference on in

Звярніце ўвагу, што для ... у аператар адрозніваецца тым, што ён на самай справе не выкарыстоўваць у аператара, але канкрэтная канструкцыя.

<�Моцны> MDN спасылка на за .. .у


EDIT : an explanation of your edited question (very different from the first one) :

Ваша замяшанне, здаецца, узнікае з таго факту, вы абвесціў вар аа = 1; у блоку. Вы павінны ведаць, што вобласць бачнасці зменнай у JavaScript з'яўляецца альбо функцыяй глабальнага маштабу і што дэкларацыі падымаюцца. Так што ваш код фактычна эквівалентна

var aa = undefined;
if (!("aa" in window)) {//aa is in window, so we don't enter here
    alert('oh my god');
    aa = 1;  
}  
alert("aa" in window);//yes, the property exists, it's true
alert(aa);//aa is still undefined
10
дададзена
Калі ласка. Але вы павінны выдаліць EDIT частка вашага пытання: пытанні не павінны ўключаць у адказ на SO. Давайце зробім гэта чыстае для іншых будучых карыстальнікаў, якія зайшлі на.
дададзена аўтар Denys Séguret, крыніца
дзякуй, і я шкадую аб апісанні майго пытання ў
дададзена аўтар LIXer, крыніца

Гэта тэсты, калі акно аб'ект мае ўласцівасць (запоўнены ці не), чый ключ «аа» .

Гэты аператар з'яўляецца вельмі карысным, паколькі ён працуе, нават калі значэнне не вызначана :

window.aa = undefined;//or just aa=undefined if you're in the global scope
console.log('aa' in window);//logs true

Ён таксама працуе, калі ўласцівасць не перечислимы:

console.log('length' in []);//logs true

У вашым выпадку, не можа быць аа значэння, але калі сігнал паказвае, праўда, ўласцівасць было дададзена ў вокны .

MDN reference on in

Звярніце ўвагу, што для ... у аператар адрозніваецца тым, што ён на самай справе не выкарыстоўваць у аператара, але канкрэтная канструкцыя.

<�Моцны> MDN спасылка на за .. .у


EDIT : an explanation of your edited question (very different from the first one) :

Ваша замяшанне, здаецца, узнікае з таго факту, вы абвесціў вар аа = 1; у блоку. Вы павінны ведаць, што вобласць бачнасці зменнай у JavaScript з'яўляецца альбо функцыяй глабальнага маштабу і што дэкларацыі падымаюцца. Так што ваш код фактычна эквівалентна

var aa = undefined;
if (!("aa" in window)) {//aa is in window, so we don't enter here
    alert('oh my god');
    aa = 1;  
}  
alert("aa" in window);//yes, the property exists, it's true
alert(aa);//aa is still undefined
10
дададзена
Калі ласка. Але вы павінны выдаліць EDIT частка вашага пытання: пытанні не павінны ўключаць у адказ на SO. Давайце зробім гэта чыстае для іншых будучых карыстальнікаў, якія зайшлі на.
дададзена аўтар Denys Séguret, крыніца
дзякуй, і я шкадую аб апісанні майго пытання ў
дададзена аўтар LIXer, крыніца

Прымаючы папярэджання ў парадку:

  • alert #1 is never reached because ("aa" in window) === true so the if boolean condition is false.

JavaScript мае вобласць бачнасці функцыі і зменную аа з'яўляецца «узваліў» да верхняй частцы рамкі першага, так што з'яўляецца вызначана ,

  • <�моцны> абвесткі # 2

"aa" in window is true because the variable was added to the window object when it was hoisted up. Equivalent to just writing:

var foo;
"foo" in window (which === true)
  • <�моцны> трывога # 3

З Стандарт ECMA-262 ECMAScript Спецыфікацыя мовы </а >:

<�Р> Невялікі аператар аб'яўляе зменныя, якія ствараюцца, як вызначана ў 10.5. Зменныя ініцыялізуюцца <�моцны> не вызначана пры стварэнні. Зменная з Инициализатора прысвойваецца значэнне яго ВыражениеПрисваивания , калі ВыраженияПрисваивания выконваецца, не тады, калі пераменная ствараецца.

Так аа не вызначаны, бо заданне не было выканана.

1
дададзена
Рады дапамагчы! Гэта цікавае пытанне. Бо не існуе блок вобласці бачнасці ў JavaScript (блок вызначаецца як сфера ўнутры {...} ) пераменная будзе даступная за межамі , калі блок.
дададзена аўтар andyb, крыніца
дзякуй, я ведаю функцыю сферы, але я не разглядаць ніякай функцыі ў маім кодзе, о не, мой браўзэр настолькі слаба
дададзена аўтар LIXer, крыніца

Прымаючы папярэджання ў парадку:

  • alert #1 is never reached because ("aa" in window) === true so the if boolean condition is false.

JavaScript мае вобласць бачнасці функцыі і зменную аа з'яўляецца «узваліў» да верхняй частцы рамкі першага, так што з'яўляецца вызначана ,

  • <�моцны> абвесткі # 2

"aa" in window is true because the variable was added to the window object when it was hoisted up. Equivalent to just writing:

var foo;
"foo" in window (which === true)
  • <�моцны> трывога # 3

З Стандарт ECMA-262 ECMAScript Спецыфікацыя мовы </а >:

<�Р> Невялікі аператар аб'яўляе зменныя, якія ствараюцца, як вызначана ў 10.5. Зменныя ініцыялізуюцца <�моцны> не вызначана пры стварэнні. Зменная з Инициализатора прысвойваецца значэнне яго ВыражениеПрисваивания , калі ВыраженияПрисваивания выконваецца, не тады, калі пераменная ствараецца.

Так аа не вызначаны, бо заданне не было выканана.

1
дададзена
Рады дапамагчы! Гэта цікавае пытанне. Бо не існуе блок вобласці бачнасці ў JavaScript (блок вызначаецца як сфера ўнутры {...} ) пераменная будзе даступная за межамі , калі блок.
дададзена аўтар andyb, крыніца
дзякуй, я ведаю функцыю сферы, але я не разглядаць ніякай функцыі ў маім кодзе, о не, мой браўзэр настолькі слаба
дададзена аўтар LIXer, крыніца

Прымаючы папярэджання ў парадку:

  • alert #1 is never reached because ("aa" in window) === true so the if boolean condition is false.

JavaScript мае вобласць бачнасці функцыі і зменную аа з'яўляецца «узваліў» да верхняй частцы рамкі першага, так што з'яўляецца вызначана ,

  • <�моцны> абвесткі # 2

"aa" in window is true because the variable was added to the window object when it was hoisted up. Equivalent to just writing:

var foo;
"foo" in window (which === true)
  • <�моцны> трывога # 3

З Стандарт ECMA-262 ECMAScript Спецыфікацыя мовы </а >:

<�Р> Невялікі аператар аб'яўляе зменныя, якія ствараюцца, як вызначана ў 10.5. Зменныя ініцыялізуюцца <�моцны> не вызначана пры стварэнні. Зменная з Инициализатора прысвойваецца значэнне яго ВыражениеПрисваивания , калі ВыраженияПрисваивания выконваецца, не тады, калі пераменная ствараецца.

Так аа не вызначаны, бо заданне не было выканана.

1
дададзена
Рады дапамагчы! Гэта цікавае пытанне. Бо не існуе блок вобласці бачнасці ў JavaScript (блок вызначаецца як сфера ўнутры {...} ) пераменная будзе даступная за межамі , калі блок.
дададзена аўтар andyb, крыніца
дзякуй, я ведаю функцыю сферы, але я не разглядаць ніякай функцыі ў маім кодзе, о не, мой браўзэр настолькі слаба
дададзена аўтар LIXer, крыніца