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

JavaScript';s控制流构造:特定于浏览器或JS固有,javascript,cross-browser,variable-assignment,logical-operators,Javascript,Cross Browser,Variable Assignment,Logical Operators,我在JS中集成了一个小的范围函数。我已经在Chrome19、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).charC

我在JS中集成了一个小的
范围
函数。我已经在Chrome19、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;
}

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

这是否适用于所有浏览器,或者在某种程度上是特定于浏览器的?在某些浏览器中,此函数是否有可能将
sCode
的值增加(或减少)两次?
在这种情况下,这并不重要(这是一个很容易解决问题的方法)。但我想知道这种行为是JavaScript本身固有的还是浏览器实现固有的


谢谢你往下看。如果你不介意的话
还有几件事(不重要,只是想知道):

  • JavaScript中的最大字符数是多少?快速浏览一下google并没有告诉我,在JS控制台中进行的测试让我相信这是
    5999999989759
    ,这似乎难以置信,但我可能需要再次温习一下我的中文
  • from
    未定义时,(jslint批准的)方法
    from.toString().charCodeAt(0)
    失败,因为显然,
    undefined
    没有
    toString
    方法,为什么,
    (''+from).charCodeAt(0)返回
    U
    都一样吗?我认为它隐式地调用了
    toString
    方法
对于ECMAScript的所有正确实现,操作符的行为都是一致的。我不知道有任何浏览器实现与您所描述的不同

ECMAScript是由标准定义的

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


如果
步骤<0
为假,
和&eCode>=
(sCode+=step)
将被忽略,保持
sCode的值不变

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

当步骤检查为真后,sCode将进入/递减。我已经 但此分配在括号中,以确保新分配的 sCode的值将与eCode进行比较。我再次假设 括号中的赋值优先于逻辑赋值 接线员

请再次更正,但赋值周围的括号是必需的,因为赋值的值大于比较值

所有浏览器都是这样吗

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

中的
未定义时,(jslint批准的)方法
from.toString().charCodeAt(0)失败,因为显然,未定义的
没有
toString
方法,为什么,does
(''+from).charCodeAt(0)返回U
还是那样


因为它将来自
值与空字符串连接起来。来自
的值是
未定义的
,也就是说,最后是字符串“未定义”,该字符串索引0处的字符是“u”。

“如果
步骤<0
为假…”我想你的意思是
步骤<0
编辑我的评论:好问题。我在这方面遇到了问题/麻烦(也许我发布了你提到的原始问题)。我记得做过很多测试。我要看看我是否能在JS规范中找到这些信息。@taz,不。。。很抱歉,但我在周五很难集中精力:我的意思是,当逻辑检查的第一部分(即
步骤<0
)计算结果为false时,第二部分
eCode>=…
将被忽略。值为
的示例,而((-1>0&&3>=(15+=-1))| |…
零件
&&3>=(15+=-1)
将被忽略,因为
-1>0
无论如何都是假的我实际上没有看到任何短路评估规范(请参阅)我记得几年前的想法是,我发现这种行为在不同浏览器中并不一致,但我不记得结果是什么。@taz:我做了一些进一步的挖掘:结果是(来源和)JavaScript没有急切的操作符,只有短路,所以我不知道什么时候可能会遇到不一致的行为,但我得到了ecmascript标准文档并将其标记为书签,以供将来参考。就我而言,我得到了我的答案:)ECMAScript中提到过这一点吗?我指的是短路evaluation@taz:是的,ECMAScript完全描述了运算符的行为。谢谢你,詹姆斯。但是,在这一方面,要注意连接
from
:from的值未定义,并且没有
toString
方法,但是它的值被转换为字符串。我想这只是JS的一个怪癖,我有点希望一个未定义/未初始化的变量表现为
null
,并在转换为空字符串时返回一个空字符串。@EliasVanOotegem-未定义的
undefined
类型被转换为字符串“undefined”。事情就是这样。查看规范链接:我知道这一点,但您提供的链接显示了
ToString
操作的所有结果。我只是说了一个事实,奇怪的是,他们没有提供一个值的方法,这个值可以使用(稍微难看的)变通方法转换为字符串。老实说,我甚至想称之为黑客
while((step > 0 && eCode >= (sCode+=step)) || (step < 0 && eCode <= (sCode+=step)));