JavaScript控制流构造:特定于浏览器或JS固有的

时间:2012-06-22 15:23:39

标签: javascript cross-browser variable-assignment logical-operators

我在JS中放了一个小range函数。我已经在Chrome 19,FF和IE(7-9)中测试了它并且它运行良好。我的问题与while声明有关。

function range(from,to,step)
{
    'use strict';
    var sCode,eCode,result;
    result = [];
    step = (!step || isNaN(step) || step === 0 ? 1 : step);
    sCode = (''+from).charCodeAt(0);
    eCode = (''+to).charCodeAt(0);
    step *= (sCode > eCode && step > 0 ? -1 : 1);
    do
    {
        if (String.fromCharCode(sCode))
        {
            result.push(String.fromCharCode(sCode));
        }
    }while((step > 0 && eCode >= (sCode+=step)) || (step < 0 && eCode <= (sCode+=step)));
    return result;
}

我记得在这里回答JS处理控制流构造和逻辑运算符的问题。我认为它与检查某个对象是否有某种方法有关,如果有,则使用它的返回值(if (event.returnValue && e.returnValue === true)种类的东西)。
我似乎无法找到任何问题更多,这是我想知道的:

while((step > 0 && eCode >= (sCode+=step)) || (step < 0 && eCode <= (sCode+=step)));

由于该函数的行为符合我的要求,我认为我说的是,如果step < 0为false,&& eCode >= (sCode+=step)将被忽略,保留sCode的值不变。
step检查为真时,sCode将进/出。我已将此分配放在括号中,以确保将新分配的sCode值与eCode进行比较。同样,我假设括号将优先于逻辑运算符的赋值。

这对于所有浏览器是否属实,或者某种程度上是浏览器特定的?在某些浏览器中,此函数是否有可能两次递增(或递减)sCode的值?
在这种情况下,它并不重要(它可以很容易地解决任何问题)。但我想知道这种行为是否是JavaScript本身或浏览器实现所固有的。


感谢您阅读这篇文章。如果你不介意
其他一些事情(不重要,但只是想知道):

  • JavaScript中的最大charCode是什么?快速浏览谷歌没有告诉我,在JS控制台测试让我相信这是5999999999989759,这看起来几乎令人难以置信,但我可能需要再次刷我的中文。
  • 未定义from时,(jslint已批准)方法from.toString().charCodeAt(0);失败,因为很明显,undefined没有toString方法,为什么会这样做{{1} } return (''+from).charCodeAt(0);都一样吗?我认为它隐含地称为U方法?

2 个答案:

答案 0 :(得分:2)

运算符的行为对于ECMAScript的所有正确实现都是一致的。我不知道任何浏览器实现偏离了你所描述的内容。

ECMAScript由标准定义。 http://ecmascript.org/

是的,括号将定义运算符的关联性。

答案 1 :(得分:2)

  

我认为我说得对,如果step < 0为假,&& eCode >= (sCode+=step)将被忽略,sCode的值保持不变

正确。如果第一个操作数的计算结果为false,则不会计算第二个操作数。

  

步骤检查为真后,sCode将进/出。我有   但是这个赋值在括号中,以确保新分配   sCode的值将与eCode进行比较。再说一遍,我认为   括号将优先考虑逻辑上的分配   操作

再次纠正,但是分配周围的括号是必需的,因为赋值有lower precedence而不是比较。

  

这适用于所有浏览器吗?

是。如果你找到一个不这样做的人,我会非常惊讶。

  

未定义from时,(jslint已批准)方法   from.toString().charCodeAt(0);失败,因为很明显,未定义了   没有toString方法,为什么(''+from).charCodeAt(0);会返回U.   都一样吗?

因为它将from的值与空字符串连接起来。 from的值为undefined,即coerced to a string,最后输入字符串“undefined”,该字符串的索引0处的字符为“u”。