【问题标题】:How does the ternary operator compares characters and numbers in JavaScript?三元运算符如何比较 JavaScript 中的字符和数字?
【发布时间】:2020-06-05 13:28:38
【问题描述】:

我必须在数组中找到最大值,所以我编写了一个用于循环的函数,同时还使用了三元运算符,我注意到如果我使用 if-else,只要反转循环的方向就会改变输出加上输出也不同。此外,改变 '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'

【问题讨论】:

  • 问:您有没有通过调试器查看“max”在什么时候被错误地更改为错误的数字?
  • @Shivansh 你认为'a' 与数字相比会转换成什么?
  • @PatrickRoberts 我认为它会更改为它的 ASCII 值,即 97
  • @Shivansh 那你就错了。
  • 有趣的是,4 &gt; 'a'4 &lt; 'a'4 == 'a' 都是假的。

标签: javascript arrays loops if-statement conditional-operator


【解决方案1】:

如果您单步调试调试器并查看比较...您会发现将 'a' 与 any 数字进行比较是 always false。

这就是为什么它似乎在一个方向上“起作用”,而不是另一个方向。

具体来说:

当比较一个字符串和一个数字时,JavaScript 会将 进行比较时将字符串转换为数字。空字符串转换 为 0。非数字字符串转换为始终为 false 的 NaN。 比较两个字符串时,“2”会大于“12”,因为 (按字母顺序)1 小于 2。

【讨论】:

  • 请正确cite your quote
  • NaN 的有趣之处在于它甚至不等于它自己 NaN == NaN false。
【解决方案2】:

因为字符串'a' 和整数2,3,4 是不可比的。因此它总是返回false

在您的第一个函数中,它返回4,因为首先比较'a'并返回false,然后分配max3

在第二个函数中,它返回 '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))

【讨论】:

  • 很好,但我认为如果我们首先从 arr 中过滤掉字符串,例如 arr.filter(parseFloat),那么所有这些都可以避免
  • 是的,如您所说,可以改进。我只是想解释一下为什么第二个函数返回'a'而不是4
  • 同意。我总是尽可能地走“预防胜于治疗”的道路。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-05
  • 2015-06-10
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 2019-05-12
  • 2017-08-02
相关资源
最近更新 更多