三元运算符如何比较 JavaScript 中的字符和数字?

Posted

技术标签:

【中文标题】三元运算符如何比较 JavaScript 中的字符和数字?【英文标题】:How does the ternary operator compares characters and numbers in 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' 都是假的。 【参考方案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 同意。我总是尽可能地走“预防胜于治疗”的道路。

以上是关于三元运算符如何比较 JavaScript 中的字符和数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用三元运算符比较laravel中2个不同表中的2个变量

javascript ES6 - 带三元运算符的模板字符串

JavaScript中的6种运算符总结

PHP字符串中的三元运算符

带有对象的Javascript三元运算符

JavaScript简介及js中的变量数据类型常用运算符