JavaScript 的控制流构造 : browser specific or inherent to JS

标签 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;
}

我记得前一段时间在这里读到一个关于 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将在/递减。我将此赋值放在括号中,以确保新分配的值 sCode将与 eCode 进行比较.同样,我假设括号将优先于逻辑运算符进行赋值。

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


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

  • JavaScript 中的最大 charCode 是多少?快速浏览一下谷歌并没有告诉我,在 JS 控制台中的测试让我相信这是 5999999999989759这看起来几乎不可思议,但话又说回来,我可能需要温习一下我的中文。
  • 何时from未定义,(jslint 批准的)方法 from.toString().charCodeAt(0);失败,因为很明显,undefined没有toString方法,为什么,(''+from).charCodeAt(0);返回 U全都一样?我认为它隐含地称为 toString方法?

最佳答案

I think I'm right in saying that, if step < 0 is false, && eCode >= (sCode+=step) will be ignored, leaving the value of sCode unchanged

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

After when the step check is true, sCode will be in/decremented. I've but this assignment in brackets, to be sure that the newly assigned value of sCode will be compared to eCode. Again, I assume that the brackets will give priority to the assignment over the logical operator.

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

Is this true for ALL browsers?

是的。如果您发现一个行为不是这样的,我会非常惊讶。

When from is undefined, the (jslint approved) approach from.toString().charCodeAt(0); fails, because obviously, undefined had no toString method, why the, does (''+from).charCodeAt(0); return U all the same?

因为它连接了 from 的值用空字符串。 from 的值是undefined ,即 coerced to a string ,最后得到字符串“undefined”,该字符串索引 0 处的字符是“u”。

关于JavaScript 的控制流构造 : browser specific or inherent to JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11159234/

相关文章:

javascript - 使用 Javascript 的 HTML 中两个字段的区别

Javascript/CSS 图像高度/宽度/边距计算不会同时生效

python - Python 中的这种赋值叫什么? a = b = 真

java - CPP 如何在 unsigned int 值中使用 boolean 值?

javascript - 自动加载无限滚动,一次又一次地显示最后一项

javascript - 更改滚动条上的 div 背景颜色

CSS 边框图像渐变在 Safari 5.1.7 中不起作用

css - 处理不能正确执行 SVG 的浏览器 : best way to redirect/load different css/show redirection link?

Javascript 不适用于 PS3 浏览器

mysql - procedure 参数是 int,但是当使用 double 调用 procedure 时,它​​会编译