首页 新闻 会员 周边 捐助

一个js运算符问题

0
悬赏园豆:20 [已解决问题] 解决于 2010-03-19 16:48

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

  • 负零等于正零。

  • 负无穷小于包括其自身在内的任何数。

  • 正无穷大于包括其自身在内的任何数。

 

但是这里并没有将 两个文本框的值转换成 数字做比较?

有知道的,请解释下,谢谢!

 

问题补充: function compare 代码怎么复制进去少了一段? 完整如下: function compare() { alert(document.getElementById("txtOne").value > document.getElementById("txtTwo").value); }
张坤1的主页 张坤1 | 初学一级 | 园豆:4
提问于:2010-03-19 12:07
< >
分享
最佳答案
0

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

补充回复: 

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

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

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

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

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

 

补充二:

比较运算符

用于比较表达式。

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对象的属性时取出的是字符串类型值

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

    收获园豆:20
    西越泽 | 专家六级 |园豆:10775 | 2010-03-19 12:27
    恩,我就想知道为什么是这样?
    张坤1 | 园豆:4 (初学一级) | 2010-03-19 12:34
    @张坤:做了补充回复
    西越泽 | 园豆:10775 (专家六级) | 2010-03-19 12:47
    @卡索: 但是按照 js手册描述的意思: “尝试将 expression1 和 expression2 都转换为数字” 为什么?
    张坤1 | 园豆:4 (初学一级) | 2010-03-19 12:59
    @张坤:这个没有这个说法吧!你看的是那个手册,我看的手册未有说尝试进行转换为数字比较的。
    西越泽 | 园豆:10775 (专家六级) | 2010-03-19 13:04
    @卡索: "JScript8 微软官方手册.chm“文档中"比较运算符"章节的"关系运算符" 是这样描述的: 关系运算符(<、>、<=、>=) 尝试将 expression1 和 expression2 都转换为数字。 如果两个表达式均为字符串,则按字典序比较字符串。 如果任一表达式为 NaN,则返回 false。 负零等于正零。 负无穷小于包括其自身在内的任何数。 正无穷大于包括其自身在内的任何数。 这个是Jscript 的和Javascript 可能有些不一样,但也不会差太多吧。 然后你可以看看下面这篇文章: http://jiake.javaeye.com/blog/231186 六、比较运算符:   这些比较运算符用于比较不同类型的值,结果返回一个布尔值。   “<”“>”“<=”“>=”   注意规则:比较的运算数可以是任意类型的,但是只能在数字和运算数上执行。不是数字和字符串的运算数将被转换成数字或字符串。   1)如果两个运算数都是数字,或者都可以转换成数字,则按照数字的大小进行比较;   2)如果两个运算数都是字符串,或者都可以转换成字符串,则将按照字母顺序进行比较;   3)如果字符串遇到数字,则将字符串转换成数字进行比较。   4)如果运算数既不能转换成数字,也不能转换成字符串,则返回结果false。 其实这个也没有什么权威性,哎!
    张坤1 | 园豆:4 (初学一级) | 2010-03-19 14:16
    @张坤:请看我的再补充回答。另外要说的是,你说的JScript8和另外的文章写的没错,但是主要是还要依据事实,依据标准文档的说法。
    西越泽 | 园豆:10775 (专家六级) | 2010-03-19 14:47
    @卡索:<br/> 看了 http://www.w3school.com.cn/js/pro_js_operators_relational.asp 这个,现在我只能这样理解:<br/> exp1 exp2 比较时,除非有一个是数字类型,将会把另外一个转换成数字类型进行比较,否则,都是字符串就按字符串比较,都是数字就按数字比较?<br/> 这样可对?
    张坤1 | 园豆:4 (初学一级) | 2010-03-19 15:59
    @张坤:(⊙v⊙)嗯 是的!这样子理解是么问题的。同时需要记住一点啊,DOM操作取回的所有属性的值都是字符串类型啊。 所以他不会尝试去转换成数字做比较啊。 尝试数字做比较的情况是exp1或者exp2其中之一是数字的时候才会发生啊!
    西越泽 | 园豆:10775 (专家六级) | 2010-03-19 16:12
    @卡索:恩,谢谢!
    张坤1 | 园豆:4 (初学一级) | 2010-03-19 16:46
    @卡索: 对了,怎么给分啊?
    张坤1 | 园豆:4 (初学一级) | 2010-03-19 16:47
    清除回答草稿
       您需要登录以后才能回答,未注册用户请先注册