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

关于 JavaScript 的 while 循环

  •  
  •   cc7756789 · 2015-07-05 10:49:01 +08:00 · 3978 次点击
    这是一个创建于 3465 天前的主题,其中的信息可能已经有所发展或是发生改变。
    function* fib(max){
        var
            t,
            n = 1,
            a = 0,
            b = 1;
        while ( n<max ){
            yield a;
            t = a+b;
            a = b;
            b = t;
            n++;
        }
        return a;
    }
    

    而Python可以直接这么粗暴的写

    def fib(nmax=None):
        nmax = nmax or 10
        n, a, b  = 0, 0, 1
        while n < nmax:
            yield a
            a, b = b, a+b
            n += 1
    

    然后把我搞晕了,我都不会写fibonacci了,为什么JS还需要个临时变量t, 如果 a, b = b, a+b结果是不正确的,然后为什么在循环体外还需要return返回最后的结果

    22 条回复    2015-07-14 10:35:40 +08:00
    FrankFang128
        1
    FrankFang128  
       2015-07-05 10:52:27 +08:00 via Android
    你用 python 不就好了。你推动各大浏览器厂商改进JS语法也可以哦。
    zonghua
        2
    zonghua  
       2015-07-05 10:56:08 +08:00
    好厉害,斐波那契都会算哦
    cc7756789
        3
    cc7756789  
    OP
       2015-07-05 10:57:21 +08:00
    额,没有攻击语言的意思,只是搞不懂内部的原理。
    loading
        4
    loading  
       2015-07-05 10:58:53 +08:00
    看下 go ,只有 for ,也挺好的。
    laurent
        5
    laurent  
       2015-07-05 11:06:17 +08:00
    JavaScript初始化的n是1,python是0,所以最后要return
    JavaScript好像是不支持多返回值,所以需要用临时变量t
    pH
        6
    pH  
       2015-07-05 11:13:26 +08:00
    小白,为什么function后面有个*
    Garwih
        7
    Garwih  
       2015-07-05 11:19:53 +08:00
    不用临时变量你可以这么写:
    b = a + b;
    a = b - a;
    sciooga
        8
    sciooga  
       2015-07-05 11:21:00 +08:00

    这样就不用 t 了
    sciooga
        9
    sciooga  
       2015-07-05 11:22:26 +08:00
    little_cup
        10
    little_cup  
       2015-07-05 11:23:30 +08:00
    也不能要求各个语言都有这样类似py元组的语法糖呀……
    ispinfx
        11
    ispinfx  
       2015-07-05 11:25:13 +08:00
    为什么nmax不直接写默认值?
    vv314
        12
    vv314  
       2015-07-05 11:31:59 +08:00
    javascript与Python语法是有区别的,
    在js里如果“a, b = b, a+b”这样写,相当于执行了三条语句:
    a;
    b = b;
    a + b;
    adspe
        13
    adspe  
       2015-07-05 11:48:11 +08:00 via Android
    @pH 生成器语法
    keyanzhang
        14
    keyanzhang  
       2015-07-05 11:55:16 +08:00
    用 ES6 就可以和 Python 写得一样:
    mangocool
        15
    mangocool  
       2015-07-05 11:56:46 +08:00
    会写scala么
    des
        16
    des  
       2015-07-05 14:15:08 +08:00
    @keyanzhang firefox对ES6支持最全吧
    keyanzhang
        17
    keyanzhang  
       2015-07-05 15:28:24 +08:00
    @des 用 babel 编译。
    zhuangzhuang1988
        18
    zhuangzhuang1988  
       2015-07-05 16:52:45 +08:00
    试试Coffeescript!!!
    imn1
        19
    imn1  
       2015-07-05 17:46:47 +08:00
    你应该先了解 python 的
    a, b = b, a+b
    实际上是 (a, b) = (b, a+b) 元组省略括号的写法
    看上去像是其他语言swap函数,但实际上不是
    hayao650
        20
    hayao650  
       2015-07-06 10:15:30 +08:00
    @pH 那个是generator
    mingyun
        21
    mingyun  
       2015-07-12 20:25:25 +08:00
    @keyanzhang 求网址 浏览器不支持运行es6
    keyanzhang
        22
    keyanzhang  
       2015-07-14 10:35:40 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2580 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 03:10 · PVG 11:10 · LAX 19:10 · JFK 22:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.