论坛首页 Web前端技术论坛

简洁的js

浏览 2451 次
锁定老帖子 主题:简洁的js
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-11-22   最后修改:2008-11-20

假如有这样一个函数,要求
输入'column1',返回'left';
输入'column2',返回'middle';
输入'column3',返回'right';
可以这样:
function getString(str) {
  switch(str) {
      case 'column1':
        return 'left';
      case 'column2':
        return 'middle';
      case 'column3':
        return 'right';
  }
}

也可以这样
function getString(str) {
    return {column1:'left', column2:'middle', column3:'right'}[str];
}

扩展开来,当输入中有两个参数时可用二维数组实现,
当过度使用时,代码的可读性降低。
对于json的写法,就是简洁的写法时,也可以给属性就是column1等加上引号。

xieye
20071122

 

 

 

 

 

   发表时间:2007-11-22  
扩展一下可以这么写: [code]function callfun(key){ ({ a:function(){ alert("a"); }, b:function(){ alert("b"); } }[key])(); } callfun("a");[/code] 不过效率低下
0 请登录后投票
   发表时间:2007-11-22  
我做了测试:
java 代码
  1. function callfun(key){
  2. ({
  3. 'select':function(){
  4. },
  5. 'input':function(){
  6. },
  7. 'calender':function(){
  8. },
  9. 'button':function(){
  10. },
  11. 'text':function(){
  12. }
  13. }[key])();
  14. }
  15. function callfunTr(key){
  16. if(key=='select'){
  17. }else if(key=='input'){
  18. }else if(key=='calender'){
  19. }else if(key=='button'){
  20. }else if(key=='text'){
  21. }else{
  22. }
  23. }
  24. var bdate = new Date();
  25. for(var i = 0; i < 100000; i++){
  26. callfun(getkey(i));
  27. }
  28. var edate = new Date();
  29. alert((edate.getTime() - bdate.getTime())/1000);
  30. bdate = new Date();
  31. for(var i = 0; i < 100000; i++){
  32. callfunTr(getkey(i));
  33. }
  34. edate = new Date();
  35. alert((edate.getTime() - bdate.getTime())/1000);
  36. function getkey(i){
  37. return ['select','input','calender','button','text'][i%5];
  38. }
两个速度差了十倍,建议如果要频繁调用不要使用JSON这种方式
0 请登录后投票
   发表时间:2007-11-22  
function callfun(key) { ({ a: function() { alert("a"); }, b: function() { alert("b"); } }[key])(); } callfun("b"); 替楼上格式化, 这样,无论哪个函数被调用到,所有的函数都要被解析一下。 为什么我总是看自己的代码很满意,对别人的代码挑剔?本性。
0 请登录后投票
   发表时间:2007-11-22  
我又试验了这种写法:
java 代码
  1. function callfun(key){
  2. ({
  3. 'select':donoting,
  4. 'input':donoting,
  5. 'calender':donoting,
  6. 'button':donoting,
  7. 'text':donoting
  8. }[key])();
  9. }
  10. function callfunTr(key){
  11. if(key=='select'){
  12. donoting();
  13. }else if(key=='input'){
  14. donoting();
  15. }else if(key=='calender'){
  16. donoting();
  17. }else if(key=='button'){
  18. donoting();
  19. }else if(key=='text'){
  20. donoting();
  21. }else{
  22. donoting();
  23. }
  24. }
  25. function getkey(i){
  26. return ['select','input','calender','button','text'][i%5];
  27. }
  28. function donoting(){
  29. loop++;
  30. }
  31. var loop = 0;
  32. var bdate = new Date();
  33. for(var i = 0; i < 100000; i++){
  34. callfun(getkey(i));
  35. }
  36. var edate = new Date();
  37. alert((edate.getTime() - bdate.getTime())/1000);
  38. // 传统的方法
  39. loop = 0;
  40. bdate = new Date();
  41. for(var i = 0; i < 100000; i++){
  42. callfunTr(getkey(i));
  43. }
  44. edate = new Date();
  45. alert((edate.getTime() - bdate.getTime())/1000);
这样省略了创建匿名函数,效率提高不少(匿名函数:29s, 内建函数:8.9s),但仍然比if else 低得多(3s左右)
0 请登录后投票
   发表时间:2007-11-22  
搂主不是挑剔你的代码,的确挺简洁的,也很巧妙,可是效率太低,如果不说出来,导致别人代码效率低下怎么办?的确不太适合频繁调用的情况
0 请登录后投票
   发表时间:2007-11-22  
那就不要在对象里定义函数好了。 只使用在小数据,小对象的情况下,并且里面都是常量。 限制这种技巧的使用范围。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics