19.07.2012, 19:51
|
|
сегодня в 12:34|Комментир
|
|
Регистрация: 12.04.2011
Сообщений: 1,180
|
|
Чуваки, прошло больше года, а я так до сих пор и не въехал, почему при вводе: 2, выполняется это условие:
if (document.age.pole.value == 5||6||7||8||9||10||11||12||13||14||15||16||17||18||19||20)
? Может кто еще раз объяснить?
__________________
оляля, ололо
|
|
19.07.2012, 19:58
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
alert(2 == (5||6||7||8||9||10||11||12||13||14||15||16||17||18||19||20))
alert(2 == 5||6||7||8||9||10||11||12||13||14||15||16||17||18||19||20)
|
|
19.07.2012, 20:10
|
|
Профессор
|
|
Регистрация: 21.04.2012
Сообщений: 951
|
|
9xakep,
потому что костанты 5, 6, 7 и т.п. существуют нужно делать как Deff (я опоздал за ним) обернуть в скобку и тогда идет следущая логика:
var a = 3;
if (a == 3 || 5 || 6) alert('false');//неправильно, алерт выполнится
if (a == 5 || 6) alert('false');//неправильно, алерт выполнится
1) логика - выполнить алерт если a = 3 - true, или есть 5 - true, или есть 6 - true --- конец true
2) логика - выполнить алерт если a = 5 - false, или есть 6 - true --- конец true
var a = 3;
if (a == (3 || 5 || 6)) alert('true');//правильно, алерт выполнится
if (a == (4 || 5 || 6)) alert('true');//правильно, алерт не выполнится
1) логика - выполнить алерт если a = 3 - true, или a = 5 - false, или a = 6 - false --- конец true
2) логика - выполнить алерт если a = 4 - false, или a = 5 - false, или a = 6 - false --- конец false
|
|
19.07.2012, 20:12
|
|
Студент
|
|
Регистрация: 30.04.2012
Сообщений: 1,113
|
|
Сообщение от 9xakep
|
Чуваки, прошло больше года, а я так до сих пор и не въехал, почему при вводе: 2, выполняется это условие:
if (document.age.pole.value == 5||6||7||8||9||10||11||12||13||14||15||16||17||18||19||20)
? Может кто еще раз объяснить?
|
если ты поставишь скобки и напишешь вот так
if (document.age.pole.value == (5||6||7||8||9||10||11||12||13||14||15||16||17||18||19||20))
то получишь то на что рассчитывал-левая часть будет поочередно сравниваться с каждым числом правой части
---------
в твоем случае сначала проверяется
document.age.pole.value == 5//false
тогда берется просто и проверяется
6//true
|
|
19.07.2012, 20:58
|
|
Профессор
|
|
Регистрация: 21.04.2012
Сообщений: 951
|
|
9xakep,
просто оператор "или" работает относительно того где он, если он находится в самих скобках всего выражения то и работает относительно всего выражения:
var s = 'Я текст';
if (s == "Я текст" || s == "I'm text") alert("Верный подход - я выполнился, так как \"или\" не находится во внутренних скобках и работает относительно всего if-а.");
if (s == "I'm text" || "Я текст") alert("Неверный подход, но я выполнился\n потому что костанта \"Я текст\" - существует.");
если же "или" находится во вложенных скобках то и работает относительно них
var s = 'Я текст';
k = 3;
if (s == ("Я текст" || "I'm text")) alert("Верный подход - я выполнился, ведь \"или\" работает относительно вложенных скобок.");
if (s == ("Я текст" | k == 5)) alert("Я не выполнюсь так как \"или\" работет относительно внутренних скобок и првильная запись должна выглядеть \n if (s == \"Я текст\" || k == 5)");// не выполнится - но выполнится, если писать не "|", а "||", но не выполнится если написать if (s == (k == 5 || "Я текст"))
Последний раз редактировалось Dim@, 19.07.2012 в 21:00.
|
|
19.07.2012, 21:01
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от 9xakep
|
Чуваки, прошло больше года, а я так до сих пор и не въехал, почему при вводе: 2, выполняется это условие:
if (document.age.pole.value == 5||6||7||8||9||10||11||12||13||14||15||16||17||18| |19||20)
|
Оператор == имеет больший приоритет, чем ||, поэтому эта инструкция будет интерпретироваться так:
if ((((((((((((((((document.age.pole.value == 5)||6)||7)||8)||9)||10)||11)||12)||13)||14)||15)||16)||17)||18)||19)||20)
Теперь я объясню, как работает оператор ||. Сначала вычисляется левый операнд и приводится к булевому типу. Если получилось true, то возвращается раннее вычисленное значение левого операнда (перед приведением к булевому типу), в противном случае вычисляется правый операнд и возвращается его значение.
В данном случае значение document.age.pole.value == 5 равно false, уже является булевым, приводить не надо, поэтому document.age.pole.value==5||6 равно 6 (правому операнду). Далее, 6 приводится к true, поэтому document.age.pole.value==5||6||7 равно 6 и т.д. всё выражение document.age.pole.value == 5||6||7||8||9||10||11||12||13||14||15||16||17||18| |19||20 равно 6.
|
|
19.07.2012, 21:04
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Dim@ и vadim5june, вы неправы. Пример:
var a = 5;
alert(a == (3 || 5 || 6));//false
При этом значение 3||5||6 равно 3, поэтому в a == (3 || 5 || 6) получаем, что 5 сравнивается с 3.
|
|
19.07.2012, 21:07
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
alert( [5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20].indexOf( 2 ) );
alert( [5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20].indexOf( 9 ) );
|
|
19.07.2012, 21:11
|
|
Студент
|
|
Регистрация: 30.04.2012
Сообщений: 1,113
|
|
Сообщение от oneguy
|
vadim5june, вы неправы. Пример:
|
Да похоже на то
Спасибо
|
|
19.07.2012, 21:13
|
|
Профессор
|
|
Регистрация: 21.04.2012
Сообщений: 951
|
|
oneguy,
хм
|
|
|
|