为了账号安全,请及时绑定邮箱和手机立即绑定

一个js运算符问题

一个js运算符问题

肥皂起泡泡 2018-12-06 15:40:13
js code: <input type="text" id="txtOne" value="4" /><input type="text" id="txtTwo" value="13" /><input type="button" id="btnOperation" value="Compare" onclick="compare();" /> function compare(){ alert(document.getElementById("txtOne").value > document.getElementById("txtTwo").value);} 这段代码返回结果是什么? 如果比较时 按照 数字类型比较 结果是 false; 如果比较时 按照 字符串类型比较 结果是 true; 但经过测试,是按照字符串比较的 结果是 ture。 通用看js手册关于“关系运算符(<、>、<=、>=)”描述如下 尝试将 expression1 和 expression2 都转换为数字。 如果两个表达式均为字符串,则按字典序比较字符串。 如果任一表达式为 NaN,则返回 false。 负零等于正零。 负无穷小于包括其自身在内的任何数。 正无穷大于包括其自身在内的任何数。   但是这里并没有将 两个文本框的值转换成 数字做比较? 有知道的,请解释下,谢谢!  
查看完整描述

1 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

按一般思维这个结果是false。不过结果并非如此,返回的是true。

补充回复: 

这里执行的是字符串比较。因为DOM元素的属性都是字符串类型的,所以这里他只会做字符串比较。要做数字的大小对比必须使用parseInt进行转换成整型数然后做对比。

所以这里的重点是javascript字符串比较的问题了。

javascript在进行字符串比较的时候执行的是按位进行比较的,所以这里按位进行比较时就是字符4和字符1进行对比,这个对比就很明确了,ASCII码值4是比1大的(这里还待商榷,我还需要证实下)。

另外为了说明这里执行的是字符串比较,我把代码稍稍加了句话,你可以看下

alert(typeof (document.getElementById("txtOne").value));
alert(typeof (document.getElementById("txtTwo").value));

 

补充二:

比较运算符

Footer Start NONSCROLLING BANNER END

用于比较表达式。

result = expression1 comparisonoperator expression2 

参数

result
任意数值。
expression
任何表达式。
comparisonoperator
任何比较运算符。
object
任何对象名称。

说明

下表包含一个比较运算符的列表,以及确定 resultTrue, False, 或 Null 的条件。

运算符描述True 如果false 如果Null 如果
< 小于 expression1 < expression2 expression1 >= expression2 expression1 or expression2 = Null
<= 小于或等于 expression1 <= expression2 expression1 > expression2 expression1 or expression2 = Null
> 大于 expression1 > expression2 expression1 <= expression2 expression1 or expression2 = Null
>= 大于或等于 expression1 >= expression2 expression1 < expression2 expression1 or expression2 = Null
= 等于 expression1 = expression2 expression1 <> expression2 expression1 or expression2 = Null
<> 不等于 expression1 <> expression2 expression1 = expression2 expression1 or expression2 = Null

当比较两个表达式时,您或许不容易确定比较的表达式是作为数值或作为字符串。

下表描述了如何对表达式进行比较、以及比较的结果,它取决于比较的子类型。

如果
两个表达式都是数值 执行数值比较。
两个表达式都是字符串 执行字符串比较。
一个表达式是数值,加一个表达式是字符串 数值表达式小于字符串表达式。
一个表达式为 Empty 而另一个为数值 执行数值比较,0 作为 Empty 表达式的值。
一个表达式为Empty 而另一个表达式为字符串 执行字符串比较,零长度的字符串 ("") 作为 Empty 表达式的值。
两个表达式都为 Empty 则两个表达式相等。

 

你看下上面的说法!这里很明确,两个表达式都是字符串,执行字符串比较。 而我们在操作DOM对象的属性时取出的是字符串类型值。所以这里他进行的是字符串比较

 

补充回复二:

为保证我在说明事实之前请先打开http://www.w3school.com.cn/js/pro_js_operators_relational.asp 这个链接,然后浏览一遍相关描述。

另外你也可以下载一个ECMAScript 262的手册找到关系运算符一章,看看官方的描述。

看看你给的链接的文章http://jiake.javaeye.com/blog/231186说的是否正确,我不敢说他翻译或者转抄的是完全正确的,但至少他这里的说法不够准确的。

针对JScript8中微软官方文档中描述这个是没错的,但我想这个是理解的问题。且看

  • 尝试将 expression1 和 expression2 都转换为数字。

  • 如果两个表达式均为字符串,则按字典序比较字符串。                                                           针对这里的描述我想是会产生理解的偏差的,但是这里我觉得写的还是很明确的,尝试将exp1和exp2转换为数字,如果exp1和exp2均为字符串,则按字典顺序比较字符串。备注:操作DOM对象的属性时取出的是字符串类型值

  • 不好意思,我这里扣字眼了!

    查看完整回答
    反对 回复 2018-12-24
    • 1 回答
    • 0 关注
    • 488 浏览
    慕课专栏
    更多

    添加回答

    举报

    0/150
    提交
    取消
    意见反馈 帮助中心 APP下载
    官方微信