2007-11-22
简洁的js
假如有这样一个函数,要求
输入'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
评论
xieye
2007-11-22
那就不要在对象里定义函数好了。
只使用在小数据,小对象的情况下,并且里面都是常量。
限制这种技巧的使用范围。
cai555
2007-11-22
搂主不是挑剔你的代码,的确挺简洁的,也很巧妙,可是效率太低,如果不说出来,导致别人代码效率低下怎么办?的确不太适合频繁调用的情况
cai555
2007-11-22
我又试验了这种写法:
这样省略了创建匿名函数,效率提高不少(匿名函数:29s, 内建函数:8.9s),但仍然比if else 低得多(3s左右)
java 代码
- function callfun(key){
- ({
- 'select':donoting,
- 'input':donoting,
- 'calender':donoting,
- 'button':donoting,
- 'text':donoting
- }[key])();
- }
- function callfunTr(key){
- if(key=='select'){
- donoting();
- }else if(key=='input'){
- donoting();
- }else if(key=='calender'){
- donoting();
- }else if(key=='button'){
- donoting();
- }else if(key=='text'){
- donoting();
- }else{
- donoting();
- }
- }
- function getkey(i){
- return ['select','input','calender','button','text'][i%5];
- }
- function donoting(){
- loop++;
- }
- var loop = 0;
- var bdate = new Date();
- for(var i = 0; i < 100000; i++){
- callfun(getkey(i));
- }
- var edate = new Date();
- alert((edate.getTime() - bdate.getTime())/1000);
- // 传统的方法
- loop = 0;
- bdate = new Date();
- for(var i = 0; i < 100000; i++){
- callfunTr(getkey(i));
- }
- edate = new Date();
- alert((edate.getTime() - bdate.getTime())/1000);
xieye
2007-11-22
function callfun(key)
{
({
a: function()
{
alert("a");
},
b: function()
{
alert("b");
}
}[key])();
}
callfun("b");
替楼上格式化,
这样,无论哪个函数被调用到,所有的函数都要被解析一下。
为什么我总是看自己的代码很满意,对别人的代码挑剔?本性。
cai555
2007-11-22
我做了测试:
两个速度差了十倍,建议如果要频繁调用不要使用JSON这种方式
java 代码
- function callfun(key){
- ({
- 'select':function(){
- },
- 'input':function(){
- },
- 'calender':function(){
- },
- 'button':function(){
- },
- 'text':function(){
- }
- }[key])();
- }
- function callfunTr(key){
- if(key=='select'){
- }else if(key=='input'){
- }else if(key=='calender'){
- }else if(key=='button'){
- }else if(key=='text'){
- }else{
- }
- }
- var bdate = new Date();
- for(var i = 0; i < 100000; i++){
- callfun(getkey(i));
- }
- var edate = new Date();
- alert((edate.getTime() - bdate.getTime())/1000);
- bdate = new Date();
- for(var i = 0; i < 100000; i++){
- callfunTr(getkey(i));
- }
- edate = new Date();
- alert((edate.getTime() - bdate.getTime())/1000);
- function getkey(i){
- return ['select','input','calender','button','text'][i%5];
- }
cai555
2007-11-22
扩展一下可以这么写:
[code]function callfun(key){
({
a:function(){
alert("a");
},
b:function(){
alert("b");
}
}[key])();
}
callfun("a");[/code]
不过效率低下
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则







评论排行榜