最近写毕设要自己写前端,发现 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;
}
1
orangeade 2018-05-06 23:46:32 +08:00 via Android
宁愿写 typescript 再编译一次我也不想写 js,语言特性太奇葩
|
2
LeungJZ 2018-05-07 00:11:13 +08:00
_.isEmpty({})
>true |
3
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 |
4
autoxbc 2018-05-07 00:13:42 +08:00
如果考虑继承和枚举,上面的实现不一定正确
你可能需要 Reflect.ownKeys |
5
brickyang 2018-05-07 00:32:08 +08:00 via iPhone
习惯写 == 而不写 === 有你吃亏的一天。
而且这三种写法的并不是完全一致的,没考虑继承和自有属性,以及属性的不可枚举性等差异。 |
6
SuperMild 2018-05-07 01:02:17 +08:00
用 typescript 就好了
|
7
noe132 2018-05-07 01:41:19 +08:00
不要写这种难以理解的代码。
一般来说不出要判断对象是否为空。相对于 Java 来说,Java 也基本不会说要判断一个对象是否为空。 需要一个空值的时候传 null 比{}好很多。判断是否为 null 只需要全等符号就行了。 |
8
chemzqm 2018-05-07 02:16:18 +08:00
这个还好吧,相比与其它某些特性,例如:
typeof null === 'object', NaN !== NaN typescript 能避免一些问题,但是也是有限的,因为 type 会写错,例如需要包含 null 时却没有,还有来自其它输入的数据,还是要用 js 的方法做检测,typescript 并不做数据检测。 |
9
incompatible 2018-05-07 03:02:29 +08:00
|
10
crysislinux 2018-05-07 08:01:27 +08:00 via Android
带参数的 Java 判断参数为空也不是这么个为空法啊,你家 Java 经常判断对象没有属性来判断空么
|
11
shintendo 2018-05-07 08:40:15 +08:00
@incompatible 你说的为空是一回事么。。。
|
12
cout2013mr 2018-05-07 08:41:01 +08:00
如果一个对象只定义了不可枚举属性,那这三种方法全都是错的。
|
13
littlebaozi 2018-05-07 08:51:50 +08:00
做前端的也很无奈啊
|
14
k9982874 2018-05-07 08:53:22 +08:00 via iPhone
没觉得有啥问题,撸主混淆概念想搞个大新闻,跟帖无脑跟着喷
|
15
frozenthrone 2018-05-07 09:02:07 +08:00 via iPhone
|
16
billyu 2018-05-07 09:15:13 +08:00
@frozenthrone #15 隐式转换了解一下
|
18
misaka19000 2018-05-07 09:18:06 +08:00
我认为语言特性多并不是坏事
|
19
lwbjing 2018-05-07 09:38:58 +08:00
你那三方法对应了 JS 了三个历史时期。。
|
20
cout2013mr 2018-05-07 10:11:37 +08:00 5
没有看 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 封装的迭代器三种方式遍历呢?每个特性都用自己的用途,不是让你乱用的,谢谢。 |
21
oyosc 2018-05-07 10:16:08 +08:00
@cout2013mr 老哥,稳!
|
22
muziki 2018-05-07 10:20:45 +08:00
js 只不过是捡了历史进程的便宜
|
23
maomaomao001 2018-05-07 10:26:33 +08:00 via Android
很大的可能性,你设计的不太对吧。。。 没有这样比的
|
24
Pastsong 2018-05-07 10:32:16 +08:00
上面喷语言标准的有人看过语言标准吗。。。
|
25
kohos 2018-05-07 11:41:45 +08:00
其他语言例如 Java 拿 Object 做参数也是要做很多判断的,自己不会用不要怪语言
|