V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
loongwang
V2EX  ›  问与答

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

  •  
  •   loongwang · 2018-05-06 23:07:45 +08:00 · 3295 次点击
    这是一个创建于 2180 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近写毕设要自己写前端,发现 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 条附言  ·  2018-05-07 08:47:20 +08:00
    以上几个方法只是网上搜到的。对于混乱的语言标准很无奈
    第 2 条附言  ·  2018-05-07 12:26:07 +08:00
    承认错误,确实没仔细看过 api,只是从 c/c++ 和 java 的经验去判断的。
    27 条回复    2018-05-07 14:18:35 +08:00
    orangeade
        1
    orangeade  
       2018-05-06 23:46:32 +08:00 via Android
    宁愿写 typescript 再编译一次我也不想写 js,语言特性太奇葩
    LeungJZ
        2
    LeungJZ  
       2018-05-07 00:11:13 +08:00
    _.isEmpty({})

    >true
    marcong95
        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
    autoxbc
        4
    autoxbc  
       2018-05-07 00:13:42 +08:00
    如果考虑继承和枚举,上面的实现不一定正确

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

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

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

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


    @noe132 Java 当然要判断对象为空。每个带参数的方法中要做的第一件事就是判断参数是否为空。
    crysislinux
        10
    crysislinux  
       2018-05-07 08:01:27 +08:00 via Android
    带参数的 Java 判断参数为空也不是这么个为空法啊,你家 Java 经常判断对象没有属性来判断空么
    shintendo
        11
    shintendo  
       2018-05-07 08:40:15 +08:00
    @incompatible 你说的为空是一回事么。。。
    cout2013mr
        12
    cout2013mr  
       2018-05-07 08:41:01 +08:00
    如果一个对象只定义了不可枚举属性,那这三种方法全都是错的。
    littlebaozi
        13
    littlebaozi  
       2018-05-07 08:51:50 +08:00
    做前端的也很无奈啊
    k9982874
        14
    k9982874  
       2018-05-07 08:53:22 +08:00 via iPhone
    没觉得有啥问题,撸主混淆概念想搞个大新闻,跟帖无脑跟着喷
    frozenthrone
        15
    frozenthrone  
       2018-05-07 09:02:07 +08:00 via iPhone
    billyu
        16
    billyu  
       2018-05-07 09:15:13 +08:00
    @frozenthrone #15 隐式转换了解一下
    loongwang
        17
    loongwang  
    OP
       2018-05-07 09:16:26 +08:00
    @k9982874 混淆概念? 以一个后端的视角我就是这么理解的
    misaka19000
        18
    misaka19000  
       2018-05-07 09:18:06 +08:00
    我认为语言特性多并不是坏事
    lwbjing
        19
    lwbjing  
       2018-05-07 09:38:58 +08:00
    你那三方法对应了 JS 了三个历史时期。。
    cout2013mr
        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 封装的迭代器三种方式遍历呢?每个特性都用自己的用途,不是让你乱用的,谢谢。
    oyosc
        21
    oyosc  
       2018-05-07 10:16:08 +08:00
    @cout2013mr 老哥,稳!
    muziki
        22
    muziki  
       2018-05-07 10:20:45 +08:00
    js 只不过是捡了历史进程的便宜
    maomaomao001
        23
    maomaomao001  
       2018-05-07 10:26:33 +08:00 via Android
    很大的可能性,你设计的不太对吧。。。 没有这样比的
    Pastsong
        24
    Pastsong  
       2018-05-07 10:32:16 +08:00
    上面喷语言标准的有人看过语言标准吗。。。
    kohos
        25
    kohos  
       2018-05-07 11:41:45 +08:00
    其他语言例如 Java 拿 Object 做参数也是要做很多判断的,自己不会用不要怪语言
    k9982874
        26
    k9982874  
       2018-05-07 13:20:57 +08:00
    @loongwang 那你觉得其他语言的 Map 是否为空的判断标准是什么?包个 isEmpty 出来就高大上了?呵呵
    banricho
        27
    banricho  
       2018-05-07 14:18:35 +08:00
    @Pastsong
    在 V 站喷 JS 已经成为一种政治正确了,笑笑就好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4041 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 10:17 · PVG 18:17 · LAX 03:17 · JFK 06:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.