我学习 Javascript 的第一个程序完成了,欢迎围观 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mathzhaoliang
V2EX    分享发现

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

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

    演示地址 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     Solana     5833 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 03:28 PVG 11:28 LAX 20:28 JFK 23:28
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86