js代码如下
function xxx()
{
    var celltype = gettype(col, row);    if ((celltype == "自动编号" || celltype == "链接" || celltype == "附件" || celltype == "单选框" || celltype == "下拉框" || celltype == "检查框") && CellControl.cell.style.display == "none")
        return;
.....如果是c语言,我会将与两边的条件表达式反过来写:
if (CellControl.cell.style.display == "none" && ((celltype == "自动编号" || celltype == "链接" || celltype == "附件" || celltype == "单选框" || celltype == "下拉框" || celltype == "检查框"))因为c的if判断是从左到右来做的,如果中间是“与”左测的失败,右侧的根本不会被执行。不知js中是不是也是这样?另外如果这样写,js引擎执行时是否会做优化?即:将gettype(col, row)求出来的值缓存起来,只执行1次而不是3次
if(gettype(col, row)== "自动编号")
{...}
else if (gettype(col, row)== "链接")
{...}
else if (gettype(col, row)== "附件")
{...}对js引擎不太熟悉,不知道有哪本书专门介绍js语言执行细节的,故在此发帖提问,请大家指点,先谢过

解决方案 »

  1.   

    var celltype = gettype(col, row);
    声明一个变量存储函数的返回值是正确的,这样可以避免每次判断的时候都会重复执行gettype(col, row);if (CellControl.cell.style.display == "none" && ((celltype == "自动编号" || celltype == "链接" || celltype == "附件" || celltype == "单选框" || celltype == "下拉框" || celltype == "检查框"))JS里面的判断也是从左到右,所以这样写更好。
      

  2.   

    if (CellControl.cell.style.display == "none" && /^(?:自动编号|链接|附件|单选框|下拉框|检查框)$/.test(celltype))
      

  3.   

    不好意思,刚有点想当然了,忘了有运算优先级的问题,电脑不是人,所以它不会生出你那样的逻辑,它只会老老实实的按事先规定的运算法则求得最后的结果!按照JS的运算优先级:. > () > == > && > ||所以顺序如下:首先是这个  CellControl.cell.style.display 假设得到的值是 "block" 条件式变成: "block" == "none" && (celltype == "自动编号" || celltype == "链接" || celltype == "附件" || celltype == "单选框" || celltype == "下拉框" || celltype == "检查框")然后是这个括号,所以要先计算括号内的表达式
    (celltype == "自动编号" || celltype == "链接" || celltype == "附件" || celltype == "单选框" || celltype == "下拉框" || celltype == "检查框")
    所以 接下来就是几个 == 的运算条件式变成:"block" == "none" && (true || false || false || false || false || false)然后就是 || 的运算条件式变成:"block" == "none" && (true)所以运算完括号后条件式变成:"block" == "none" && true这时候就是运算 == 了,优先级高条件式变成:false && true最后运算 && 条件式变成:false
    所以写左写右没有区别,运算法则在那里摆着如果有同志有不同意见的,欢迎拍砖“千万不要想当然”  这句话与大家共勉之!
      

  4.   

    [code=JScript]<script>
    var i=0;
    function logic(){
    i+=1;
    return true;
    }
    if(true || logic())alert(i);
    i=0
    if(false || logic())alert(i);
    </script>code]
    应该也是从左到右运算吧
      

  5.   

    <script>
    var i=0;
    function logic(){
    i+=1;
    return true;
    }
    if(true || logic())alert(i);
    i=0
    if(false || logic())alert(i);
    i=0
    if(true && logic()){;}alert(i)
    i=0
    if(false && logic()){;}alert(i)
    </script>
      

  6.   

    #4楼回复的有点不明白.#5楼的if(true || (logic()))alert(i);结果会是0而不是1啊.
      

  7.   

    对啊,ture了,后边不运算了,就是0,怎么会是1呢。
      

  8.   

    刚才试了一下,在if中左表达式满足后面的就都不算了<script>
    function f1(){
    alert("f1");
    return false;
    }function f2(){
    alert("f2");
    return false;
    }function f3(){
    alert("f3");
    return true;
    }function f4(){
    alert("f4");
    return false;
    }function main(){
    //if (f1() && (f2()|| f3() || f4())) // f1 false
    if ( (f2()|| f3() || f4()) &&f1() ) // f2,f3,f1,false
    alert(true);
    else
    alert(false);
    }
      

  9.   

    if(' 自动编号 链接 附件 单选框 下拉框 检查框 '.indexOf(' ' + gettype(col, row) + ' ') > -1 && CellControl.cell.style.display == "none"){
       ....
    }我也想当然一下:
    1. dom访问没有内存变量访问快,所以style放后边
    2. 创建多个字符串常量不如创建一个快
    3. 变成一个字符串有利于精简代码可能的问题: 
    1. indexOf 未必有多个==快
    2. 字符串加法也慢