JavaScript';s控制流构造:特定于浏览器或JS固有
我在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
范围函数。我已经在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)));