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

2015-12-28 23:25:18 +08:00
 minggeJS
(提醒:我不是来问问题的,我已经有自己答案!)
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 君的代码 谁的效率最高呢!
(稍后公布答案)!
20125 次点击
所在节点    JavaScript
210 条回复
FrankFang128
2015-12-29 01:04:43 +08:00
在页面上谈 JS 性能就是个笑话。
99% 的页面瓶颈在网络上好么。
chemzqm
2015-12-29 01:07:01 +08:00
不过话说模块化都好多年了,你们代码竟然还用差不多十年前就有的命名空间的方式,这种代码怎么写都蛋疼。
imn1
2015-12-29 01:11:42 +08:00
@FrankFang128
百毒贴吧是 1%
funCoder
2015-12-29 01:22:56 +08:00
曾经我用 A ,后来我用 B ,不做过早的优化把时间花这了。
czheo
2015-12-29 01:42:31 +08:00
一般来说,写成 B 让别人很难根据 stack trace 来 debug 。
aprikyblue
2015-12-29 02:13:21 +08:00
你是 B 君,无可置疑的 minggeJS 之父,你正确,你 NB ,结贴

对 lz 高高在上的自大 不敢认同,以及测试过程我认为不够严谨

对于性能。。。 js 谈什么性能,浏览器实现又不尽一样,更何况与其他性能瓶颈相比更是不值一提
关于 try catch ,不仅是 js ,该哪里用什么特性就哪里用,考虑这点性能搞什么。 OOP ,封装,生来干嘛的?计较这点性能,那不如直接全扔了,拿十年前的 copy 大法,全部写在程序入口点一坨。或者去写汇编、机器码。 A 君那一坨 if 真是。。
233
2015-12-29 02:23:31 +08:00
lz 你是听说了那个帖子才来注册的吗? (纯好奇)
andrewpsy
2015-12-29 04:25:11 +08:00
看了不少结尾把观众往死里惊讶的电影,我大胆猜测一下:你不是 B 却要装 B ,你其实是 C 。
msg7086
2015-12-29 07:43:41 +08:00
回到主题吧。简单说几句,以避免很多帖子误导了新人。

对于用异常还是逻辑控制,一般的准则是不要用异常去代替逻辑。
像 OP 这种情况,单独拿出两个函数来,却不说清楚调用上下文的情况下,是没法说明哪种写法更好的。

* 假如这个函数的输入来自一个不确定的源(比如用户输入),那么过滤非法输入属于正常需求,因此属于逻辑代码,应当主动检验数据(即使用 if() )。

* 假如这个函数的输入来自一个可信源(比如可信的数据库、本地配置文件、第三方可信 API 等),那么函数期望输入总是正确的,因而不正确的输入就属于异常现象,这种情况下应当用异常捕获机制(即使用第二种方法, try catch 并打 log )。

至于效率,在一个不需要考虑效率的地方并没有什么意义。
如果需要非常高的计算效率(比如支持特别古老的电脑),那就老老实实在服务器端渲染,别用重 js 了。
XadillaX
2015-12-29 09:24:25 +08:00
怎么哪都有你_(:з」∠)_
zhujinliang
2015-12-29 09:32:05 +08:00
JSON.parse 只能 try … catch 啊摔,情何以堪
daysv
2015-12-29 09:53:52 +08:00
我还是选择狗带
pljhonglu
2015-12-29 10:02:09 +08:00
哪个方便就用哪个呗~😂
raopeize
2015-12-29 10:10:58 +08:00
老实说我从来没用过 IF 语句,正因为我反感 IF 语句。 为什么我反感,因为我完全有开发 IF 语句的能力, IF 语句的底层我都了如指掌。
虽说我反感 IF 语句,但是 IF 语句却占有大量的用户份额,之后我有个想法,不如重新开发一个属于自己思想,自己架构的 IF 语句。
我给了他一个霸气的名字: MingGeIF 语句,
它的名字叫 MingGeIF 语句, MingGe 就是我的大名, 一看到 IF 语句名字,就知道作者是我,知道它是国产的,让别人知道国产 IF 语句一样做得很出色,出众!
我是 mingge 请支持国产 minggeIF 语句,因为我们都是中国人。
bk201
2015-12-29 10:37:12 +08:00
用 try 代替 if ?这种代码写起来不累吗?而且可读性太差了吧。 2 种用在不同场合,凤姐你叼
CodingPuppy
2015-12-29 10:49:05 +08:00
deadEgg
2015-12-29 10:51:06 +08:00
try catch 里面去写逻辑
难怪老有人提出去除 try catch
cdxem713
2015-12-29 10:56:25 +08:00
@CodingPuppy 就冲这个,楼主你赶紧去死吧
yhylord
2015-12-29 10:57:03 +08:00
@msg7086 这种准则是适用于所有语言吗,还是只是 JS ?因为我看到 Python 似乎推荐用异常代替 if ,如果可能的话。
overtrue
2015-12-29 11:07:25 +08:00
楼主肯定是 B !!!绝对的!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/246798

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX