作者:Truly
日期:2007.7.31
引言:由于JavaScript的灵活简单,很多人忽略了JavaScript技术细节,没有掌握一些基础知识点,比如+、-运算这样的基础操作。同时应部分网友要求,发一篇基础知识的文章,希望能够继续抛砖引玉。今天阅读了鸟食轩早期的一篇文章《在JavaScript中也玩变量类型强行转换》,文中提到的一个例子:"88"-8和"88"+8,结果分别是80和"888",看起来有点奇怪,但是这一点正是我们必须要掌握的JavaScript特性之一,所以,今天再重新回顾一下Javascript的一些细节:
开始:
我们先看一下“+”在JavaScript文档中的说明:
语法:result = expression1 + expression2
参数:result 任何变量。
expression1 任何表达式。
expression2 任何表达式。
说明:
如果 那么
两个表达式都是数字或 Boolean 值 加
两个表达式都是字符串 连接
一个表达式是数字而另一个是字符串 连接
而下面再看“-”的定义:
语法1:result = number1 - number2
语法2:-number
说明: 在语法 1 中,- 运算符是算术减法运算符,用来获得两个数值之间的差。在语法 2 中,- 运算符被用作一元取负运算符,用来指出一个表达式的负值。
对于语法 2,和所有一元运算符一样,表达式按照下面的规则来求值:
如果应用于 undefined 或 null 表达式,则会产生一个运行时错误。
对象被转换为字符串。
如果可能,则字符串被转换为数值。如果不能,则会产生一个运行时错误。
Boolean 值被当作数值(如果是 false 则为 0,如果是 true 则为 1)。
该运算符被用来产生数值。在语法 2 中,如果生成的数值不是零,则 result 与生成的数值颠倒符号后是相等的。如果生成的数值是零,则 result 是零。
这里我来做一个补充,“+”“-”通常作为算术运算符,也就是参见运算的都应该是数字表达式。而“+”同时还用于字符串的连接操作,因此对它们的运算特点可归纳如下:
- 对于含有“-”的运算,最后结果应该是数值,参与运算的2个表达式都将向数值转换,如果转换失败,则抛出运行时错误。
- 对于含有“+”的运算,一旦“+”两边其中的一个是字符串,那么认为是字符串连接,所有参与运算的表达式都向字符串转换,最终是一个连接好的字符串。
总结完上面的一些特性,下面我们看它们在实际中的巧用:
我们需要转换一个字符串为整型时,上面的代码从逻辑上是正确的,但是结果却是错误的,其中的原理可以参考JavaScript文档,也可参见鸟食轩的另一篇文章《这么小心还是在"08"向8的转换上栽了》
这时我们可以使用“-”的特性,进行一次数值转换,代码如下:
这次我们得到了正确的值,同样的“+”也可以进行一些妙用,常用来自动进行数值到string的转换。
最后要提醒大家的是使用上面的规律时要注意表达式中运算的优先级,例如:
alert(1+''+2);
得到不同的结果"3"和"12"。
这里同时补充一个三目操作的运算表达式。与C#的三目运算相似,使用三目操作可以简化我们的代码,下面我们看下面两行代码:
var dt = new Date();
month1 = dt.getMonth()<10?'0':'' + dt.getMonth();
month2 = (dt.getMonth()<10?'0':'') + dt.getMonth();
alert(month1);
alert(month2);
</script>
这段代码是用来获取日期中月份的2位表示字符串,那么哪一种是正确的呢?这个问题留给诸位去思考。
小节:本文通过这几个典型错误的分析,说明了基础知识的重要性,希望大家以后在编写JavaScript代码的时候可以避免这样的低级错误。