V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
loongwang
V2EX  ›  问与答

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

  •  
  •   loongwang · May 6, 2018 · 3804 views
    This topic created in 2916 days ago, the information mentioned may be changed or developed.

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

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

    你可能需要 Reflect.ownKeys
    brickyang
        5
    brickyang  
       May 7, 2018 via iPhone
    习惯写 == 而不写 === 有你吃亏的一天。

    而且这三种写法的并不是完全一致的,没考虑继承和自有属性,以及属性的不可枚举性等差异。
    SuperMild
        6
    SuperMild  
       May 7, 2018
    用 typescript 就好了
    noe132
        7
    noe132  
       May 7, 2018
    不要写这种难以理解的代码。

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

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


    @noe132 Java 当然要判断对象为空。每个带参数的方法中要做的第一件事就是判断参数是否为空。
    crysislinux
        10
    crysislinux  
       May 7, 2018 via Android
    带参数的 Java 判断参数为空也不是这么个为空法啊,你家 Java 经常判断对象没有属性来判断空么
    shintendo
        11
    shintendo  
       May 7, 2018
    @incompatible 你说的为空是一回事么。。。
    cout2013mr
        12
    cout2013mr  
       May 7, 2018
    如果一个对象只定义了不可枚举属性,那这三种方法全都是错的。
    littlebaozi
        13
    littlebaozi  
       May 7, 2018
    做前端的也很无奈啊
    k9982874
        14
    k9982874  
       May 7, 2018 via iPhone
    没觉得有啥问题,撸主混淆概念想搞个大新闻,跟帖无脑跟着喷
    frozenthrone
        15
    frozenthrone  
       May 7, 2018 via iPhone
    billyu
        16
    billyu  
       May 7, 2018
    @frozenthrone #15 隐式转换了解一下
    loongwang
        17
    loongwang  
    OP
       May 7, 2018
    @k9982874 混淆概念? 以一个后端的视角我就是这么理解的
    misaka19000
        18
    misaka19000  
       May 7, 2018
    我认为语言特性多并不是坏事
    lwbjing
        19
    lwbjing  
       May 7, 2018
    你那三方法对应了 JS 了三个历史时期。。
    cout2013mr
        20
    cout2013mr  
       May 7, 2018   ❤️ 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  
       May 7, 2018
    @cout2013mr 老哥,稳!
    muziki
        22
    muziki  
       May 7, 2018
    js 只不过是捡了历史进程的便宜
    maomaomao001
        23
    maomaomao001  
       May 7, 2018 via Android
    很大的可能性,你设计的不太对吧。。。 没有这样比的
    Pastsong
        24
    Pastsong  
       May 7, 2018
    上面喷语言标准的有人看过语言标准吗。。。
    kohos
        25
    kohos  
       May 7, 2018
    其他语言例如 Java 拿 Object 做参数也是要做很多判断的,自己不会用不要怪语言
    k9982874
        26
    k9982874  
       May 7, 2018
    @loongwang 那你觉得其他语言的 Map 是否为空的判断标准是什么?包个 isEmpty 出来就高大上了?呵呵
    banricho
        27
    banricho  
       May 7, 2018
    @Pastsong
    在 V 站喷 JS 已经成为一种政治正确了,笑笑就好
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2454 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 87ms · UTC 05:13 · PVG 13:13 · LAX 22:13 · JFK 01:13
    ♥ Do have faith in what you're doing.