Нулевая объединяющая строка и условная строка с помощью логического оператора OR приводят к числу - PullRequest
1 голос
/ 14 апреля 2020

Объединение нулей путем OR ввода строки (через PRIORITIES[NUM_TO_PRIORITY[priorityNum]], где priorityNum - ввод) и строки (через условное Object.values(PRIORITIES).includes(priorityNum) ? priorityNum : PRIORITIES.low) должны выводить строку, но выводить число (соответствующее вводу). Почему это происходит?

Это может быть js причудой, но неуверенно, почему результат является числом, поскольку тестирование показывает, что объединение должно быть между 2 строками для вывода строки:

const PRIORITIES = {
    high: 'HIGH',
    low: 'LOW',
};
const NUM_TO_PRIORITY = {
    0: 'high',
    1: 'low',
};
const priorityNum = 0;
console.log(PRIORITIES[NUM_TO_PRIORITY[priorityNum]]); // "HIGH"
console.log(Object.values(PRIORITIES).includes(priorityNum)); // false
console.log("HIGH" || false) // "HIGH" <- Expected output

// Based on the above code, the following code should output "HIGH" yet outputs 0, why does this happen?
console.log(PRIORITIES[NUM_TO_PRIORITY[priorityNum]] || Object.values(PRIORITIES).includes(priorityNum) ? priorityNum : PRIORITIES.low);

Ответы [ 2 ]

3 голосов
/ 14 апреля 2020

Как уже упоминалось в другом ответе, это связано с приоритетом оператора.

valOne || valTwo ? priorityNum : PRIORITIES.low;

- это то же самое, что и

(valOne || valTwo) ? priorityNum : PRIORITIES.low;

, но вы хотели:

valOne || (valTwo ? priorityNum : PRIORITIES.low);

Поскольку большинство не запоминает приоритет для более 20 операторов, избегайте этих ошибок, используя больше скобок (как показано выше) или больше переменных:

const PRIORITIES = {
    high: 'HIGH',
    low: 'LOW',
};
const NUM_TO_PRIORITY = {
    0: 'high',
    1: 'low',
};
const priorityNum = 0;

const priority = PRIORITIES[NUM_TO_PRIORITY[priorityNum]]
const otherVal = Object.values(PRIORITIES).includes(priorityNum) ? priorityNum : PRIORITIES.low

priority || otherVal; // "HIGH"
2 голосов
/ 14 апреля 2020

|| имеет более высокое значение operator precedence, чем ?, поэтому ваш код оценивается как

(PRIORITIES[NUM_TO_PRIORITY[priorityNum]] || Object.values(PRIORITIES).includes(priorityNum))  ? priorityNum : PRIORITIES.low

const PRIORITIES = {
    high: 'HIGH',
    low: 'LOW',
};
const NUM_TO_PRIORITY = {
    0: 'high',
    1: 'low',
};
const priorityNum = 0;
console.log(PRIORITIES[NUM_TO_PRIORITY[priorityNum]]); // "HIGH"
console.log(Object.values(PRIORITIES).includes(priorityNum)); // false
// "HIGH" || false // "HIGH" <- Expected output

// Based on the above code, the following code should output "HIGH" yet outputs 0, why does this happen?
console.log(PRIORITIES[NUM_TO_PRIORITY[priorityNum]] || Object.values(PRIORITIES).includes(priorityNum) ? priorityNum : PRIORITIES.low);
...