V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
auroraccc
V2EX  ›  JavaScript

JS 写法的选择

  •  2
     
  •   auroraccc · 2018-12-20 12:27:52 +08:00 · 3135 次点击
    这是一个创建于 1946 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写法一:

    const foo = (data) => {
    	if(data.length < 3) data = [1,2,3]
    	return data.map(ele => ele + 1)
    }
    

    写法二:

    const bar = (data) => {
    	if(data.length < 3) return bar([1,2,3])
    	return data.map(ele => ele + 1)
    }
    

    这两种写法哪种更好?或者其他更好的写法?

    15 条回复    2018-12-20 14:18:10 +08:00
    akatquas
        1
    akatquas  
       2018-12-20 12:33:36 +08:00 via iPhone
    我选第一种,效率和空间都略好一点
    weixiangzhe
        2
    weixiangzhe  
       2018-12-20 12:34:03 +08:00 via iPhone
    2, 不要直接改参数变量 会有不可预计的东西
    Athrob
        3
    Athrob  
       2018-12-20 12:36:33 +08:00 via Android
    个人感觉写法一比较好。写法二 bar 改成 bar2,函数里面也得改。
    Cbdy
        4
    Cbdy  
       2018-12-20 12:37:31 +08:00
    ```
    function bar(data: number[]) {
    let res = [2, 3, 4]
    if (data.length > 3) {
    res = data.map(e => e + 1)
    }
    return res
    }
    ```
    V2exUser
        5
    V2exUser  
       2018-12-20 12:39:10 +08:00 via Android
    第一种,清晰
    Mutoo
        6
    Mutoo  
       2018-12-20 12:39:33 +08:00
    2 有 stack overflow 的风险(例如不小心写成 return bar([1,2]) 时,data.length < 3 永远成立)
    dixeran
        7
    dixeran  
       2018-12-20 12:40:46 +08:00 via Android
    所以综合考虑 2L 和 3L,用方法二然后改成 callee?
    Justin13
        8
    Justin13  
       2018-12-20 12:46:59 +08:00 via Android
    第二个,能纯尽量纯。
    或者
    ```js
    const foo = (data) => {
    const newData = data.length < 3 ? [1,2,3] : data;
    return newData.map(ele => ele + 1)
    }
    ```
    yuanfnadi
        9
    yuanfnadi  
       2018-12-20 12:58:18 +08:00
    const foo = data => {
    if (data.length < 3) {
    return [2, 3, 4];
    }
    return data.map(ele => ele + 1);
    };
    whileFalse
        10
    whileFalse  
       2018-12-20 13:00:48 +08:00
    第一种。
    因为第二种无法扩展到有多个 if 的情况。

    @Mutoo 这位仁兄说的问题我倒觉得无所谓。同是 bug,静默错误未必比直接卡死好多少。
    otakustay
        11
    otakustay  
       2018-12-20 13:32:38 +08:00
    你不让我写三元的话,肯定选第 2 种,if 分支多起来也是不同分支不同 return。选择不去改变任何一个变量 /参数的值是很好的实践
    wly19960911
        12
    wly19960911  
       2018-12-20 13:36:51 +08:00
    2 的写法究竟是哪里来的。function 减少对外界变量的依赖,这个封装的基础。

    const foo = (data) => {
    if(data.length < 3) return [1,2,3]
    return data.map(ele => ele + 1)
    }

    这样最好
    cuzfinal
        13
    cuzfinal  
       2018-12-20 13:40:21 +08:00
    选 2,不要改参数
    yikyo
        14
    yikyo  
       2018-12-20 13:41:13 +08:00
    第一种 ESLint 检测过不去。不能修改参数值。
    jorneyr
        15
    jorneyr  
       2018-12-20 14:18:10 +08:00
    只看得懂 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3653 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:18 · PVG 12:18 · LAX 21:18 · JFK 00:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.