js 的这些特性真的叫人哭笑不得

2018-05-06 23:07:45 +08:00
 loongwang

最近写毕设要自己写前端,发现 js 的这些语言特性真是无 fuck 说,判断一个对象是否为空竟然有这么多骚操作

var judgeObj = function(obj){
    for(var item in obj){
        return true;
    }
    return false;
}

var judgeObj = function(obj){
    if(JSON.stringify(obj) == "{}") return true;
    else return false;
}

var judgeObj = function(obj){
    if(Object.keys(obj).length  == 0) return true;
    else return false;
}
3326 次点击
所在节点    问与答
27 条回复
orangeade
2018-05-06 23:46:32 +08:00
宁愿写 typescript 再编译一次我也不想写 js,语言特性太奇葩
LeungJZ
2018-05-07 00:11:13 +08:00
_.isEmpty({})

>true
marcong95
2018-05-07 00:12:21 +08:00
你需要$.isEmptyObject 或者_.isEmpty,jQuery、Underscore、Lodash 总有一个吧。既然不打算专精前端的话还是找点啥库用着吧。
毕竟这是对象,不是 map,map 才有 size。你写后端的时候也不会判断对象是不是空的吧。
JS 一堆奇葩特性,窃以为这个还真不算。而且部分人士会告诉你,JS 的「奇葩」只是因为它是 Prototype-based OO 而不是 Class-based OO
autoxbc
2018-05-07 00:13:42 +08:00
如果考虑继承和枚举,上面的实现不一定正确

你可能需要 Reflect.ownKeys
brickyang
2018-05-07 00:32:08 +08:00
习惯写 == 而不写 === 有你吃亏的一天。

而且这三种写法的并不是完全一致的,没考虑继承和自有属性,以及属性的不可枚举性等差异。
SuperMild
2018-05-07 01:02:17 +08:00
用 typescript 就好了
noe132
2018-05-07 01:41:19 +08:00
不要写这种难以理解的代码。

一般来说不出要判断对象是否为空。相对于 Java 来说,Java 也基本不会说要判断一个对象是否为空。
需要一个空值的时候传 null 比{}好很多。判断是否为 null 只需要全等符号就行了。
chemzqm
2018-05-07 02:16:18 +08:00
这个还好吧,相比与其它某些特性,例如:
typeof null === 'object',
NaN !== NaN

typescript 能避免一些问题,但是也是有限的,因为 type 会写错,例如需要包含 null 时却没有,还有来自其它输入的数据,还是要用 js 的方法做检测,typescript 并不做数据检测。
incompatible
2018-05-07 03:02:29 +08:00
赞同 3 楼的“窃以为这不叫特性”,这简直就是 bug。


@noe132 Java 当然要判断对象为空。每个带参数的方法中要做的第一件事就是判断参数是否为空。
crysislinux
2018-05-07 08:01:27 +08:00
带参数的 Java 判断参数为空也不是这么个为空法啊,你家 Java 经常判断对象没有属性来判断空么
shintendo
2018-05-07 08:40:15 +08:00
@incompatible 你说的为空是一回事么。。。
cout2013mr
2018-05-07 08:41:01 +08:00
如果一个对象只定义了不可枚举属性,那这三种方法全都是错的。
littlebaozi
2018-05-07 08:51:50 +08:00
做前端的也很无奈啊
k9982874
2018-05-07 08:53:22 +08:00
没觉得有啥问题,撸主混淆概念想搞个大新闻,跟帖无脑跟着喷
frozenthrone
2018-05-07 09:02:07 +08:00
billyu
2018-05-07 09:15:13 +08:00
@frozenthrone #15 隐式转换了解一下
loongwang
2018-05-07 09:16:26 +08:00
@k9982874 混淆概念? 以一个后端的视角我就是这么理解的
misaka19000
2018-05-07 09:18:06 +08:00
我认为语言特性多并不是坏事
lwbjing
2018-05-07 09:38:58 +08:00
你那三方法对应了 JS 了三个历史时期。。
cout2013mr
2018-05-07 10:11:37 +08:00
没有看 api 和特性吗???
文档哪里写着这三种方法是用来判断 js 对象是否为空的,能不能喷之前先了解语言基本特性?
抄代码之前先搞清楚功能和原理,in 是遍历,Json.stringify()是序列化,Object.keys() 是获取属性个数。java 和 C 中也完全可以用这三种方式实现对象的判空。前面也说过,这三个方法都是针对可枚举类型的属性,很多场景下都不能粗暴地用来判空!!
var man = new Object();
Object.defineProperty(kxy, "sex", {
value: "man",
enumerable: false
});
用你的三种方法判断下,man 对象是不是为空,再 debug 看一下 man 对象的 sex 属性值。
还有,怎么不说 java 遍历还有迭代器,循环和 foreach 封装的迭代器三种方式遍历呢?每个特性都用自己的用途,不是让你乱用的,谢谢。

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

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

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

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

© 2021 V2EX