javascript - 关于js字符串之间的比较

查看:69
本文介绍了javascript - 关于js字符串之间的比较的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

一个简单的求最大值的问题

关于隐式转换的问题

    这是未显示转换时的判断
    var n1=prompt("请输入第一个数");
    var n2=prompt("请输入第二个数");
    var n3=prompt("请输入第三个数");
    n1>n2 ? (n1>n3 ? alert("最大值是:"+n1) : alert("最大值是:"+n3))
    :(n2>n3?alert("最大值是:"+n2):alert("最大值是:"+n3));

值较小的时候最大值的判断是没问题的, 但是出现比如 124 127 9 时 判断的最大值为9.

这是解决之后的代码

    var n1=parseInt(prompt("请输入第一个数"));
    var n2=parseInt(prompt("请输入第一个数"));
    var n3=parseInt(prompt("请输入第一个数"));
    n1>n2 ? (n1>n3 ? alert("最大值是:"+n1) : alert("最大值是:"+n3))
    :(n2>n3?alert("最大值是:"+n2):alert("最大值是:"+n3));

有没有大神能解释一下隐式转换出错的原因 和里面的机制。 感激不尽!

解决方案

你的示例中没有什么隐式转换。

首先 prompt 返回的是一个字符串。

那么字符串之间的比较是从左至右(其实比较字符串是以String对象进行比较,以通俗的话从左至右是相通的),所以就会出现 "127" < "9"。

parseInt 嘛,就是转换整数后,再比较。

==========针对楼下的UPDATE==========

不可否认,楼下在解释字符串比较的本质是没有错,不过他只说了编码单元值比较的部分,实际ECMAScript规则中,会先进行前缀比较;即如果n2是n1的前缀则返回 false、或n1是n2的前缀则返回 true。才走编码单元值比较。

但,这跟隐式有半毛关系??

两个字符串在比较时压根就不存在类型转换的问题。

像:

console.log(1 > '1');

这样才算隐式转换。

JavaScript是从左至右扫描,那么当一个 Number 类型与 String 类型比较时,才需要转换。那他们的流程是怎么样,看ECMAScript

重点在第二个红框,如果比较不是两个字符串时这个时候才会进行将一切操作数转换为 Number再作比较,即把字符串转换成 Number 类型,有兴趣可以看看

这才是所谓的隐式转换。

这篇关于javascript - 关于js字符串之间的比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆