Просмотр полной версии : Не работает "или" в if
Вот простенький код:
<form name="age">
<input type="text" value="" name="pole">
</form>
<script>
function fage () {
var a = document.age.pole.value
if (document.age.pole.value == 1) {
alert('Один пользователь')
}
if (document.age.pole.value == 2||3||4) {
alert(+a+ 'Пользователя')
}
if (document.age.pole.value == 5||6||7||8||9||10||11||12||13||14||15||16||17||18| |19||20) {
alert(+a+ 'Пользователей')
}
}
</script>
<input type="button" value="Сколько?" onclick="fage()">
Почему если я введу "2" например то он мне выдает вначале:2Пользователя(как и надо),а потом 2 пользоватеей???Хотя по условию не должен
Не работает "или" в if
Он работает. И работает правильно. Но, думаю, я очень тебя удивлю, если я расскажу, как:)
1 === 1 || 2 || 3 // вернет true
но3 === 1 || 2 || 3 // вернет 2 :0Почему? Все просто! Оператор || возвращает то, что при приведении к boolean дает true.
Т.е. в первом:
1 === 1 - это true. Boolean(true) === true; поэтому возврает true.
А во-втором случае:
3 === 1 - это false;
А вот Boolean(2) === true, поэтому возвращает 2.
А в твоем случае лучше использовать switch:
switch(a){
case 1:
alert( 'Один пользователь' );
break;
case 2: case 3: case 4:
alert( a + 'пользователя' );
break;
default:
alert( a + 'пользователей' );
};
И еще: +a+ 'Пользователя'Т.е. ты сначала строку приводишь к числу, чтобы потом интерпритатор привел это число к строке, чтобы сложить со строкой? Не бред ли???
Спасибо.И еще: +a+ 'Пользователя'
+a+ 'Пользователя'
Т.е. ты сначала строку приводишь к числу, чтобы потом интерпритатор привел это число к строке, чтобы сложить со строкой? Не бред ли???
А как под другому?Если по короче:чтобы то число которое вводилось в строке,появлялось в алерте.
Я вот к чему:alert( '1' + '' === +'1' + '' );Если нет разницы, зачем делать лишние телодвижения?
monolithed
07.05.2011, 20:43
А как под другому?Если по короче:чтобы то число которое вводилось в строке,появлялось в алерте.
куда проще:
<script type="text/javascript">
window.onload = function() {
var events = ['keyup', 'change'], i = events.length, input = document.getElementById('input');
while(i--) {
input['on'+events[i]] = function() {
var _value = this.value;
if(_value != '' && /\d/.test(_value)) {
alert('пользовател'+(_value == 1 ? 'ь' : _value >= 2 && _value <= 4 ? 'я' : 'ей'));
}
};
break;
}
};
</script>
<input type="text" id="input" value="" />
куда проще:
<script type="text/javascript">
window.onload = function() {
var events = ['keyup', 'change'], i = events.length, input = document.getElementById('input');
while(i--) {
input['on'+events[i]] = function() {
var _value = this.value;
if(_value != '' && /\d/.test(_value)) {
alert('пользовател'+(_value == 1 ? 'ь' : _value >= 2 && _value <= 4 ? 'я' : 'ей'));
}
};
break;
}
};
</script>
<input type="text" id="input" value="" />
Насколько я понял тут правильные окончания только до 20
Я вот к чему:alert( '1' + '' === +'1' + '' );Если нет разницы, зачем делать лишние телодвижения?
"Лишние телодвижения"-Написать "+"?;)
для компа это не просто плюсик перед строкой - это перевод из одного типа в другой
не дурмаю, что всё так легко
monolithed
08.05.2011, 13:05
Насколько я понял тут правильные окончания только до 20
А кто вам мешает подумать?
<script type="text/javascript">
window.onload = function() {
var events = ['keyup', 'change'], i = events.length, input = document.getElementById('input');
while(i--) {
input['on'+events[i]] = function() {
var _value = this.value;
if(_value != '' && /\d/.test(_value)) {
var regex = _value.match(RegExp('\\d'+(_value <= 20 ? '{1,}' : '')+'$'));
alert('пользовател'+(regex == 1 ? 'ь' : regex >= 2 && regex <= 4 ? 'я' : 'ей'));
}
};
break;
}
};
</script>
<input type="text" id="input" value="" />
А кто вам мешает подумать?
<script type="text/javascript">
window.onload = function() {
var events = ['keyup', 'change'], i = events.length, input = document.getElementById('input');
while(i--) {
input['on'+events[i]] = function() {
var _value = this.value;
if(_value != '' && /\d/.test(_value)) {
var regex = _value.match(RegExp('\\d'+(_value <= 20 ? '{1,}' : '')+'$'));
alert('пользовател'+(regex == 1 ? 'ь' : regex >= 2 && regex <= 4 ? 'я' : 'ей'));
}
};
break;
}
};
</script>
<input type="text" id="input" value="" />
Единственный нюанс...Я новичок,и слабо в нем разбираюсь,но все равно спасибо
Чуваки, прошло больше года, а я так до сих пор и не въехал, почему при вводе: 2, выполняется это условие:
if (document.age.pole.value == 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))
alert(2 == 5||6||7||8||9||10||11||12||13||14||15||16||17||18| |19||20)
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
vadim5june
19.07.2012, 20:12
Чуваки, прошло больше года, а я так до сих пор и не въехал, почему при вводе: 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
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 || "Я текст"))
Чуваки, прошло больше года, а я так до сих пор и не въехал, почему при вводе: 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.
Dim@ и vadim5june, вы неправы. Пример:
var a = 5;
alert(a == (3 || 5 || 6));//false
При этом значение 3||5||6 равно 3, поэтому в a == (3 || 5 || 6) получаем, что 5 сравнивается с 3.
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 ) );
vadim5june
19.07.2012, 21:11
vadim5june, вы неправы. Пример:
Да похоже на то
Спасибо
Я прочитал только сообщение димы, остальные не читал. Короче, если поставить скобки, то будет как в алгебре:
2( a * b) = 2a * 2b. Логику понял. Спасибо.
================
Так прочитал все сообщения. Онегин, почему тогда?
=============
devote,
это-то понятно, если такова задача, я бы все равно нашел решение. Задача ж простая :) Но вот этот || =)
9xakep,
лучше почитай посты oneguy
------------------------------------
к нему вопрос - ты (вы) с Java что ли перешел?
9xakep,
Потому что нун прописывать явно
var a=document.age.pole.value;
if(a==5||a==6||a==7||a==8||a==9||a==10||a==11||a== 12||a==13||a==14||a==15||a==16||a==17||a==18||a==1 9||a==20)
{хотя достаточно
if(a>4&&a<21&&(a-parseInt(a)==0))
111111111111111111111
=
111111111111111110000 пользователя
=)
И таймер который перезаписывает див постоянно - плохой вариант.
Таймер просто для примера - с кнопкой неудобно.
Хотя непонятно, чем же он так плох? :)
Попробуйте скопировать результат.=)
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot