Как троичный оператор сравнивает символы и цифры в JavaScript? - PullRequest
2 голосов
/ 21 февраля 2020

Мне нужно было найти максимум в массиве, поэтому я написал функцию, которая использовала для l oop, в то же время используя тернарный оператор, и я заметил, что просто изменение направления l oop меняет вывод, плюс вывод также отличается, если Я использую если-еще. Более того, изменение позиции 'a' в массиве также меняет вывод.

const array2 = ['a', 3, 4, 2];

function biggestNumberInArray(arr) {
    let max=0;
    for (let i = 0; i < arr.length; i++) {
      max = max>arr[i]?max:arr[i];
    }
    return max;
}

function biggestNumberInArray2(arr) {
    let max=0;
    for (let i = arr.length - 1; i >= 0; i--) {
      max = max>arr[i]?max:arr[i];
    }
    return max;
}

console.log(biggestNumberInArray(array2));
console.log(biggestNumberInArray2(array2));

При запуске первая функция выводится как 4

При запуске вторая функция выводится 'a'

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Если вы пройдете через отладчик и посмотрите на сравнения ... вы увидите, что сравнение 'a' с любым числом равно всегда ложно.

Вот почему он, кажется, «работает» в одном направлении, но не в другом.

В частности:

При сравнении строки с числом JavaScript преобразует строку на номер при выполнении сравнения. Пустая строка преобразуется в 0. Строка, отличная от нумерации c, преобразуется в NaN, что всегда ложно. При сравнении двух строк «2» будет больше «12», потому что (в алфавитном порядке) 1 меньше 2.

1 голос
/ 21 февраля 2020

Потому что строка 'a' и целые числа 2,3,4 несопоставимы. Поэтому он всегда возвращает false

В первой функции он возвращает 4, потому что сначала сравнивается 'a' и возвращается false, затем max назначается 3

Во второй функции он возвращает 'a', поскольку 'a' сравнивается последним.

Вы можете проверить, можно ли преобразовать строку в число, используя Number() или parseInt()

const arr = ['a', 3, 4, 2];

function biggestNumberInArray2(arr) {
    let max=0;
    for (let i = arr.length - 1; i >= 0; i--) {
      const comparable = Number(arr[i]) || -99
      max = max > comparable ? max : comparable;
    }
    return max;
}

console.log(biggestNumberInArray2(arr))
...