4

我正在阅读一些 Firefox 扩展的源代码,我看到了一些类似的表达式

0*this;

剂量这个表达意味着什么?

ps:我是中国人,如果我的英文有问题,请告诉我,谢谢!

这是扩展的功能;

function inGetter(){
   0*this;
   var gin=  Components.lookupMethod(this,"innerHTML")();
   gin=String.newTainted(gin,"divElement.INNERHTML");

   if(__domIntruderObj.settings.enabled  )
      __domIntruderObj.log("Getter",this.tagName+".value",gin, __domIntruderObj.util.getCallStack(arguments));
   return gin;
}
4

3 回答 3

2

该代码是XSS 检测 Firefox 扩展的一部分。

正如另一个答案中提到的,乘法会导致调用引擎的内部DefaultValue方法。发生的事情是:它在抛出错误之前valueOf尝试。toString例如,

2 * { valueOf: function () { return 3; }} // 6
2 * { toString: function () { return '4'; }} // 8
2 * { toString: function () { return this; }} // TypeError

所以这个副作用可以用来获取对象的一些信息。特别是,代码中有一些自定义toString实现,我认为这是用来生成一些调用堆栈日志的。不过我还没有真正深入细节。

于 2012-12-18T04:43:12.457 回答
2

全局执行上下文中的值this是全局对象。在函数上下文中可以是任何对象,或者在严格模式下,可以是任何值,包括 undefined。

因此,首先this将使用ToPrimitive(依次调用DefaultValue )将结果转换为原始值,然后使用ToNumber将结果转换为数字。所有这些的结果将是一个数字或 NaN。

因此 的结果0*this将是0NaN,具体取决于是分别this转换为数字还是NaN

于 2012-12-18T03:29:36.057 回答
1

我看到的唯一棘手的部分是:

typeof 1 => "number"
0*1 =>  0

typeof null => "object"
0*null => 0

在任何其他情况下,结果将是NaN

这也有有趣的方法 bw

typeof NaN => "number"

null但正是在这里,我想这是从其他类型中整理出所有数字的聪明方法。

于 2012-12-18T03:32:17.010 回答