javascript - 关于js字符串之间的比较
黄舟
黄舟 2017-04-11 12:46:28
0
2
315

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

关于隐式转换的问题

这是未显示转换时的判断 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));

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

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

모든 응답 (2)
Peter_Zhu

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

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

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

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

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

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

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

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

像:

console.log(1 > '1');

这样才算隐式转换。

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

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

这才是所谓的隐式转换。

    大家讲道理

    prompt返回的是一个字符串。这一点,楼上的说清楚了。然后关于字符串之间的比较,我简单说下我的认知。

    关于楼上说的示例中没有什么隐式转换这句话我是不太认同的。

    因为字符串直接进行的大小比较,它的本质上是将字符串进行转化为ASCII字符编码后进行大小的比较,
    所以这里是有隐式转换的。

    下面简单写点例子证明一下,楼主就清楚了。

    'a'<'A' false小写的a的编码是97,大写A的编码是65 所以这里实质上是97<65 false

    '124'<'9' true这里会涉及到一个比较时的行为,简单来讲,对字符串进行比较时,都是由第一个
    字符先进行比较的,如果得出大小,那么直接返回结果比如这里的'124'中的1小于9所以直接得出了true,
    但是,如果第一项没有得到结果(相同,相等),那么就比较第二项,依次类推,直到得出结果。
    例如:
    '12'>'113' true这里第一项相等于是比较第二项也就是2>1所以true
    '123'>'1211' true比较第三项3>1

    希望能帮到你0.o

      최신 다운로드
      더>
      웹 효과
      웹사이트 소스 코드
      웹사이트 자료
      프론트엔드 템플릿
      회사 소개 부인 성명 Sitemap
      PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!