如题:html
假设对成长速度显示规定以下:jquery
成长速度为5显示1个箭头;
成长速度为10显示2个箭头;
成长速度为12显示3个箭头;
成长速度为15显示4个箭头;
其余都显示都显示0各箭头。
网络
用代码怎么实现?app
差一点的用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;
}
若是需求改为:spa
成长速度为>12显示4个箭头;
成长速度为>10显示3个箭头; code
那么用switch也很麻烦。orm
有没有想过能用一行代码实现呢?htm
然咱们来看看JS强大的表现力吧:
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;
几乎全部语言中||和&&都遵循“短路”原理,如&&中第一个表达式为假就不会去处理第二个表达式,而||正好相反。
js也遵循上述原则。可是比较有意思的是它们返回的值:
var attr = true && 4 && “aaa”;
那么运行的结果attr就不是简单的true或这false,而是”aaa” 。
再来看看||:
var attr = attr || “”;
这个运算常常用来判断一个变量是否已定义,若是没有定义就给他一个初始值,这在给函数的参数定义一个默认值的时候比较有用。
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源代码中还有不少如此精妙的代码,你们能够去学习学习。