Различение 0 и null в операторе OR в Javascript

#javascript

#javascript

Вопрос:

У меня есть приведенный ниже код в моей функции, я хочу присвоить значение переменной newValue .

var newValue = fieldValue || originalValue || masterValue;

Здесь, если у меня есть исходное значение = 0, java-скрипт обрабатывает его как false / null и присваивает masterValue новому значению. Вместо этого я хочу присвоить OriginalValue (0) новому значению.

Есть ли способ добиться этого без дополнительной строки кода?

Комментарии:

1. Вы хотите проверить специально для null then, а не просто какое-либо ложное значение?

2. На самом деле для обоих значений null и false просто не хочу проверять 0.

3. Тогда нет, нет способа сделать это без дополнительного кода, независимо от того, помещаете ли вы этот код в ту же строку или нет, зависит от вас.

4. Я почти уверен, что это дубликат вопросов == vs === .

5. @ssube Вовсе нет, || оператор не имеет ничего общего с равенством

Ответ №1:

Да, но это становится немного сложнее (с использованием троичного оператора).

 var newValue = fieldValue || (originalValue || originalValue===0) ? originalValue : masterValue;
  

(это предполагает, что вы хотите, чтобы 0 присваивалось даже при fieldValue вводе)

Комментарии:

1. Теперь попробуйте выполнить false || false==0 и посмотрите, что вы получите (подсказка: вам нужно строгое сравнение) ?

2. На самом деле нет, только в OriginalValue .

3. обновлено @Y.Solanki ( только для originalValue исправления и для комментария @adenao )

4. Да, нестрогое сравнение скажет вам, что false и 0 то же самое, это та же проблема || .

Ответ №2:

Определите «хорошее» значение с помощью предиката и передайте его Array.find функции:

 var isValid = x => !!x || x === 0;
var newValue = [fieldValue, originalValue, masterValue].find(isValid);
  

Если вы нацелены на старые MSIES, .find может быть заменен на .filter(...)[0] .

 var isValid = x => !!x || x === 0;

console.log([1, 2, 3].find(isValid));
console.log([false, 0, 3].find(isValid));
console.log([null, 0, 3].find(isValid));
console.log([undefined, 0, 3].find(isValid));
console.log(["", 0, false].find(isValid));
console.log(["", null, false].find(isValid));  

Комментарии:

1. приятно, хотя в комментарии OP упоминается, что 0 должно быть действительным только для originalValue переменной, а не для любой из них.

Ответ №3:

Вы захотите использовать

 var newValue = fieldValue;
if (newValue == null)
    newVAlue = originalValue;
if (newValue == null)
    newValue = masterValue;
  

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

Ответ №4:

Если вы хотите заставить это работать с одной строкой кода, вот вариант:

 var fieldValue = false;
var originalValue = 0;
var masterValue = 5;

var newValue = fieldValue || (originalValue===0)?0:originalValue || masterValue;

console.log(newValue); // newValue=0