V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
minggeJS

反对 try{}catch (e){}的进来, B 君已经是全群公敌!

  •  
  •   minggeJS · Dec 28, 2015 · 22525 views
    This topic created in 3786 days ago, the information mentioned may be changed or developed.
    (提醒:我不是来问问题的,我已经有自己答案!)
    A 君和 B 君各自用 JS 做一个简单的需求:

    function test(foo){
    var obj= new foo();

    obj.wo.ok.arr.push("帅哥");

    return obj;


    }

    当 foo 传入错误参数时 程序是肯定是报错的! obj.wo 无法索引到时,也同样是报错的
    现在 A 君和 B 君分别采用不同的方法
    -------------------------------------------------------------
    A 君采用的方法是:

    function test(foo) {
    if (typeof foo == "function") {
    var obj = new foo();
    if (obj.wo && obj.wo.ok && Object.prototype.toString.call(obj.wo.ok.arr) == "[object Array]") {
    obj.wo.ok.arr.push("帅哥");
    return obj;
    }
    }
    return false;
    }
    ----------------------------------------------------------------------------------------
    B 君采用的方法是:
    function test(foo) {
    try{
    var obj = new foo();
    obj.wo.ok.arr.push("帅哥");
    return obj;
    }catch (e){}
    return false;
    }



    结果 B 君成为了全群公敌,及取笑的对象, A 君和 B 君各不相让, A 君更是大骂 B 君:“你百度看看看,你用 TRY 是菜鸟的行为, TRY 效率很差的,应该尽量避免使用 TRY ”。
    B 君一向按自己的原则做事, B 君不相信百度,坚持自己的 TRY 立场,B 君觉得自己的 TRY 用得完全合理,一气之下愤然离群!

    现在问大家:上面两段你觉得 A 君和 B 君的代码 谁的效率最高呢!
    (稍后公布答案)!
    Supplement 1  ·  Dec 29, 2015
    Supplement 2  ·  Dec 29, 2015
    @jarlyyn A 君 B 君代码只是一个演试效果,我并没有说用 try 就不能用 if 了,我从头到尾没这样说

    在实际开发中, B 君可以 TRY 再配合适当 if 进行判断, 而 A 君呢,只能 IF 又再多 if 一句。
    最后 A 君的代码,变得又长又没有效率,而 B 君的代码大不了再多一句 if 。一样是轻巧型代码

    所以到最后 B 君始终是最后胜利者
    Supplement 3  ·  Dec 30, 2015
    retun false 只是为了让演试具有立体效,为何要捉住 retun false 不放!何必呢

    function test(foo) {
    try{
    var obj = new foo();
    obj.wo.ok.arr.push("帅哥");
    return obj;
    }catch (e){
    return "我要 DEBUG :"+e
    }

    }
    210 replies    2016-01-15 23:45:58 +08:00
    1  2  3  
    PublicID
        201
    PublicID  
       Dec 30, 2015
    再翻
    GG668v26Fd55CP5W
        202
    GG668v26Fd55CP5W  
       Dec 31, 2015 via iPhone
    明哥已经暴走了,明哥很生气,后果很严重
    minggeJS
        203
    minggeJS  
    OP
       Dec 31, 2015
    @jarlyyn 你不会吧,我还以为你的方案,不使用 TRY ,用更高级的 IF 方法,
    你这样还不是一样 B 君方案!

    你最终的目也是为了 DEBUG 而已

    if (e.name=='TypeError' || e.name=='ReferenceError'){ 写来多余吧,

    直接 throw e; 给外面
    XadillaX
        204
    XadillaX  
       Dec 31, 2015
    @zhfish 说了他不信 JSPerf 这个 [测试软件] ——你没看错,是 [测试软件] 。
    jarlyyn
        205
    jarlyyn  
       Dec 31, 2015 via Android
    @minggeJS

    代码写的太少的人,看到别人写的代码么不知道是什么用的。

    用 if 判断的地方说明是符合函数的约定。

    所以不管是不是用 catch ,都需要进行判断和处理。

    之所以会放在 try 里,只是你强行要放罢了。
    Aidea
        206
    Aidea  
       Dec 31, 2015
    虽然我不知道你们在讨论的啥,但我还是一楼一楼的看完了!
    可怜我杨佳一世英名~
    kamushin
        207
    kamushin  
       Dec 31, 2015
    不觉得这里需要 catch 异常,直接 crash 就行了。
    kamushin
        208
    kamushin  
       Dec 31, 2015
    或者 try catch log raise again
    ryd994
        209
    ryd994  
       Dec 31, 2015
    @minggeJS #182 你自己直接滚蛋
    知不知道编译器会翻过来?

    程序里不判断 if , throw catch 的时候还不是要判断。所以 C++里才出现了 nothrow 。 JS 没有,不过是因为性能压力还不到这个程度而已。说到底解释器还是要判断。真要性能,用 C ,用汇编去啊,自己写浏览器去啊,别用 JS 在这里 BB 。
    markocen
        210
    markocen  
       Jan 15, 2016
    V8 不会对包含 try...catch...的 function 进行优化, 但是产品中使用 try...catch...是不可避免的, 所以需要将 try...catch...单独提出来,以免 main function 无法被优化:

    function tryCatch(fn, context, catcher){
    try {
    return fn.apply(context, args);
    }
    catch(e) {
    return catcher(e)
    }
    }

    function main(){
    tryCatch(something ...)
    }
    1  2  3  
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1600 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 16:26 · PVG 00:26 · LAX 09:26 · JFK 12:26
    ♥ Do have faith in what you're doing.