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

Eli*_*gem 5 javascript cross-browser variable-assignment logical-operators

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;
}
Run Code Online (Sandbox Code Playgroud)

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

while((step > 0 && eCode >= (sCode+=step)) || (step < 0 && eCode <= (sCode+=step)));
Run Code Online (Sandbox Code Playgroud)

由于函数的行为与我想要的一样,我认为我说得对,如果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方法,为什么,确实(''+from).charCodeAt(0);返回U所有相同的?我以为它隐含地称为toString方法?

Jam*_*ice 2

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

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

当步骤检查为真后,sCode 将递增/递减。我将此分配放在括号中,以确保将新分配的 sCode 值与 eCode 进行比较。再次,我假设括号将优先考虑赋值而不是逻辑运算符。

再次正确,但赋值两边的括号是必需的,因为赋值的优先级低于比较。

对于所有浏览器都是如此吗?

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

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

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