Firefox gBrowser.getBrowserForTab但没有gBrowser.getTabForBrowser?

Firefox gBrowser.getBrowserForTab但没有gBrowser.getTabForBrowser?,browser,tabs,firefox-addon,Browser,Tabs,Firefox Addon,在Firefox扩展的Javascript中,可以调用gBrowser.getBrowserForTab,但没有gBrowser.getTabForBrowser。所以我写了我自己的,它是有效的,我只是好奇是否有任何理由我不应该这样做,或者如果有任何错误的代码。下面是在加载窗口时调用的myinit方法 gBrowser.getTabForBrowser = function(browser) { for (var i=0; i<gBrowser.browsers.length; i++

在Firefox扩展的Javascript中,可以调用
gBrowser.getBrowserForTab
,但没有
gBrowser.getTabForBrowser
。所以我写了我自己的,它是有效的,我只是好奇是否有任何理由我不应该这样做,或者如果有任何错误的代码。下面是在加载窗口时调用的my
init
方法

gBrowser.getTabForBrowser = function(browser) {
  for (var i=0; i<gBrowser.browsers.length; i++) {
    if (gBrowser.getBrowserAtIndex(i) === browser) {
      return gBrowser.tabContainer.getItemAtIndex(i);
    }
  }
  return null;
}
gBrowser.getTabForBrowser=函数(浏览器){

对于(var i=0;i据我所知,没有内置的
getTabForBrowser
函数,因此您必须自己运行。但是,您的代码假设浏览器节点与选项卡节点以相同的DOM顺序存储。我不能确定这一假设是否被打破,但考虑到用户可以任意重新定位选项卡,这是不可能的这不是我可以信赖的

幸运的是,每个选项卡对象都有一个
linkedBrowser
属性。因此,您可以像这样重写代码:

gBrowser.getTabForBrowser = function(browser) {
  var mTabs = gBrowser.mTabContainer.childNodes;
  for (var i=0, i<mTabs.length; i++) {
    if (mTabs[i].linkedBrowser == browser) {
      return mTabs[i];
    }
  }
  return null;
}
gBrowser.getTabForBrowser=函数(浏览器){
var mTabs=gBrowser.mTabContainer.childNodes;

对于(var i=0,我应该是
==
还是
==
?我认为可以想象,两个
会比较相等,即使它们不是完全相同的浏览器,尽管我不确定。因此
==
对我来说似乎更安全。经过一些快速的实验,看起来它确实会在DOM中重新排序浏览器,但你说得对这是我不应该依赖的。很好的一点!
a===b
等同于
typeof a==typeof b&&a==b
,因此当已知两个操作数的类型相同时,
===
是不必要的。因为Javascript中的对象是通过引用分配给变量的,所以两个不同的对象永远不会进行相等的比较如果它们包含相同的属性名和值。
({x:5})=({x:5})
的计算结果为
false
。这就是说,
===
当然没有坏处,而且它的优点是您不必过多考虑。