Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firefox上Greasemonkey脚本中JavaScript中的类型强制和字符串连接问题_Javascript_Firefox_String_Greasemonkey_Type Conversion - Fatal编程技术网

Firefox上Greasemonkey脚本中JavaScript中的类型强制和字符串连接问题

Firefox上Greasemonkey脚本中JavaScript中的类型强制和字符串连接问题,javascript,firefox,string,greasemonkey,type-conversion,Javascript,Firefox,String,Greasemonkey,Type Conversion,我正在创建一个GreaseMonkey脚本来改进10k工具堆栈溢出使用的用户界面。我遇到了一个无法重现的、坦率地说很奇怪的问题,这让我和其他人都很困惑。之后我们还没有找到原因 可以找到有问题的脚本。- 问题出现在第85行,即“vodoo”注释后的那一行: return (t + ' (' + +(+f.offensive + +f.spam) + ')'); 这看起来可能有点奇怪,但是两个变量前面的+和内括号用于类型强制,中间的+用于加法,其他的用于连接 没什么特别的,但细心的读者可能会注意

我正在创建一个GreaseMonkey脚本来改进10k工具堆栈溢出使用的用户界面。我遇到了一个无法重现的、坦率地说很奇怪的问题,这让我和其他人都很困惑。之后我们还没有找到原因

可以找到有问题的脚本。-


问题出现在第85行,即“vodoo”注释后的那一行:

return (t + ' (' + +(+f.offensive + +f.spam) + ')');
这看起来可能有点奇怪,但是两个变量前面的
+
和内括号用于类型强制,中间的
+
用于加法,其他的用于连接

没什么特别的,但细心的读者可能会注意到,内括号上的类型强制是不必要的,因为两者都已经被类型强制为数字,并且当它们被连接到字符串中时,类型强制的结果是无用的。不是这样!删除
+
会破坏脚本,导致
f.officious
f.spam
连接在一起,而不是添加在一起

进一步添加
console.log
只会让事情变得更加混乱:

console.log(f.offensive + f.spam); // 50
console.log('' + (+f.offensive + +f.spam)); // 5, but returning this yields 50 somehow
console.log('' + (+f.offensive + +f.spam) + ''); // 50
资料来源:


问题是这是不可生产的-运行脚本,如

console.log('a' + (+'3' + +'1') + 'b');
在Firebug控制台中,会产生正确的结果

(function(){
    return 'a' + (+'3' + +'1') + 'b';
})();
即使取出大块代码并在控制台中运行它们也不会重现此错误:

$('.post-menu a[id^=flag-post-]').each(function(){
    var f = {offensive: '4', spam: '1'};
    
    if(f){
        $(this).text(function(i, t){
            // Vodoo - please do not remove the '+' in front of the inner bracket
            return (t + ' (' + +(+f.offensive + +f.spam) + ')');
        });
    }
});
聊天室里的蒂姆·斯通(Tim Stone)为10公里以下的人设计了一款手机


这个bug只出现在Firefox中-Chrome似乎没有出现这个问题,这让我相信这可能是Firefox的JavaScript引擎或Greasemonkey插件的问题。我说得对吗


如果您想了解更多详细信息和/或想对此进行讨论,可以在中找到我。

作为用户脚本过程的一部分,将
标记注入页面,其中的代码通过调用您定义的函数
toString()
检索。通常这是可以的,但Firefox 3.6.13使用的javascript引擎中似乎存在一个错误,它重新定位了表达式中的括号,导致在处理
toString()
-ified函数时以一种非常不同的方式对其进行计算

为了说明这个问题,我们可以在Firebug中运行以下代码:

function f() { var a = '', b = '1', c = '2'; return a + '(' + (+b + +c) + ')'; };
f.toString();
这为我们提供了以下输出:

function f() {
    var a = "", b = "1", c = "2";
    return a + ("(" + + b + + c + ")");
}
您将注意到,返回表达式已被修改。括号已重新定位到先前位于括号之外的字符串之外,导致变量
b
c
被强制为字符串并连接在一起。这会产生意外的结果,因为预期的添加从未发生。不幸的是,即使使用
Number()
parseInt()
强制
b
c
时,也会出现这种行为

有几个小的修改可以改变这一点,但最清楚的是只需事先保存添加到变量的结果:

$(this).text(function(i, t){
    var c = +f.offensive + +f.spam;
    return (t + ' (' + c + ')');
});

谢天谢地,这个问题似乎没有出现在Firefox4测试版中,所以希望这个问题已经解决了。另外,它还很有礼貌地继续进行并(标记为重复),以便开发人员在任何情况下都能意识到这个问题。

同时还要感谢JavaScript室中的每个人,感谢他们的贡献,很好地调试了一个非常奇怪的角落案例!您仍然应该提交一个bug,因为3.6.13仍然是当前版本,Mozilla开发人员应该知道这一点。@MatthewFlaschen谢谢!你说得对,那是个好主意。早些时候,我在BugZilla搜索过,想看看是否能找到任何相关的东西,但我没有找到。以后我会再看一看,如果我没有找到任何相关的东西,我会提交一个新的版本。@Tim,太好了。当你有机会的时候,把它链接到这里(无论是新的bug,还是已经存在的)。@Tim,我继续提交。希望它不是复制品。