三元运算符如何比较 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 > 'a'
、4 < '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
,然后分配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))
【讨论】:
很好,但我认为如果我们首先从 arr 中过滤掉字符串,例如arr.filter(parseFloat)
,那么所有这些都可以避免
是的,如您所说,可以改进。我只是想解释一下为什么第二个函数返回'a'
而不是4
同意。我总是尽可能地走“预防胜于治疗”的道路。以上是关于三元运算符如何比较 JavaScript 中的字符和数字?的主要内容,如果未能解决你的问题,请参考以下文章