javascript里的条件判断


Posted in Javascript onFebruary 27, 2007

JavaScript 是一种可以在浏览器中运行的脚本语言,是一种弱语言(相对于C,C#,JAVA而言),只要是计算机语言就会使用到条件判断式,而JavaScript作为一种“弱”语言,它的条件判断常常令人困惑不解,特别是有其它强语言编程经历的人来说,更是不可理喻!高手和无惑的人别取笑,我自己也曾经有一段时间郁闷过。先写一个例子吧:

var s = "meizz";
if (s && s==true)
{
    alert("Is true");
}

    咱先不管上面的代码运行的结果正确与否,我给变量 s 赋的是字符型,而在后面的 if 条件判断式里是直接把变量 s 作为一个判断表达式写出的,若是在强语言里对字符型的变量要么是判断它的类型是否是字符型或者是判断这个变量的值是否等于某字符串,但在 javascript 里就是没有用类型判断(typeof)也没有值判断(==)而就是这么孤伶伶地在那里,就可以作为一个条件判断表达式。当然这种单独作为条件表达式不只是字符型变量,也可以是数字型变量,也可以是一个对象,也可以是一个函数或者方法等等。这就正是这种语法令人费解的地方。

    我测试统计了一下:在 JavaScript 里,不为空 "" 的字符串、不为 0 的数字、不为 null 的对象、不为 undefined 的对象属性、布尔型 true,单独作为判断式里的一个表达式时 JavaScript 通通认定为真(true),反之则为假(false)。

    原因为是JS脚本没有强变量类型,你前一句赋值 var s = "meizz"; 后一句你甚至马上可以写成 s = function(){}; ,中间没有任何的类型转换,而这些写法在强语言里是不可思议的,甚至是大逆不道的(根本就不支持这种语法),但在JS脚本里却是那么的自然。原因就是没有强制变量类型, 变量类型是动态的,也就是说变量本身是没有类型的,变量的值是有类型的。呵呵,这里扯到其它模块去了,嗯,关于变量类型我另外再写文章讨论吧。

    说到这里,就不难理解 if (s && .....这句的判断式了,同样的道理,我甚至可以 function s(){} 然后再用 if (s && .... 或者 var s = document.getElementById("ObjectId");  if (s && .... 这样语法在JS脚本里都是没错的,至于判断的结果可以参考上面的那段统计结果。

    现在再来讨论上面的那几句代码的运行结果,多个条件判断式的结果合成运行只有“与”和“或”,到于“非”因为它是一元运行符,只针对单个值,比如 if (!s) ... 至于条件式不只一个的时候条件式的结果只有与和或的运行。与(&&),或(||)。上面的那句条件式:if (s && s==true) 就是两个条件式的合成判断。至于与运算(只要一个值为false则值为false)或运算(只要一个值为true则值为true)这些运算细节我就不多说了,教科书比我的笔头强多了。现在来分析这个判断式:这是一个“与”运算。第一个判断式 s ,因为它的字符型值不为 "" ,在JS当然认为它等同于 true,第二个判断式是 s==true,显然这个不相等,值为 false,因为是“与”运算,当然整个条件判断式的结果是 false,所以不会运行 alert()。

    第三,我这里说说几个很特殊的条件判断。在没有任何声明(var)和赋值的情况下,直接拿一个变量来判断JS会抛出一个变量未定义的错误出来。比如:

if (ss) alert("条件判断结果为 true!");

运行这句代码就会出错。因为这个变量 ss 从未被声明赋值过,这种情况不等同于上述的 null "" undefined。这种情况一般会发生在什么地方呢?一是自己写代码不小心未声明,二就是对网页里没有的控件进行操作直接用ID来操作的时候,比如 if (InputId.value!="") ... ,若是网页里根本就没有 id="InputId" 的文本框或者在执行这句脚本操作的时候这个文本框还没有被浏览器加载,那也就抛出变量未定义的错误。

    结果的办法是:第一种情况用 typeof 判断。if (typeof(ss)=="undefined") alert("变量未定义");  ,第二种情况则不要直接使用ID来引用对象而使用标准的对象引用。例:

var e = document.getElementById("InputId");  //IE里以前是用 document.all.InputId
if (e && e.value!="") ;//...... 

这样就不会出这种错误了。

那么就上面这句代码有人会说一定要这样写呢,为什么不直接 

if(document.getElementById("InputId").value != "") ;//....

这样的代码不是更精练吗?城然代码是精简了,但错误也来了。只要网页里没有这个对象或者这个对象在脚本执行的时候还未被加载到,就会报错。原来是 document.getElementById("InputId") 返回了 null 值,而 null 显然是没有 value 属性的,而我那句代码也用到了 e.value 来取属性但就没有报错,原因在于C系列的语言在多个条件式里的另一外属性:多个条件判断式组合判断时,先看第一个条件式,若已经符合条件时,就不会再去判断第二个判断式;也就是在第一个条件判断式未达到标准时再会去判断第二个判断式,依此类推直至最后。if (e && e.value!="") 是两个判断式的组合判断,这是一个“与”运算,只要一个判断式为 false 则整个值都为 false。第一个判断式 e 由于不存在或者未加载到返回了 null,而在JS里 null 就等同于 false ,这样不用后面的判断也可得到整个组合判断的结果是 false 了,所以系统就不会再去判断后面的那句 e.value 了。这点与B系列语言不同,尤其要注意。在B语言中 if e and e.value!="" then 这样的语句是先把所有的判断式都运算一遍后最后再做组合的“与”运算。所以这句代码在JS里是正确的,若放在VBS里就不一定正确了。

    好了,肚里的货不多,文笔又比较烂,就写这么多了,望大家多多指正!

Javascript 相关文章推荐
javascript DOM编程实例(智播客学习)
Nov 23 Javascript
15款优秀的jQuery导航菜单插件分享
Jul 19 Javascript
jQuery使用技巧简单汇总
Apr 18 Javascript
javascript计算用户打开网页的停留时间
Jan 09 Javascript
jquery+ajax实现注册实时验证实例详解
Dec 08 Javascript
浅谈jquery高级方法描述与应用
Oct 04 Javascript
原生JS改变透明度实现轮播效果
Mar 24 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
Mar 28 Javascript
AngularJS中filter的使用实例详解
Aug 25 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
Mar 15 Javascript
Vue中使用Sortable的示例代码
Apr 07 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
Jun 24 Javascript
javascript第一课
Feb 27 #Javascript
javascript编程起步(第三课)
Feb 27 #Javascript
javascript编程起步(第二课)
Feb 27 #Javascript
javascript编程起步(第五课)
Feb 27 #Javascript
javascript编程起步(第四课)
Feb 27 #Javascript
javascript编程起步(第六课)
Feb 27 #Javascript
javascript编程起步(第七课)
Feb 27 #Javascript
You might like
删除数组元素实用的PHP数组函数
2008/08/18 PHP
Discuz!X中SESSION机制实例详解
2015/09/23 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
PHP批量修改文件名称的方法分析
2017/02/27 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
jscript之List Excel Color Values
2007/06/13 Javascript
显示今天的日期js代码(阳历和农历)
2014/09/30 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
jquery UI Datepicker时间控件冲突问题解决
2016/12/16 Javascript
jQuery实现 RadioButton做必选校验功能
2017/06/15 jQuery
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
基于vue中对鼠标划过事件的处理方式详解
2018/08/22 Javascript
node中的cookie的具体使用
2018/09/13 Javascript
重学JS 系列:聊聊继承(推荐)
2019/04/11 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
python编程开发之textwrap文本样式处理技巧
2015/11/13 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
python实现验证码识别功能
2018/06/07 Python
python实现爬取图书封面
2018/07/05 Python
利用Python实现Shp格式向GeoJSON的转换方法
2019/07/09 Python
Flask-WTF表单的使用方法
2019/07/12 Python
python代码实现将列表中重复元素之间的内容全部滤除
2020/05/22 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
日语专业个人的求职信
2013/12/03 职场文书
关于廉洁的广播稿
2014/01/30 职场文书
大学生志愿者活动总结
2014/06/27 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
学校通报表扬范文
2015/05/04 职场文书
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL