惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
爱范儿
爱范儿
WordPress大学
WordPress大学
Last Week in AI
Last Week in AI
博客园 - 聂微东
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园_首页
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
宝玉的分享
宝玉的分享
罗磊的独立博客
Jina AI
Jina AI

博客园 - Truly

找不到具有绑定 MetadataExchangeHttpBinding 的终结点的与方案 http 匹配的基址。注册的基址方案是 [https] 生成8位的不重复乱码 省地市级联选择js 继续完善SandCastle 使用SandCastle和ScriptDoc创建JavaScript文档 关于.NET的异常处理的几个误区 JavaScript实现自定义事件 JavaScript面向对象之属性实现 JavaScript随笔一篇 - Truly - 博客园 设计模式在JavaScript中的应用(2) -- Observer 微软ASP.NET AJAX中日期类型的JSON处理 JavaScript面向对象之方法重载 谁动了我的奶酪? 设计模式在JavaScript中的应用(1) 在JavaScript中使用面向对象 对于Asp.Net 2.0中脚本资源的研究(2) 对于Asp.Net 2.0中脚本资源的研究(1) js功能类库放送(二) 调整大小库 js功能类库放送(一) 拖动功能库
关于JavaScript的“+”运算和“-”运算和三目操作符“?:” - Truly ...
Truly · 2007-07-31 · via 博客园 - Truly

作者: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个表达式都将向数值转换,如果转换失败,则抛出运行时错误。

  • 对于含有“+”的运算,一旦“+”两边其中的一个是字符串,那么认为是字符串连接,所有参与运算的表达式都向字符串转换,最终是一个连接好的字符串。

总结完上面的一些特性,下面我们看它们在实际中的巧用:

var t = parseInt('08');

我们需要转换一个字符串为整型时,上面的代码从逻辑上是正确的,但是结果却是错误的,其中的原理可以参考JavaScript文档,也可参见鸟食轩的另一篇文章《这么小心还是在"08"向8的转换上栽了
这时我们可以使用“-”的特性,进行一次数值转换,代码如下:

var t2 = '08'-0;

这次我们得到了正确的值,同样的“+”也可以进行一些妙用,常用来自动进行数值到string的转换。

最后要提醒大家的是使用上面的规律时要注意表达式中运算的优先级,例如:

alert(1+2+'');
alert(
1+''+2);

得到不同的结果"3"和"12"。

这里同时补充一个三目操作的运算表达式。与C#的三目运算相似,使用三目操作可以简化我们的代码,下面我们看下面两行代码:

<script type="text/javascript">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代码的时候可以避免这样的低级错误。