这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要介绍了总结 JavaScript 中布尔操作符 || 与 && 的使用技巧, 是 JS 入门学习中的基础知识, 需要的朋友可以参考下
你是否看到过这样的代码:a=a||""; 可能 javascript 初学者会对此感到茫然。今天就跟大家分享一下我的一些心得。 其实:
- a=a||"defaultValue";
- a=a||"defaultValue";
与:
- if(!a){
- a="defaultValue";
- }
- if(!a){
- a="defaultValue";
- }
和:
- if(a==null||a==""||a==undefined){
- a="defaultValue";
- }
- if(a==null||a==""||a==undefined){
- a="defaultValue";
- }
是等价的! 为了弄清这个问题,首先我们必须了解一个问题:javascript 中数据类型在转换为 bool 类型时发生了什么。 在 javascript 中,数据类型可以分为 "真值" 和 "假值"。顾名思义,真值转换为 bool 时值为 true;假值转换为 bool 时值为 false。下表罗列了一些常见的数据类型转换为 bool 时的值: 在 if 表达式中,javascript 首先将条件表达式转换为 bool 类型,表达式为真值则执行 if 中的逻辑,否则跳过。 于是有了:
- if(!a){
- a="defaultValue";
- }
- if(!a){
- a="defaultValue";
- }
下面我们再来看 "&&"、"||" 两个表达式。 由于 javascript 是弱类型语言,所以在 javascript 中这两个表达式可能跟其他语言(比如 java)中不太一样。 在 javascript 中,"&&" 运算符运算法则如下: 如果 && 左侧表达式的值为真值,则返回右侧表达式的值;否则返回左侧表达式的值。 这就是说:
- var i=""&&"真值";//->i=""
- i="真值"&&"其他真值";//->i="其他真值"
- i="真值"&&"";//->i=""
- var i=""&&"真值";//->i=""
- i="真值"&&"其他真值";//->i="其他真值"
- i="真值"&&"";//->i=""
"||" 运算符的运算法则如下: 如果 || 左侧表达式的值为真值,则返回左侧表达式的值;否则返回右侧表达式的值。 这就是说:
- var i=""||"真值";//->i="真值"
- i="真值"||"其他真值";//->i="真值"
- i="真值"||"";//->i="真值"
- var i=""||"真值";//->i="真值"
- i="真值"||"其他真值";//->i="真值"
- i="真值"||"";//->i="真值"
于是,就可以理解:
- a=a||"defaultValue";
- a=a||"defaultValue";
的逻辑了。如果 a 为假值(等于 null、空字符串……),则将 "defaultValue" 赋给 a;否则将 a 的值赋给 a 本身。 下面我们运用 ||、&& 来简化程序:
- var parameter = "";
- function test(parameter) {
- //return 真值
- return true;
- }
- //真值操作
- function operate1(parameter) {
- return "真值操作";
- }
- //假值操作
- function operate2(parameter) {
- return "假值操作";
- }
- var result = test(parameter) && operate1(parameter);
- result = test(parameter) || operate2(parameter);
- //等价于
- result = test(parameter) ? operate1(parameter) : operate2(parameter);
- alert(result); //真值操作
- //也等价于
- if (test(parameter)) {
- result = operate1(parameter);
- } else {
- result = operate2(parameter);
- }
- alert(result) //真值操作
再比如:
- <script language="javascript" type="text/javascript">
- var a =1;
- var b = 0;
- var c = 3;
- var d = a && b && c;
- window.alert(d);
- </script>
输出了 d 的值为 0,如果把 d 的值改为不等于 0 的值,那么 d 将始终是 3
所以 js 中的 && 返回的是第一个不为真的值即是 0(对象亦可),如果全部都是真那么返回的最后一个值。
- <script language="javascript" type="text/javascript">
- var a =0;
- var b = 3;
- var c = 5;
- var d = a || b || c;
- window.alert(d);
- </script>
输出了 d 的值为 3,如果把 b 的值改为 0,那么 d 将始终是 5. 如果全部都改为 0,那么 d 的值是 0.
所以 js 中的 || 返回的是第一个不为 false 的值即是 0(对象亦可),如果全部都是 false 那么返回的最后一个值。
应用:比如要简单的验证邮箱格式,只有'@''和'.''都同时存在是才算格式正确,否则提示错误:
该用哪个呢?让我们分析一下:
- if (form1.elements[3].value.indexOf("@", 0) == -1 && form1.elements[3].value.indexOf(".", 0) == -1) {
- alert("EMAIL地址输入错误!")
- }
如果都存在:&& 两边都是假。&& 返回第一个为真的值,所以 if 判断条件是假 if 后面的语句不执行!不会提示用户。
只有至少 @和。存在一个的是时候 if 的条件才为真,才提示用户错误。
两个都存在的时候,返回最后一个的值,是真 if 判断条件成立 if 语句执行。提示用户错误。
所以用 && 明显错误!
要换成
- if (form1.elements[3].value.indexOf("@", 0) == -1 || form1.elements[3].value.indexOf(".", 0) == -1) {
- alert("EMAIL地址输入错误!")
- }
分析:
如果两个都存在:全部为 false,返回是 false 所以 if 条件不成立,语句不执行,不提示错误!
如果只有一个存在:返回第一个不为 false 的值。返回为 true 提示错误!
两个都不存在:返回第一个不为 false 的值,返回是 true 提示错误!
所以应该用 ||
来源: http://www.phperz.com/article/17/0410/268674.html