这两天看到别人写的代码,感觉很牛逼,如下,大神请忽视

$(".lgn").on("click", function() {
var a = {};
a.loginType = $(this).data("logintype");
a.loginType == wx_utils.LOGIN_TYPE.WX ? (a.username = $("#username").val(), a.password = $("#password").val()) : a.loginType == wx_utils.LOGIN_TYPE.ECARD && (a.username = f || $("#username_").val(), a.password = $("#password_").val(), a.customerCode = d || $("#customerCode").val(), a.outid = $("#outid").val());
a.scopes = [];
$("input[name='scope_box']:checked").each(function(b, c) {
a.scopes.push(c.value)
});
wx_utils.login(a, !1, function(a) {
a && 202102 == a.errorCode ? ($(".modal-overlay").addClass("modal-overlay-visible"), $("#bind_ecard_div").show()) : wx_utils.toast(a)
})
});

大概就是这样,主要用逻辑符合三目运算符来写判断

首先说三目运算符,

语法

conditions ? statementA : statementB ;

上述语句,首先判断条件condition,若结果为真则执行语句statementA,否则执行语句statementB。
值得注意的是,由于 JavaScript 脚本解释器将分号“ ; ”作为语句的结束符,statementA 和 statementB 语句均必须为单个语句,使用多个语句会报错。

一般我们用的时候是这样的,如果statementA或statementB里面有分号或者逗号,都会报错

var c = 1;
c==1 ? console.log(c),console.log('1') : console.log('c不等于1');

结果为Uncaught SyntaxError: Unexpected token ,报错了。

那么如何输出更多语句或者执行一条以上的操作呢?

把statementA用小括号包起来即可,里面可以以逗号为分割符,执行多个语句

var a = 5;
function abc() {
console.log('我是方法abc')
}
function err() {
console.log('我是方法err')
} a==2 ? (abc()):err();
a==5 ? (abc(),abc()):err();

结果如下

我是方法err

我是方法abc

我是方法abc

statementA 或 statementB 里面可以也可以放函数哦。

要注意的是,三目运算符和if else到底有什么区别呢?

对于n++;

var  n = 0;
if(n >= 10){
n =0;
}else{
n ++;
}
console.log(n);
n = 1;
var m = 0;
m = m >= 10 ? m=0 : m++;
console.log(m);
m = 0;

对于++n;

var  n = 0;
if(n >= 10){
n =0;
}else{
++n;
}
console.log(n);
n = 1;
var m = 0;
m = m >= 10 ? m=0 : ++m;
console.log(m);
m = 1;

n++和++n在此验证中,没有任何区别,因为if else都是计算结果之后的,不会返回n,没有任何返回值
 
但是对于三目运算,n++返回的n值为n本身,++n返回的n值为n+1之后的结果

再说逻辑运算符

a() && b() :如果执行a()后返回true,则执行b()并返回b的值;如果执行a()后返回false,则整个表达式返回a()的值,b()不执行;
a() || b() :如果执行a()后返回true,则整个表达式返回a()的值,b()不执行;如果执行a()后返回false,则执行b()并返回b()的值;
&& 优先级高于 ||

1、只要“||”前面为false,不管“||”后面是true还是false,都返回“||”后面的值。

2、只要“||”前面为true,不管“||”后面是true还是false,都返回“||”前面的值。

3、只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值;

4、只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值;

所以,我们可以用&&来代替if else进行判断,比如我们判断某些对象是否存在或者某些变量是否等于某个值时,就可以写做 a && a=5; a.length > 0 && $('.login').show()此类。

举个例子

如图: 
假设对成长速度显示规定如下: 
  成长速度为5显示1个箭头; 
  成长速度为10显示2个箭头; 
  成长速度为12显示3个箭头; 
  成长速度为15显示4个箭头; 
  其他都显示都显示0个箭头。

各种方法一览

//if else 实现
var add_level = 0;
if(add_step == 5){
add_level = 1;
}else if(add_step == 10){
add_level = 2;
}else if(add_step == 12){
add_level = 3;
}else if(add_step == 15){
add_level = 4;
}else {
add_level = 0;
}
//也可以用switch实现
var add_level = 0;
switch(add_step){
case 5 :
add_level = 1;
break;
case 10 :
add_level = 2;
break;
case 12 :
add_level = 3;
break;
case 15 :
add_level = 4;
break;
default :
add_level = 0;
break;
}

如果需求改成: 
成长速度为>12显示4个箭头; 
成长速度为>10显示3个箭头; 
成长速度为>5显示2个箭头; 
成长速度为>0显示1个箭头; 
成长速度为<=0显示0个箭头。

那么用switch实现起来也很麻烦了。

那么你有没有想过用一行就代码实现呢?

用逻辑运算符实现这2道题

第一题

//&& ||实现
var add_level = (add_step==5 && 1) || (add_step==10 && 2) || (add_step==12 && 3) || (add_step==15 && 4) || 0;
//更优雅的方式
var add_level={'5':1,'10':2,'12':3,'15':4}[add_step] || 0;
//此方法还看不太懂,希望前辈看到给我分析下。

第二题

var add_level = (add_step>12 && 4) || (add_step>10 && 3) || (add_step>5 && 2) || (add_step>0 && 1) || 0; 

首先我们来梳理一下一个概念,请你一定要记住:在js逻辑运算中,0、""、null、false、undefined、NaN都会判为false,其他都为true(好像没有遗漏了吧,请各位确认下)。这个一定要记住,不然应用||和&&就会出现问题。 
这里顺便提下:经常有人问我,看到很多代码if(!!attr),为什么不直接写if(attr); 
其实这是一种更严谨的写法: 
下面测试了 typeof 5和typeof !!5的区别。!!的作用是把一个其他类型的变量转成的bool类型。

typeof 5
"number"
typeof !!5
"boolean"

下面主要讨论下逻辑运算符&&和||。 
几乎所有语言中||和&&都遵循“短路”原理,如&&中第一个表达式为假就不会去处理第二个表达式,而||正好相反。 
js也遵循上述原则。但是比较有意思的是它们返回的值。

下面是在AngularJS中根据角色加载子模板的例子

<div ng-include="user.admin&&'edit.admin.html'||'edit.user.html'">
</div>

如果user.admin为true,则会去跑第二个表达式edit.admin.html,并且返回值为第二个表达式,edit.admin.html

如果user.admin为false,则user.admin&&'edit.admin.html'表达式为false,回去跑||后面的第三个表达式,第三个表达式为true,结果为第三个表达式的值。

再看简单点的

var attr = true && 4 && “aaa”;
结果是attr = aaa

再来看看||:

var attr = attr || “”;

这个运算经常用来判断一个变量是否已定义,如果没有定义就给他一个初始值,这在给函数的参数定义一个默认值的时候比较有用。再次提醒你记住上面的原则:如果实参需要是0、""、null、false、undefined、NaN的时候也会当false来处理。

if(a >=5){
alert("你好");
}
//可以改写成
a >= 5 && alert("你好");

这样只需一行代码就搞定。但是需要注意的一点:js中||和&&的特性帮我们精简了代码的同时,也带来了代码可读性的降低。这就需要我们自己来权衡了。 
一方面精简js代码,能实质性的减少网络流量,尤其是大量应用的js公用库。个人比较推荐的做法是:如果是相对复杂的应用,请适当地写一些注释。这个和正在表达式一样,能够精简代码,但是可读性会降低,对读代码的人要求会高些,最好的办法就是写注释。

我们可以不使用这些技巧,但是我们一定要能看懂,因为这些技巧已经广泛应用,尤其是像JQuery等js框里的代码,不理解这些你就很难看懂别人的代码。

var Yahoo = Yahoo || {};

这种是非常广泛应用的。 
ok,最后让我们来看一段jQuery中的代码吧:

var wrap =
// option or optgroup
!tags.indexOf("<opt") &&
[ 1, "<select multiple='multiple'>", "</select>" ] || !tags.indexOf("<leg") &&
[ 1, "<fieldset>", "</fieldset>" ] || tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
[ 1, "<table>", "</table>" ] || !tags.indexOf("<tr") &&
[ 2, "<table><tbody>", "</tbody></table>" ] || // <thead> matched above
(!tags.indexOf("<td") || !tags.indexOf("<th")) &&
[ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] || !tags.indexOf("<col") &&
[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] || // IE can't serialize <link> and <script> tags normally
!jQuery.support.htmlSerialize &&
[ 1, "div<div>", "</div>" ] || [ 0, "", "" ]; // Go to html and back, then peel off extra wrappers
div.innerHTML = wrap[1] + elem + wrap[2]; // Move to the right depth
while ( wrap[0]-- )
div = div.lastChild;

这段代码是作者用来处理 $(html) 时,有些标签必须要约束的,如<option>必须在<select></select>之内的。 
可能你也发现了作者还有一个很巧的地方就是 !tags.indexOf("<opt") ,作者很巧很简单的就实现了startWith的功能了,没有一点多余的代码。jquery源代码中还有很多如此精妙的代码,大家可以去学习学习。

后半部内容转载自http://www.cnblogs.com/ppforever/p/4375996.html

最新文章

  1. 一键部署mono 免费空间支持ASP.NET MVC 再也不担心伙食费换空间了
  2. 3MyBatis配置--深入浅出MyBatis技术原理与实践(笔记)
  3. oracle数据类型
  4. 计算机网络自学之路------IP协议(2)
  5. Bomb
  6. PHP中float变量转换为int时,结果有误的问题!
  7. 第十一篇 SQL Server代理维护计划
  8. Newtonsoft.Json同时对多个时间字段以不同的格式序列化
  9. Could not locate executable null 解决办法
  10. 关于Java中重载的若干问题
  11. leetCode 26.Remove Duplicates from Sorted Array(删除数组反复点) 解题思路和方法
  12. 分布式session
  13. Arcglobe三维信息系统开发常见问题
  14. 使用 Python Mock 类进行单元测试
  15. Paxos算法简单介绍
  16. liunx 定时执行 php文件
  17. UTF-8是现在流行的编码方式,根据规定回答问题
  18. day12 函数对象,名称空间与作用域
  19. Redis数据库概述
  20. Spring boot整合ElasticSearch案例分享+bboss

热门文章

  1. 玩转docker镜像和镜像构建
  2. NodeJs+Express实现简单的Web增删改查
  3. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第五章:排序、分页和路由
  4. angularjs过滤器(一)------禁止转载------
  5. USACO 3.4 Electric Fence
  6. php_Symfony_项目实战全过程记录
  7. 数据结构之Binary Search Tree (Java)
  8. 《我与Android不得不说的故事-1-立贴明志》
  9. CentOS 6.5安装之后的网络配置
  10. js-时间函数相互转化