[关闭]
@hotjp 2017-01-25T14:40:50.000000Z 字数 2036 阅读 1174

Javascript书写技巧

培训


True OR False

以下常见表达式都返回false:

  • nul
  • undefined
  • '' 空字符串
  • 0 数字0

以下常见表达式都返回true:

  • '0' 字符串
  • [] 空数组
  • {} 空对象

可能会有某些判断:

  1. while(x != null){}

在你不希望x是0、空字符串和false的情况下可以改写:

  1. while(x){}

想要检查字符串是否为null或空:

  1. if(y != null && y != ''){}

可以直接改写

  1. if(y){}

另外还有一些不直观的布尔表达式:

0

  • Boolean('0') == true
  • '0' != true
  • 0 != null
  • 0 == []
  • 0 == false

null

  • Boolean(null) == false
  • null != true
  • null != false

undefined

  • Boolean(undefined) == false
  • undefined != true
  • undefined != false

[]

  • [] != true
  • [] == false //空数组等于false

{}

  • Boolean({}) == true
  • {} != true
  • {} != false

条件(三元)操作符 ? :

下面这段代码可以被三元操作符替换

  1. //常见的if判断
  2. if(val != 0){
  3. return foo();
  4. }else{
  5. return bar();
  6. }
  7. //可以写成
  8. return val ? foo() : bar();

生成html的时候是很有用的

  1. //checkbox
  2. var isChecked = false, isEnabled = true;
  3. var ipt = '<input type="checkbox" '+
  4. (isChecked ? 'checked' : '') +
  5. (isEnabled ? '' : 'disabled') +
  6. ' name="foo" >';
  7. //活动状态
  8. var isActive = true;
  9. var status = '<span class="status'+
  10. (isActive ? ' active' : '') +
  11. '">'+
  12. (isActive ? '活动进行中' : '活动已结束') +
  13. '</span>'

&&|| (二元布尔操作符)

这对二元布尔操作符可以根据前面的代码判断后面的代码是否执行,也就是说只有在必要的时候才会执行后面的代码,|| 可以被成为默认操作符,因为它可以替代下面的情况:

  1. //参数判断
  2. function foo(opt_win){
  3. var win;
  4. if(opt_win){
  5. win = opt_win;
  6. }else{
  7. win = window;
  8. }
  9. //...
  10. };
  11. //可以转换为
  12. function foo(opt_win){
  13. var win = opt_win || window;
  14. //...
  15. };
  16. //jQuery操作classname
  17. $("a").on("click", function(){
  18. //常见写法
  19. if($(this).hasClass("on")){
  20. $(this).removeClass("on");
  21. }
  22. //使用||操作符,前项为false时执行后项,可以使用
  23. $(this).hacClass("on") || $(this).addClass("on");
  24. });
是不是瞬间就觉得自己是老司机了?

&& 也可以用来缩减代码量

  1. if(node){
  2. if(node.kids){
  3. if(node.kids[index]){
  4. foo(node.kids[index]);
  5. }
  6. }
  7. }
  8. //可以写成这样
  9. if(node && node.kids && node.kids[index]){
  10. foo(node.kids[index]);
  11. }
  12. //当然也可以这样
  13. var kid = node && node.kids && node.kids[index];
  14. if(kid){
  15. foo(kid);
  16. }
  17. //是不是有人想到了||的写法?(jslint禁止写法)
  18. node && node.kids && node.kids[index] && foo(node.kids[index]);
  19. //使用&&操作符,前项为true时执行后项,不推荐使用(jslint禁止写法)
  20. $(this).hacClass("on") && $(this).removeClass("on");

join() 构建字符串

通常构建字符串的方式是这样的:

  1. function listHtml(items){
  2. var html = '<div class="foo">';
  3. for(var i = 0; i < items.length; i++){
  4. html += itemHtml(items[i]);
  5. }
  6. html += '</div>';
  7. return html;
  8. };

以上代码在IE中效率很低,better than better的写法是:

  1. function listHtml(items){
  2. var html = [];
  3. for(var i = 0; i < items.length; i++){
  4. //html.push(itemHtml(items[i])); 速度稍微慢一点
  5. html[i] = itemHtml(items[i]);
  6. }
  7. return '<div class="foo">' + html.join("") + '</div>';
  8. };
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注