5

range在 JS 中组合了一个小函数。我已经在 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为假,&& eCode >= (sCode+=step)将被忽略,保持值sCode不变。
step检查为真时,sCode将减少/减少。我已将此分配放在括号中,以确保将新分配的值sCodeeCode. 同样,我假设括号将优先于逻辑运算符的赋值。

对于所有浏览器都是如此,还是在某种程度上特定于浏览器?在某些浏览器中,这个函数是否有可能增加(或减少)sCode两倍的值?
在这种情况下,它并不那么重要(这是防止任何问题的简单修复)。但我想知道这种行为是 JavaScript 本身固有的,还是浏览器实现固有的。


感谢您阅读本文。如果您不介意
其他几件事(不重要,只是想知道):

  • JavaScript 中的最大 charCode 是多少?谷歌上的快速浏览并没有告诉我,在 JS 控制台中的测试让我相信这5999999999989759似乎几乎令人难以置信,但我可能需要再次复习我的中文。
  • from未定义时,(jslint 批准)方法from.toString().charCodeAt(0);失败,因为显然undefined没有toString方法,为什么(''+from).charCodeAt(0);返回U都一样?我认为它隐含地调用了该toString方法?
4

2 回答 2

2

对于 ECMAScript 的所有正确实现,运算符的行为是一致的。我不知道有任何浏览器实现与您所描述的不同。

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

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

于 2012-06-22T15:29:17.203 回答
2

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

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

当步骤检查为真后,sCode 将被输入/递减。我已经将这个赋值放在括号中,以确保将新分配的 sCode 值与 eCode 进行比较。同样,我假设括号将优先于逻辑运算符的赋值。

再次更正,但赋值周围的括号是必需的,因为赋值的优先级低于比较。

这适用于所有浏览器吗?

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

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

因为它将值from与空字符串连接起来。fromis的值undefined,它被强制转换为 string,最终得到字符串“undefined”,并且该字符串索引 0 处的字符是“u”。

于 2012-06-22T15:31:57.983 回答