2017-02-20 4 views
-1

В javascript, который будет лучшим способом проверить условное утверждение с точки зрения производительности, надежности и наилучшей практики?Javascript: Какой способ лучше проверить условное утверждение?

var x = null; 
// this condition is checked frequently and x will be set to null or some value accordingly 
if(x !== null){...} 
OR 
if(!!x){...} 
+1

, не зная ожидаемых данных, трудно решить. –

+4

Ваши два утверждения не эквивалентны! – Sirko

+0

'x! == null' и' !! x' не тестируют одно и то же. Что относительно 'x = false'? – Biffen

ответ

4

Вы можете просто сделать

if (x) { ... } 

Просто говорит, если x является truthy значение.

Как указала Нина. Я всегда добавлял бы дополнительную проверку, в зависимости от того, что я ожидаю.

if (x && x > 0) { ... } 

Или

if (x && x instanceof Array) 

Но я всегда проверять х имеет какое-то значение, и не undefined или null

+0

Что относительно нуля? действительно ли это? –

+0

@NinaScholz я бы не использовал его для проверки номеров.Я всегда добавлял бы: '&& x> 0' или что-то подобное ему –

+0

, это не сработает для' x == "" ', потому что x - это строка, и ничего в ней не является допустимой строкой. Вы всегда можете использовать регулярное выражение для строк, чтобы убедиться, что они содержат то, что вы хотите –

1

Это никогда не нужно писать if(!!x){...}. Это точно так же, как писать if(x){...}. Использование оператора ! дважды преобразует значение в логическое значение, которое отражает, является ли оно «правдивым» или нет. Но оператор if делает это в любом случае: он проверяет, является ли предоставленное вами значение «правдивым». Итак, используете ли вы !! или нет, он будет делать то же самое.

if(x !== null){...} что-то еще полностью. Он не просто проверяет, является ли «x» «правдивым», он конкретно сравнивает значение x с null. Например, если x имеет числовое значение 0, if(x){...} или if(!!x){...} будет не выполнить ... код, потому что 0 является «falsy» значение, но if(x!==null)будет выполнить ... код, потому что 0 не то же самое значение, null.

Связанный пример: if(x!=null){...} или if(x==null){...}. (Обратите внимание на использование != или == вместо !== или ===.) Это немного особый случай в JavaScript. Когда вы сравниваете null с использованием оператора != или ==, он фактически сравнивается с null или undefined и рассматривает эти два значения одинаково. Другими словами, если x является либоnull или undefined, то if(x==null){...} выполнит ... код, но if(x!=null){...} не выполнит ... код.

Обычно рекомендуется избегать == и != операторов и использовать строгое сравнение === или !== вместо этого, но лечение null и undefined то же самое может быть полезно в некоторых ситуациях, так это тот случай, когда нестрогие операторы полезно.

В любом случае, реальный вопрос, который задают, является целью вашего кода и что конкретно вам нужно проверить здесь?

+0

@Biffen Хороший улов. Я подробно остановился на этом, учитывая ваш комментарий. Благодаря! –

1

Предполагая, что вы должны проверить значение, которое является strict inequality !== к null

это условие проверяется часто и х будет установлено нулевое значение или некоторое значение соответственно

if (x !== null) { /* */ } 

Тогда вы может использовать только приведенное выше сравнение. Любое другое сравнение вернет неправильный результат.

Например

var x = 0; 
 

 
if (x !== null) {     // true 
 
    console.log(x + ' !== null'); 
 
} 
 

 
if (x) {       // false 
 
    console.log(x); 
 
} 
 

 
// some more checks 
 
console.log(undefined !== null); // true 
 
console.log(undefined != null); // false

+0

Есть ли случай, когда строгое неравенство применялось бы по сравнению с нулевым? Я думаю, что все и все нулевые указатели равны и одинаковы. Благодарю. –

+0

@ JordiHernández, это вопрос «null» по отношению к ложному значению. 'null' является ложным, но никакое значение false не является строгим, равным' null'. вот в чем дело, я пытался это сделать. –

+0

Извините, что настаиваю, но я все равно не понимаю ... Любое значение ложности, отличное от нуля, не равно или строго равно нулю. Например, 'undefined! = Null' должно быть таким же, как' undefined! == null'. Я понимаю, что если бы мы проверяли равенство, было бы строгое равенство, но для неравенства я не вижу разницы. Что мне не хватает? Не могли бы вы привести пример? –

0

Edit: Мой ответ был совершенно неправильно, которую я узнал после моего разговора с Nina Scholz в своей реакции на эту тему. Я обновил соответствующим образом.

Существует множество способов проверки значений в зависимости от типа, который вы ожидаете использовать. Поэтому проблема заключается не столько в производительности, сколько в правильной оценке. Начиная с примерами:

if(x != null) 

Это будет вычисляться false, если значение х равно либо null или `неопределенными.

Следующий случай:

if(!!x) 

Это совершенно другая операция. Он отличает значение x как булево, и в большинстве случаев if(x) будет работать одинаково. Но теперь, если значение ложно, например 0, пустая строка, выражение возвращает false. Таким образом, если ожидает номер, вы должны проверить для нулевого значения:

if(x || (0 === x)) 

Имейте в виду, что если х были ничем иным, как межд выражение возвращает истину.

И тот случай, когда вы ожидаете строку:

if(x || ('' === x)) 

То же самое и здесь, если х было, скажем, 12, то выражение возвращает истину.

Я мог бы продолжить с большим количеством примеров. К сожалению, существуют определенные выражения, которые работают неожиданным образом. Например, должно быть легко проверить, является ли значение числом, вызывая isNaN (число), но если это значение является пустой строкой или представлением индекса массива ('2'), isNaN возвращает false.

Я рекомендую вам проверить this table со всеми преобразованиями типов, чтобы вы стали более осведомлены о том, как проверить правильность значения.

Смежные вопросы