三元运算符遇上了条件链,此时代码如何进行美化?

最近一直忙着升级美化代码,其中就遇到许多程序开发中不经常写的方式。

例如:三元预算法包含了条件链的方式。

function u() {
  return con1 ? value1
        : con2 ? value2
        : con3 ? value3
        : value4;
}

对于上面的代码采用什么样的美化方式比较合理那?视乎用下面的代码进行美化比较合理。三元运算符是右结合的,最好采用if…. else if…. else…这种方式进行优化。不过这个时候有几个点要处理:

  1. 原来是表达式,现在要更改为语句。牵扯到语法结构的调整
  2. return 是要返回结果的,也就意味着要拿到条件表达式内部。牵扯条件语句block statement中需要包含return statement
  3. 如何判定三元运算符中包含条件链?又如何判定条件表达式是完整的。
function u() {
  if (con1) {
    return value1;
  } else if (con2) {
    return value2;
  } else if (con3) {
    return value3;
  } else {
    return value4;
  }
}

我们稍微变一下:如果原始预算是赋值语句,如下面的代码。

function u() {
  let a = con1 ? value1
        : con2 ? value2
        : con3 ? value3
        : value4;
  return a;
}

这个时候问题又来了,转换条件代码的时候,block statement就不能有 return statement ,而是assignment expression. 条件语句中,可以添加或者不添加block statement,使用哪种更合适?是否给用户选择的权利,还是全部默认。

这个时候不免又出现了新的问题:

  1. 如何知道所有三元条件表达式的场景,有没有办法可以遍历出所有的代码样本?
  2. 代码转化的时候,有没有办法做到通用?使用回调模式?
  3. 三元条件表达式如果没有条件链是否进行优化?哪些场景又需要优化?

从上面的思考历程来看,越写越复杂,思考的越来越多,javascript代码美化升级的进展一再推迟。这周终于还是下定决定,开发完一个功能就上线一个功能。先上线再说。

还有几种代码优化比较繁琐:

let j = {
    get: (t, e) => P.has(t) && P.get(t).get(e) || null
;

object expression 中包含了 property,其中property 的值为箭头运算符, 箭头运算符的内容为逻辑运算表达式。 对于这种代码如果优化的话,代码是不是下面这样子:

let j = {
    get(t, e){
        if(P.has(t)){
            return P.get(t).get(e)
        }else{
            return null
        }
    }
};

其中源代码是这样的:

 get(element, key) {
        if (elementMap.has(element)) {
          return elementMap.get(element).get(key) || null;
        }
        return null;
      },

通过对比我们就可以发现,上面的优化代码是存在问题的,P.has(t)为真的时候,这个时候返回的是P.get(t).get(e)的结果,并且当P.get(t).get(e)为假的时候,也不会返回null. 可见美化代码存在了瑕疵我们用一个列子校验下:

let d = {
    get: (e) => 0
};

let e = "e";

console.info(m = 1 && d.get(e) || null);

let n = function () {
    if (m = 1) {
        return d.get(e)
    } else {
        return null
    }
};
console.info(n());
//输出结果是 null \n 0

P.has(t) && P.get(t).get(e) || null 这个逻辑表达式的美化应该是什么样子的那?

end
  • 作者:kali(作者介绍)
  • 更新时间:2022-07-20 18:09
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:转载站点文章,请附上原文链接
  • 翻译声明:翻译文章会不严谨,请务必附上原文链接
  • 扫描阅读:扫描二维码,手机阅读该文章