2009-12-14 2 views
9

Это действительно отличная функция, написанная на JQuery, чтобы определить значение поля URL:Javascript IsNull

$.urlParam = function(name){ 
    var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href); 
    return results[1] || 0; 
} 

// example.com?someparam=name&otherparam=8&id=6 
$.urlParam('someparam'); // name 
$.urlParam('id'); // 6 
$.urlParam('notavar'); // null 

http://snipplr.com/view/11583/retrieve-url-params-with-jquery/

Я хотел бы добавить условие для проверки нулевой, но это выглядит вид klunky:

if (results == null) { 
    return 0; 
} else { 
    return results[1] || 0; 
} 

Вопрос: Каков элегантный способ выполнения вышеуказанного утверждения if/then?

+0

лол, точный кусок кода, который я собирался задать точный вопрос о.3yrs later – sMaN

+0

Тест на 'results [1]' был бы лишним, так как если 'results' не является нулевым, это означает, что regexp преуспел, что означает, что также была найдена первая захваченная группа. Итак, все, что вам нужно, это «результаты? результаты [1]: 0'. – 2014-09-28 08:07:27

ответ

21
return results == null ? 0 : (results[1] || 0); 
+0

@Brad Что такое (результаты [1] || 0)? Я этого раньше не видел. – imperium2335

+0

Свой объект в позиции индекса 1 в 'результатах' или значение 0. – Brad

+0

Brad, попробуйте использовать '.test()' is best – KingRider

10
return results == null ? 0 : (results[1] || 0); 
+0

не соответствует действительности: || относится к значению по результатам [1] – Frunsi

+0

@DDaviesBrackett: это не: js> results = null; null js> результаты [1] || 0; typein: 2: TypeError: результаты не имеют свойств –

+0

Ну, похоже, что вы ответили первым, так что вы получаете мой перелет. –

1
if (typeof(results)!='undefined'){ 
    return results[1]; 
} else { 
    return 0; 
}; 

Но вы можете проверить, если результаты является массивом. Массивы имеют тип объекта, так что вы будете нуждаться в этом function

function typeOf(value) { 
    var s = typeof value; 
    if (s === 'object') { 
     if (value) { 
      if (value instanceof Array) { 
       s = 'array'; 
      } 
     } else { 
      s = 'null'; 
     } 
    } 
    return s; 
} 

Так что ваш код становится

if (typeOf(results)==='array'){ 
     return results[1]; 
} 
else 
{ 
     return 0; 
} 
1
return results==null ? 0 : (results[1] || 0); 
+0

Вы только что переписали код, предоставленный OP, чтобы использовать тернарный оператор вместо ' if'. – 2016-06-18 16:44:41

2

Вы можете попробовать это:

if(typeof(results) == "undefined") { 
    return 0; 
} else { 
    return results[1] || 0; 
} 
3

самый немногословный решение было бы изменить return results[1] || 0; до return (results && results[1]) || 0.

+0

Я получаю сообщение об ошибке «results is null» в firebug, если я возвращаю результаты [1] || 0 –

+0

Что делает &&? Можете ли вы объяснить эту строку кода, пожалуйста? –

+0

Нет необходимости в параметрах parens, это приоритет по умолчанию, поэтому 'results && results [1] || 0'. – 2014-09-28 08:00:03

1
return (results||0) && results[1] || 0; 

В & & оператор действует как охранник и возвращает 0, если результаты, если falsy и вернуть крайнюю правую часть, если truthy.

1

Все упомянутые решения являются законными, но если мы говорим об элегантности, то я буду браться на следующем примере:

//function that checks if an object is null 
var isNull = function(obj) { 
    return obj == null; 
}    

if(isNull(results)){ 
return 0; 
} else { 
    return results[1] || 0; 
} 

Использование функции IsNull помогает код более читаемым.

1

Я предпочитаю стиль

(results || [, 0]) [1] 
+0

Это не дает ответ на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. – sanders

+1

Это действительно дает явный ответ на вопрос. Это не критика или просьба о разъяснении. В каком смысле это не ответ? Это конструкция, которую я использую все время, чтобы разобраться с точным вопросом, заданным OP, а именно с тем, чтобы кратко описать результат «null» из «RegExp # exec». – 2014-09-28 08:38:41

+0

Мне нравится этот ответ лучше всего, потому что я не могу найти способ его неверно истолковать И, что важно, ответ по умолчанию (0) задается только один раз. Многие ошибки кодирования вводятся, когда определенное магическое число появляется в нескольких местах. –

0

Вы также можете использовать не оператор. Он будет проверять, является ли переменная нулевой, или, в случае строки, пуст. Это делает ваш код более компактным и удобным для чтения.

Например:

var pass = ""; 
if(!pass) 
    return false; 
else 
    return true; 

Это вернет ложь, потому что строка пуста. Он также возвращает false, если переменная pass имеет значение null.

1

Почему бы не попробовать .test()? ... попытать и лучший булево (истина или ложь):

$.urlParam = function(name){ 
    var results = new RegExp('[\\?&]' + name + '=([^&#]*)'); 
    return results.test(window.location.href); 
} 

Учебник: http://www.w3schools.com/jsref/jsref_regexp_test.asp