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

我学习 Javascript 的第一个程序完成了,欢迎围观

  •  
  •   mathzhaoliang · 2018-10-15 08:54:23 +08:00 · 2780 次点击
    这是一个创建于 2230 天前的主题,其中的信息可能已经有所发展或是发生改变。

    演示地址 https://neozhaoliang.github.io/wilson/index.html

    代码在 https://github.com/neozhaoliang/pywonderland/tree/master/src/gifmaze/js

    这个动画演示的是一个迷宫生成算法,它的特点是在所有迷宫(生成树)里面以相等的概率随机选一个

    我是上周二左右开始看 js 语法的,到了昨晚终于折腾出来了第一个正式的程序,以前有 C 和 Python 的基础,这个程序本身也用 python 实现过,所以对我来说不算很难。主要花的时间在理解 canvas 的 requestAnimationFrame 的调用机制上。

    很多人说:一个合格程序员应该具有 xx 天内掌握一门新语言的能力。我感觉这话应该表述为 "应该具有 xx 天内掌握一门新语言的基础语法" 的能力。这个程序踩的坑有:

    1. 比较两个数组 [0, 1] == [0, 1] 返回的是 false.
    2. 如果一个变量 a 未初始化则 a == null 返回的是 true. (得用 a === null)

    我 debug 的方法也很笨,就是写一个 html 调用这个 js 代码,在代码里面加上很多 console.log 语句,然后在 chrome 的控制台里面查看输出。

    9 条回复    2018-10-15 11:51:35 +08:00
    dingxi
        1
    dingxi  
       2018-10-15 09:17:49 +08:00
    很 nice 啊,学习下
    98jiang
        2
    98jiang  
       2018-10-15 10:01:47 +08:00
    请问一下这个是自己想的吗? 或者说是在哪里看到的呢,也想学一下
    Exia
        3
    Exia  
       2018-10-15 10:08:29 +08:00
    赞,比较两个数组是否相同,假如都是一维数组,且都是数字,先将数组里面排序,然后都转字符串比较就好了,如果里面还有别的内容,如 object,多维数组就麻烦些。
    darkkylin
        5
    darkkylin  
       2018-10-15 10:28:17 +08:00
    第一个坑点不算是坑吧,两个数组,不能说因为数组内两个元素“相等”就判断它们是“相等数组”,其他语言不清楚,c 语言好像也是这样的结果。
    第二个坑点初始化未赋值,则自动赋值为 undefined,javascript 存在双等号和三等号,而双等号比较的时候,如果等号两侧数据类型不同会进行隐式转换(造成宽松相等,比如 1 == true 结果为 true ),javascript 语法中,null == undefined 结果为 true,null === undefined 结果为 false。如果对 js 的隐式类型转换没信心的,比较的时候可以用 “===” 就能避免这个坑点了。
    mathzhaoliang
        6
    mathzhaoliang  
    OP
       2018-10-15 10:33:48 +08:00
    @darkkylin 在 python 里面因为 list 有 __eq__ 方法,所以 a = [0, 1] 和 b = [0, 1] 的话则 a == b 返回 true.
    我刚切换到 js 的时候以为 js 也能这么写,结果 debug 的时候费了半天劲才发现 js 返回的是 false.

    第二个坑我认为是 js 的设计缺陷。
    hucheng91
        7
    hucheng91  
       2018-10-15 10:48:02 +08:00 via Android
    第二个还真不是 bug,js 有套自己的隐式转换
    mathzhaoliang
        8
    mathzhaoliang  
    OP
       2018-10-15 10:54:50 +08:00
    @hucheng91 问题是这些隐式转换规则不好记忆,又不是语言所必须的。很多人津津乐道诸如 `++[[]][+[]]+[+[]]==10?` 之类的 fancy 的东西 ,将其作为 "掌握技巧“ 和 "成为老手" 的必要条件。可这跟写出良好的程序有帮助吗?

    == 运算需要隐式转换一次,所以在用之前每个人都要记忆转换规则才行。这万一过几年语言标准变了呢?万一手残该用 === 的时候写成==了呢?这些麻烦本来都不是必要的啊?
    lrz0lrz
        9
    lrz0lrz  
       2018-10-15 11:51:35 +08:00
    @mathzhaoliang #8 这是历史遗留问题,默认用 === 就可以了。
    这些东西的确不必要,不过不要对一个单人 10 天搞出来的语言期望过高呀。
    我猜当初搞隐式转换只是为了简单,没想那么多。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1911 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:16 · PVG 00:16 · LAX 08:16 · JFK 11:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.