V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
leslie000666
V2EX  ›  程序员

JS 写法请教

  •  
  •   leslie000666 · 2018-04-11 20:19:54 +08:00 · 2703 次点击
    这是一个创建于 2421 天前的主题,其中的信息可能已经有所发展或是发生改变。
    var a = ['li', 'hao'];
    var b = {
        0: 'li',
        1: 'hao',
    }
    

    请问,更推荐哪种写法?以及为啥?

    第 1 条附言  ·  2018-04-11 21:08:53 +08:00
    a[0] // => li
    b[0] // => li
    结果一样的情况下

    其实我想问的还是规范,已经后期数据量大的情况下的扩展语维护和取值的性能问题(遍历等)
    22 条回复    2018-04-12 14:43:01 +08:00
    cctv1005s927
        1
    cctv1005s927  
       2018-04-11 20:39:49 +08:00
    如果你要表达的是数组,毫无疑问是第一种。

    原因:
    1,代码表达的是作者的意思,既然要表达数组,那就应该用数组
    2,既然要表达的是数组,那么使用数组后能够使用 Array 的原生方法,这样既不需要去引用第三方库,降低学习成本,又能增加程序的可读性。
    cctv1005s927
        2
    cctv1005s927  
       2018-04-11 20:40:15 +08:00
    实在不知道这种写法是哪里学来的...
    murmur
        3
    murmur  
       2018-04-11 20:44:02 +08:00
    第二种写法是讲鸭式判别的练习题?
    des
        4
    des  
       2018-04-11 20:44:30 +08:00 via Android
    @cctv1005s927 估计是最好的语言吧
    crs0910
        5
    crs0910  
       2018-04-11 20:45:10 +08:00 via Android
    数组有序 object 是无序的
    rabbbit
        6
    rabbbit  
       2018-04-11 20:45:50 +08:00
    写法 b 有啥好处吗?
    要插入一个数,a 直接就插了 a.splice(1,0,'lll'), b 咋办
    crs0910
        7
    crs0910  
       2018-04-11 20:46:08 +08:00 via Android
    还有 你的问题问的不清不楚的
    leslie000666
        8
    leslie000666  
    OP
       2018-04-11 21:00:08 +08:00
    @cctv1005s927 哦?那你觉得应该怎么写?
    ETiV
        9
    ETiV  
       2018-04-11 21:01:41 +08:00 via iPhone
    没有上下文的情况下无法判断哪种更好
    leslie000666
        10
    leslie000666  
    OP
       2018-04-11 21:02:06 +08:00
    @crs0910 写法更好的含义包括,语义,语法规范,数量量够大时的性能等
    Cbdy
        11
    Cbdy  
       2018-04-11 21:14:20 +08:00
    使用第一种
    noe132
        12
    noe132  
       2018-04-11 21:19:35 +08:00   ❤️ 5
    从性能上来分析
    其实很多情况不需要考虑性能。如果不是做计算密集的处理,仅仅是浏览器客户端的执行,性能影响几乎可以忽略不计。
    https://stackoverflow.com/questions/8423493/what-is-the-performance-of-objects-arrays-in-javascript-specifically-for-googl
    参考这篇文章,Array 的 push pop 大约是 Object 的 20 倍。
    shift 虽比 pop 慢 6 倍,但仍然是 Object delete 效率的 100 倍。

    从代码可读性角度上看,Array 字面量足够清晰。写法 2 过于冗余。

    从数据结构上来看,Array 继承 Array.prototype 的一系列方法,并且 Array 的元素 index 和 length 都是动态的,写法 2 并没有

    从语法规范,你这两种写法都是正确的,你怎么开心怎么写。

    实际情况呢?
    除非 index 是固定值的情况,如 key 为 number 的某哈希散列,不太可能有机会用到第二种形式。
    因为 array 会继承 Array 的方法,Object 类型没有响应的操作,如果需要进行响应的操作写法会很不方便。
    当然,如果你要自己实现一个用 Object 来实现的类 Array 对象也没有问题。

    有时候有些确实会钻进牛角尖,比如这个例子。很多时候总是在想是这样好还是那样好,想了半天结果代码没写多少。实际上,当你不知道哪一种写法好的时候,选一种你觉得还可以的写法写下去就行了。遇到了不方便、不好用、不适合的情况自然就有答案,各种选择的优劣何在了。
    crs0910
        13
    crs0910  
       2018-04-11 21:19:49 +08:00 via Android
    如果你要的是数组,那就只有第一种。
    leslie000666
        14
    leslie000666  
    OP
       2018-04-11 21:28:34 +08:00
    @noe132 👍靠谱
    k9982874
        15
    k9982874  
       2018-04-11 22:12:05 +08:00 via iPad
    哈希表和链表的区别
    LeungJZ
        16
    LeungJZ  
       2018-04-11 22:55:00 +08:00
    如果表达是个数组,那就用第一种。
    如果表达是个对象,那就用第二种。
    因为很多时候,我都会用对象缓存某些数据,以数据的 id 为键值,因为这么取数据比较方便。
    zhwithsweet
        17
    zhwithsweet  
       2018-04-11 23:10:55 +08:00 via iPhone
    难道不是 a['0']a ?
    zhwithsweet
        18
    zhwithsweet  
       2018-04-11 23:11:21 +08:00 via iPhone
    key 是字符串吧?
    bhaltair
        19
    bhaltair  
       2018-04-11 23:43:49 +08:00
    var b = {
    0: 'li',
    1: 'hao',
    length: 2
    }
    Array.from(b)
    Leigg
        20
    Leigg  
       2018-04-12 09:02:49 +08:00 via Android
    对象的 key 又是一个字符串
    codehz
        21
    codehz  
       2018-04-12 09:32:15 +08:00
    @zhwithsweet #18 JS 的 key 可以是字符串也可以是整数,甚至还可以是标识(Symbol)
    faceRollingKB
        22
    faceRollingKB  
       2018-04-12 14:43:01 +08:00
    第一种写法是数组,第二种写法是字典,各有各的用途,取决于你的设计
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6005 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:30 · PVG 10:30 · LAX 18:30 · JFK 21:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.