Почему так происходит

Тема в разделе "JavaScript", создана пользователем RedRabbit, 8 сен 2013.

Модераторы: ZiX
  1. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    606
    Симпатии:
    250
    Собственно простой скрипт. Мне нужно узнать, есть ли в url такой признак /index|head|sprite/. Но почему при выполнении выводит переменную h, а не true или false ?
    Код:
    var myRe = /index|head|sprite/ig;
    var myArray = myRe.exec("http://www.site.net/images/index_01.jpg");
    var i='index';
    var h='head';
    var s='sprite';
    myRe == i || h || s;
     
  2. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    потому что жизнь- это боль...


    вообще, я вообще не понимаю что вы делаете. Нужно так
    Код:
    console.log(myArray[0]==i )
    console.log(myArray[0]==h )
    console.log(myArray[0]==s )
    а сейчас идёт вообще лог выражение с 4-мя булевыми операциями
    Код:
    myRe == i || h || s;
    (((myRe == i) || h )|| s);
    false || h || s; // регулярка не равна строке
    'header' || s //  лож или строка вернёт строку
    'header' // строка ИЛИ строка вернёт первую строку
    
     
    RedRabbit нравится это.
  3. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
    Код:
    var myRe = /(index|head|sprite)/ig;
    var myArray = myRe.exec("http://www.site.net/images/index_01.jpg");
    alert (myArray[0]);
     
    RedRabbit нравится это.
  4. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    606
    Симпатии:
    250
    Я не понял вообще, что Вы неаписали:nezn::ah:
    Я в JS не силен. Я толлько сегодня открыл учебник.
    Мне нужно узнать, есть ли в url
    index или head или sprite
    и вернуть true или false. Помогите пожалуйста.
    Я думал так:
    Регулярным выражением найти index или head или sprite в url и сравнить с index или head или sprite. И вывести true при совпадении или false.
     
  5. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    да, примерно так вы и сделали.
    myArray[0] - будет содержать найденное.
    Код:
    if(myArray[0]=='header'){
    
    }elseif(myArray[0]=='index'){
    
    }elseif(myArray[0]=='header'){
    
    
    }else{
    // ничего не нашли
    }
     
    RedRabbit нравится это.
  6. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
    Для "просто проверки" можно воспользоваться test
    Код:
    var myRe = /(index|head|sprite)/ig;
    is = myRe.test("http://www.site.net/images/index_01.jpg");//в is true|false
     
    RedRabbit нравится это.
  7. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    606
    Симпатии:
    250
    Код:
    var myRe = /(index|head|sprite)/ig;
    var is = myRe.test("http://www.site.net/images/index_01.jpg");//в is true|false
    Спасибо, вот так самое то.

    Но мне не совсем понятно почему, такой код не работает? Или так нельзя сравнивать???
    myRe индетично переменной i или h или s ? И должно быдет получиться true, но почему выводтся значение head?
    Код:
    var myRe = 'sprite';
    var i='index';
    var h='head';
    var s='sprite';
    myRe == i || h || s;
     
  8. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
    Чуть выше KillDead пояснил.
    Во-первых, в первом сообщении ты пытаешься сравнить myRe (саму регулярку), а не результат выполнения exec.

    Во-вторых, значение выражения начинает выполняться слева направо. Т.е
    Код:
    myRe == i || h || s;
    первая операция (myRe==i) выдаёт false
    результат операции false || 'head' равен 'head' -
    Результат операции 'head' || {что угодно} равен 'head'

    http://jsfiddle.net/gbC7L/1/
     
    RedRabbit нравится это.
  9. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    606
    Симпатии:
    250
    Понятно. Но можно ли написать проще - короче, не используя if, если у меня сравнений 100? А то получится большая конструкция из if :) Загонять все переменные в массив и потом циклом сравнивать???
    Это чисто мое любопытсво:)

    Код:
    var myRe = 'sprite';
    var i='index';
    var h='head';
    var s='sprite';
    var ...='....';
    ........
    if(i=='header'){ }elseif(h=='index'){ }elseif(s=='header'){ }else{ };
    
    
     
  10. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    360
    Симпатии:
    243
    Много if-ов, как правило, можно на switch заменить.
    Для решения задачи из первого поста if-ы вообще не нужны (пример чуть выше)
    А для поиска в массиве можно использовать функцию indexOf или готовые конструкции JS-фреймворков (часто бывает так, что JQuery уже используется на сайте)
    http://jsfiddle.net/S242Z/
    В Jquery, например, есть inArray
     
    RedRabbit нравится это.