V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
qdwang
V2EX  ›  JavaScript

JavaScript 是个好语言 (滑稽

  •  
  •   qdwang · 2017-05-23 13:21:18 +08:00 · 9595 次点击
    这是一个创建于 2776 天前的主题,其中的信息可能已经有所发展或是发生改变。
    输入
    [false, Boolean(false), [], [[]], "", String(""), 0, Number(0), "0", String("0"), [0]].map(x => null >= x && null <= x && null !== x)
    
    输出
    [true, true, true, true, true, true, true, true, true, true, true]
    

    一个会在这么多情况下出现逻辑悖论的语言,是个好语言~

    所以再怎么发展 ES6, ES2015, ES2017... 都是徒劳的...

    只能希望 wasm 快点推进,革了 JS 的命...

    109 条回复    2017-06-01 11:01:47 +08:00
    1  2  
    oxyFired
        1
    oxyFired  
       2017-05-23 13:25:11 +08:00 via Android   ❤️ 2
    sx,你不知道 js 里<=和>=的原理就在这里乱喷
    hudotio
        2
    hudotio  
       2017-05-23 13:26:00 +08:00
    固然有槽点,但是 JS 也不是在努力变好么。。。
    xilixjd
        3
    xilixjd  
       2017-05-23 13:31:34 +08:00
    js 的坏处就在于这些语言的缺陷增加了学习成本
    jtsai
        4
    jtsai  
       2017-05-23 13:31:47 +08:00   ❤️ 2
    我抽过烟、打过架、堕过胎,但我觉得我还是一个好女孩
    fds
        5
    fds  
       2017-05-23 13:32:50 +08:00
    本来定义就不是有序的呀,谈不上悖论
    Presbyter
        6
    Presbyter  
       2017-05-23 13:35:00 +08:00
    楼主需要理解一下 Boolean
    http://www.w3school.com.cn/js/js_obj_boolean.asp
    Mitt
        7
    Mitt  
       2017-05-23 13:38:48 +08:00
    这是每个语言间的定义问题,想知道为什么会发生这种事情就要去看原理了,js 确实有些时候蛋疼,不过我感觉 js 是所有语言中最神奇的
    moxhuis
        8
    moxhuis  
       2017-05-23 13:39:30 +08:00
    6 年前端 XD
    momocraft
        9
    momocraft  
       2017-05-23 13:42:42 +08:00
    一个通用语言中的所有值不太可能构成偏序,拿这个黑有点牵强了。
    otakustay
        10
    otakustay  
       2017-05-23 13:57:47 +08:00   ❤️ 3
    都 2017 年了,你的眼里还是没有类型这个东西,还是拿着完全不同类型的东西去做不应该做的运算
    是的 js 有历史包袱所以有一些边界情况下会有问题,但是 2017 年了同学,2017 年的软件工程里你去踩这些边界条件还能说出来当炫耀吗?
    yoa1q7y
        12
    yoa1q7y  
       2017-05-23 14:09:17 +08:00
    这怎么算作是悖论,你故意这么写,结果都是符合当初的语言设计标准的
    其他语言不也一样么
    popu111
        13
    popu111  
       2017-05-23 14:14:03 +08:00 via Android
    第一二个是 true ??? excuse me ?
    ck65
        14
    ck65  
       2017-05-23 14:22:20 +08:00 via iPhone
    我学习并用 JS 的种种「不对」拿薪水,你花掉时间研究它又是来做什么呢?
    plqws
        15
    plqws  
       2017-05-23 14:23:47 +08:00 via iPhone
    这么说的话,看来世界上所有脚本语言都没有存在的意义了
    buckyRRRR
        16
    buckyRRRR  
       2017-05-23 14:25:42 +08:00   ❤️ 1
    缺陷被放大也都是被面试题害的,正常工作里这些东西会给你带来麻烦,知道问题规避不可以吗
    demo
        17
    demo  
       2017-05-23 14:50:14 +08:00
    楼主不知道原因吗?非严格相等比较的时候会进行类型转换,比如:

    [false, Boolean(false), [], [[]], "", String(""), 0, Number(0), "0", String("0"), [0]].map(x => Number(x))
    // [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    Number(null)
    // 0

    这样 “ null >= x && null <= x ” 就是 “ 0 >= 0 && 0 <= 0 ”,而 null 和 0 是 2 个不同的类型,所有不全等。

    楼主可以看看: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Equality_comparisons_and_sameness
    SakuraKuma
        18
    SakuraKuma  
       2017-05-23 14:55:45 +08:00
    感觉是被面试题气疯了的。(
    gongbaodd
        19
    gongbaodd  
       2017-05-23 15:00:51 +08:00
    泥萌不要这么说 jj,泥萌知道 jj 有多努力么
    gouflv
        20
    gouflv  
       2017-05-23 15:27:34 +08:00
    5 年前端 233, 有这时间学什么不好
    Exin
        21
    Exin  
       2017-05-23 15:32:16 +08:00
    噗嗤
    exoticknight
        22
    exoticknight  
       2017-05-23 15:35:36 +08:00
    @gouflv 噗嗤
    Phariel
        23
    Phariel  
       2017-05-23 15:49:09 +08:00 via Android
    自认为比制定规则者聪明系列
    rozbo
        24
    rozbo  
       2017-05-23 15:50:23 +08:00
    我是个好女孩,你们应该珍惜。
    qdwang
        25
    qdwang  
    OP
       2017-05-23 15:59:09 +08:00
    @xilixjd 不仅仅是增加了学习成本,更重要的是它允许这样做。
    qdwang
        26
    qdwang  
    OP
       2017-05-23 15:59:32 +08:00
    @jtsai
    qdwang
        27
    qdwang  
    OP
       2017-05-23 16:00:34 +08:00
    @rozbo 大家都很珍惜,楼上那么多喷我的,都热烈的爱着这个女孩呢
    Artists
        28
    Artists  
       2017-05-23 16:01:36 +08:00
    似乎自然语言才能勉强算是个好语言?
    royzxq
        29
    royzxq  
       2017-05-23 16:05:18 +08:00
    连喷点都找不到么, 我帮你找一个好吧 2.1 / 0.3
    Arrowing
        30
    Arrowing  
       2017-05-23 16:05:28 +08:00
    我觉得没什么好讨论的,喜欢就多用点,不喜欢就少用点
    但是,你能不用吗?
    qdwang
        31
    qdwang  
    OP
       2017-05-23 16:07:34 +08:00
    @Arrowing 等 wasm 支持 DOM, Web API 就可以不用了
    polariszc
        32
    polariszc  
       2017-05-23 16:11:37 +08:00   ❤️ 2
    @royzxq 你才是找不到喷点吧。。这是 IEEE 的浮点数规范导致的精度问题,哪个语言都有这个问题。
    royzxq
        33
    royzxq  
       2017-05-23 16:12:33 +08:00   ❤️ 1
    ```
    <?php
    echo null >= false && null <= false && null !== false;
    ```

    try it
    royzxq
        34
    royzxq  
       2017-05-23 16:14:12 +08:00
    @polariszc 然而这个问题在实际环境中会带来困扰, 题主的代码不会。 这才是关键
    jtsai
        35
    jtsai  
       2017-05-23 16:31:39 +08:00
    题主别噗,我挺喜欢 js 的,写起来挺嗨的
    solee
        36
    solee  
       2017-05-23 16:41:47 +08:00
    我就呵呵一下
    tyfulcrum
        37
    tyfulcrum  
       2017-05-23 16:55:52 +08:00   ❤️ 17
    YvesX
        38
    YvesX  
       2017-05-23 16:59:48 +08:00
    @tyfulcrum 笑出声
    zoffy
        39
    zoffy  
       2017-05-23 17:17:28 +08:00
    js 的 literal 表达式还是 hin 方便的
    prccn
        40
    prccn  
       2017-05-23 17:20:14 +08:00   ❤️ 4
    1. 希望看完 ES6 ES2016 和 ES2017 的草案再说话;
    2. 不管你是使用什么语言的开发者,这种妄言让你显得都很 low ;
    3. 看到大家都在给你普及 js 基础就放心了;
    4. 忠告:以后发这种帖记得贴上 github 账号
    enenaaa
        41
    enenaaa  
       2017-05-23 17:33:09 +08:00
    谁来告诉我, 为啥有 undefined 还要 null, 有了 null 还要 undefined。
    iugo
        42
    iugo  
       2017-05-23 17:42:01 +08:00
    说的别的:

    我记得之前看 "漫画家" 的文章说 WebAssembly 是为了解决性能问题, 不是为了革 JS 的命.
    qdwang
        43
    qdwang  
    OP
       2017-05-23 17:56:41 +08:00
    @iugo

    当 WebAssembly 可以解决所有问题的时候,JS 就会变成浏览器二等公民了,慢慢就可以把它淘汰了。
    iugo
        44
    iugo  
       2017-05-23 17:59:19 +08:00
    @qdwang 这目标挺远的, 至少比 web components 远.
    qdwang
        45
    qdwang  
    OP
       2017-05-23 18:00:14 +08:00
    @tyfulcrum 我就是那这里面的来举例子的
    qdwang
        46
    qdwang  
    OP
       2017-05-23 18:02:02 +08:00
    @iugo 目标虽远,但是终有达到的一天。
    qdwang
        47
    qdwang  
    OP
       2017-05-23 18:04:06 +08:00
    @Artists 当然不是,自然语言那么多歧义,是非常不好的编程语言。好的编程语言最起码需要有 well defined type system
    chairuosen
        48
    chairuosen  
       2017-05-23 18:05:27 +08:00
    @enenaaa null 是有语意的空,undefined 是没语意的
    sirm2z
        49
    sirm2z  
       2017-05-23 18:08:02 +08:00
    我觉得淘汰不可能,浏览器是个特殊的环境,它需要保持向前兼容,不可能有技术革新,就瘫痪掉一批网站。

    用户才是王道,浏览器有这么多,只要不是同时全部抛弃了旧的网站,这门语言就有生存的必要
    qdwang
        50
    qdwang  
    OP
       2017-05-23 18:09:49 +08:00
    @sirm2z 淘汰的意思是,开发使用新的语言和开发环境,不是说不兼容老的代码
    windfarer
        51
    windfarer  
       2017-05-23 18:10:03 +08:00
    sirm2z
        52
    sirm2z  
       2017-05-23 18:24:27 +08:00
    @qdwang #50 其实根据现在开发人员的技术水平,我觉的重新整出一套新的语言,并且优于 js 是很容易的

    但是比较一下推广成本,开发人员的接受率,大厂的使用率,这样看来基本上是一个出力不讨好的事情

    只能说淘汰 js 很难,它的势头很猛,这是不能否认的,亲爹干爹也多,大家都乐于去在它基础上完善(填坑)

    我想是有一定道理的,浏览器( js 的运行环境)毕竟有多家,他们本身就在博弈

    我觉得要他们再兼容新的语言的运行环境,不是易事
    Clarencep
        53
    Clarencep  
       2017-05-23 18:37:56 +08:00
    所以说坐等 webassembly 普及,然后各种语言都可以编译成 webassembly 跑在浏览器里面。。。
    qdwang
        54
    qdwang  
    OP
       2017-05-23 18:45:07 +08:00
    @sirm2z

    我觉得不需要造一个新的语言,基于现有高质量的好的语言编译到 wasm 就可以了。
    推广肯定是该这些社区自行推广的,成本不高。

    淘汰 js,要从下一代程序员开始。就像现在入门的人,可以直接用 typescript 一样。再下一代的前端程序员,可以直接用其他更好的语言来开发网页程序。
    qdwang
        55
    qdwang  
    OP
       2017-05-23 18:45:33 +08:00
    @Clarencep 没错~
    lxy
        56
    lxy  
       2017-05-23 18:59:14 +08:00
    弱类型以及隐式转换,js 里很多这种反直觉的东西。
    很多人眼里,可解释 == 可接受,类似于 It's not a bug, it's a feature 的说法。
    问题的关键是用户是否需要这种 “ feature ”?
    buseni
        57
    buseni  
       2017-05-23 19:13:35 +08:00
    JS 真是第一大语言
    sirm2z
        58
    sirm2z  
       2017-05-23 19:29:06 +08:00
    @qdwang 我查了下,目前只有一种方式能调用 wasm 里提供的接口,就是用 javascript !

    所以我觉得 WebAssembly 更适合用于写模块,承接各种复杂的计算

    如图像处理、3D 运算、语音识别、视音频编码解码这种工作,主体程序还是要用 javascript 来写的
    fzhw88
        59
    fzhw88  
       2017-05-23 19:32:45 +08:00
    这些都是语言的规范里面明确写着的,强制类型转化的规则……你那每一项转成数字都是 0,这有什么好喷的,每种语言都会有它自己的规范。
    fzhw88
        60
    fzhw88  
       2017-05-23 19:34:15 +08:00
    [[0]],还是 0
    kimown
        61
    kimown  
       2017-05-23 19:37:13 +08:00 via Android   ❤️ 2
    这东西没用的,如果项目里面有人写这样的代码,肯定拉他过去批一顿,写代码是要抱有一种用最简单,别人一看就懂的思路去写,写复杂的代码太简单了,但是要写出别人一看就懂的代码,那就是改改改,重构重构再重构
    Jeter
        62
    Jeter  
       2017-05-23 19:45:02 +08:00
    @qdwang 君不见 jvm 语言何其多,Java 语法有多啰嗦,然后 Java 已死???
    visonme
        63
    visonme  
       2017-05-23 19:49:59 +08:00
    如果觉得 js 不好可以选择 ts,作为 MS 深度用户,我也是很提倡永 TS 的,但是我大多数的工作还是用 js ( nodejs )完成了。

    对 WebAssembly 接触不深,不敢说太多,但在有限的接触中,我对 WebAssembly 的理解是,强壮 JS 而不是为了革 js 的命,不知道楼主是否认同我这个观点?

    所以说让 wasm 革命 js 是不是有点太直觉化了。
    maomaomao001
        64
    maomaomao001  
       2017-05-23 20:09:35 +08:00 via Android
    能不能找一个,实际使用过程中的,不如别的语言的点来黑,你这样黑点都找不到乱黑,你觉得合适吗????
    Jeter
        65
    Jeter  
       2017-05-23 20:11:52 +08:00
    @yoa1q7y 没错,楼主应该去学学 C/C++(都是强类型语言),然后玩一玩这两门语言的类型提升或者截断转换,指针间的互相转换,直到它的 C/C++代码 core dump 到楼主吹胡子瞪眼睛之后才会想起 js 有多友好。。。
    blahgeek
        66
    blahgeek  
       2017-05-23 20:50:45 +08:00
    [0, 1, -2, -1].sort()
    Em5O7B1JGfjQnBry
        67
    Em5O7B1JGfjQnBry  
       2017-05-23 21:36:39 +08:00 via Android
    @Jeter 你看看 JavaScript 是什么时候诞生的,C 又是什么年代诞生的,再去看看 BS 为什么需要 C++要兼容 c 的那些东西,以及为什么有时候这些底层的东西为什么会这样,你这样举例完全就是扯淡,还有强弱类型这个概念有点乱,从类型系统的角度来说,C/C++不是强类型应该比较合适
    guokeke
        68
    guokeke  
       2017-05-23 22:41:31 +08:00
    某天,v2 上又出现了 ‘ WebAssembly 是个好...云云’
    4641585
        69
    4641585  
       2017-05-23 22:49:16 +08:00
    @royzxq 我很好奇看到浮点数为什么会意识不到精度问题?大学不止一门课讲过吧,计算机入门读物里也都有吧。
    darklowly
        70
    darklowly  
       2017-05-23 23:01:51 +08:00   ❤️ 1
    @qdwang 在这前端火热的年代,我一直以为就我一个人讨厌 js..


    @Jeter 乱说。C,C++类型问题,可以在半小时内记住,并且很少犯错,其实规律很简单。JS 这 SB 随时要提防着,一不小心,就要上天。还有什么指针问题,野指针,内存泄漏,coredump 等,是语言层级不一样,这个不能拿来类比。人家 C,C++可以直接操作内存地址,甚至,如果内存地址是 io 地址,可以直接操作硬件,70 年代的产物,对于老手来说只能看成是汇编的语法糖,外加语法检测而已。


    @svenFeng 算上语法检测,不乱搞的情况下,基本上算是静态语言。JS 不乱搞,都害怕出错,写一行代码,要检查 3 遍。
    hxtheone
        71
    hxtheone  
       2017-05-23 23:20:44 +08:00
    @royzxq #29 浮点数精度问题, 这也能喷?
    chunqiuyiyu
        72
    chunqiuyiyu  
       2017-05-23 23:51:40 +08:00
    我越来越喜欢 JavaScript 了,尤其是现在的 ES6 语法,写起来太爽了
    Jeter
        73
    Jeter  
       2017-05-23 23:58:03 +08:00
    @darklowly 好吧,我没说明白,我是想说,C/C++在使用时总是会碰到隐式转换的问题,而且因为它直接操作内存,很多问题 core dump 解决后还需要重新编译构建,对于前端这种需要快速开发的场景很不友好。。而楼主他试图通过“ well defined type system ”的语言编译成 wasm,去避免他帖子里提到的 JS 语言设计问题(然而这些值转换都已经成为标准了),而 C/C++只是我举的一个 [不适合前端] 这个开发场景的例子,来反驳楼主的上述观点。。。确实,JS 的值转换相对很多语言相当 SB (但是已经写入标准了),所以,如果没有能力去改变 JS 这种窘状的话,就去把标准看清楚再来讨论。。。
    WENLIANG29
        74
    WENLIANG29  
       2017-05-24 06:00:07 +08:00
    老铁,发这种引战帖没什么意思。JS 固然有很多历史上语言设计的弊端,它也有它的优势,况且语言设计也在慢慢变好。PHP 不也总有人骂么,PHP7 和 PHP-JIT 带来的提升也很大。你总揪着历史缺点不放没意思,而且还是这种老掉牙的喷法。有空不如多写几行代码 -。- (建议你去看一下 Mozilla 核心工程师 Lin Clark 的这篇文章再来说什么 WASM 淘汰 JS 的事 https://hacks.mozilla.org/2017/02/a-cartoon-intro-to-webassembly/) DOM、BOM、Accessibility 等等都是问题。
    Ahri
        75
    Ahri  
       2017-05-24 07:38:45 +08:00
    Java 程序员都是好程序员(滑稽
    qdwang
        76
    qdwang  
    OP
       2017-05-24 07:44:59 +08:00 via iPhone
    @sirm2z 嗯 目前是这样 以后怎么样说不准呀
    Cbdy
        77
    Cbdy  
       2017-05-24 08:32:34 +08:00 via Android
    @Jeter c/c++这两个都是弱类型语言。。。
    sagaxu
        78
    sagaxu  
       2017-05-24 08:53:25 +08:00
    语法丑陋没关系,反正不写原生 js,我都是用其它语言写了编译成 js 用
    enenaaa
        79
    enenaaa  
       2017-05-24 09:16:29 +08:00
    @chairuosen 空不就是未定义么。java 也有 null, 其他语言还有 nil, None, nullptr,叫啥都行。 但谁特么搞两个,神经病啊。
    chenyu0532
        80
    chenyu0532  
       2017-05-24 09:16:56 +08:00
    笑看楼主被喷、、
    caniuse
        81
    caniuse  
       2017-05-24 09:17:26 +08:00
    JavaScript 是最好的语言
    jlyybz
        82
    jlyybz  
       2017-05-24 09:19:28 +08:00
    我觉得 js 真不错 ~
    chairuosen
        83
    chairuosen  
       2017-05-24 09:30:51 +08:00
    @enenaaa 明确的告诉你没有,和没告诉你有没有,一样么?
    awesomes
        84
    awesomes  
       2017-05-24 09:31:26 +08:00
    人家 JS 之父都说了,wasm 是让 JS 更强,不是取代 JS,你想太多了
    Cbdy
        85
    Cbdy  
       2017-05-24 09:46:15 +08:00
    @sagaxu 但是其他语言怎么操作 dom 么?
    lijsh
        86
    lijsh  
       2017-05-24 09:49:10 +08:00
    2017 年了还有人在搞这种无谓的语言鄙视,用的还是平时很难遇到的 edge case,楼主有空干点啥不好。
    qdwang
        87
    qdwang  
    OP
       2017-05-24 09:49:47 +08:00
    @Cbdy 类似 BuckleScript 可以在编译的时候增加一些语言特性,来编译成操作 dom 的 js 指令
    solidsnake
        88
    solidsnake  
       2017-05-24 09:49:54 +08:00 via iPhone
    你也挺滑稽的
    sagaxu
        89
    sagaxu  
       2017-05-24 09:51:40 +08:00
    @Cbdy 直接操作啊,原生 js 能调用的库和方法,其他语言都能调
    ajan
        90
    ajan  
       2017-05-24 09:55:37 +08:00
    楼主自己来造一种语言吧! 我看好你
    gjerryfe
        91
    gjerryfe  
       2017-05-24 10:01:15 +08:00 via iPhone   ❤️ 1
    楼主提出一个问题,楼上各位开始各种人身攻击,可见各位的自尊心 成熟感已经负值
    issues
        92
    issues  
       2017-05-24 10:01:51 +08:00
    js 的框架能影响语言本身<逃
    MushishiXian
        93
    MushishiXian  
       2017-05-24 10:06:32 +08:00
    还在鄙视语言的人到底有多 low......又不是没有往好的方向发展,与其去鄙视,还不如先提高自己水平吧
    yanzixuan
        94
    yanzixuan  
       2017-05-24 10:07:41 +08:00
    在 js 基础上搞得 es 虽然是补漏洞,但是新人上手就有点郁闷了,不能知其然不知其所以然。。
    wly19960911
        95
    wly19960911  
       2017-05-24 10:23:10 +08:00 via Android
    就这就叫缺点?

    +[]

    看看结果是什么。说实话揪着语言这些问题不放不太好。平常没人用这种写法,感觉就是面试笔试题刁难人,有谁敢写这种估计已经被打死了
    Halomaple
        96
    Halomaple  
       2017-05-24 10:53:23 +08:00
    谁告诉你 Boolean(false) 结果是 true 了? Boolean('false') 和 Boolean(false)都分不清楚就来引战?
    Halomaple
        97
    Halomaple  
       2017-05-24 10:54:42 +08:00
    @popu111 楼主连基本的类型转换都分不清楚,也没验证就来引战了
    topgrd
        98
    topgrd  
       2017-05-24 10:58:18 +08:00
    WebAssembly 是不会革了 JS 的命的,之后的发展更可能是两者各用于擅长的地方,在 web 中两者同时存在,虽然 JavaScript 槽点很多,但不是正在向好的方向发展么?
    Halomaple
        99
    Halomaple  
       2017-05-24 11:01:13 +08:00
    learnshare
        100
    learnshare  
       2017-05-24 11:08:05 +08:00
    我现在更推荐直接上 TypeScript,忘掉 JavaScript
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2813 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 09:21 · PVG 17:21 · LAX 01:21 · JFK 04:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.