3

我正在尝试编写一个仅将非内置全局变量转储到控制台的小书签。我发现 window.Audio 和其他一些内置函数让 toString() 返回“[object Function]”。

是否可以构建函数(这有意义吗?)其 .toString() 返回“[object Function]”而不覆盖 .toString() 换句话说,我是否有可能跳过非内置函数,因为我跳过了“ [对象功能]"的?

这个问题是我试图完善我的书签的一部分:https ://gist.github.com/4635185

4

1 回答 1

4

由于window.Audio具有与 ( )不同的toString方法 ,因此任何其他s 或s方法都可能被覆盖并返回Object
Audio.toString === Object.toString //false
functionObjecttoString[object Function]

现在,人们不会到处乱跑并覆盖他们的函数toString方法。所以你可能会用这种方法做得很好。但是可能出于调试原因或其他原因,有人可能会决定这样做。

更新:

一个简单的 ECMAScript 5 的解决方案也是可能的(兼容性

(function () {
    var keys = Object.keys(window),
        r = {};
    for (var i = 0, j; j = keys[i]; i++) {
        r[j] = window[j];
    }
    console.dir(r);
})();

编辑:

正如您幸运地指出的那样,最后一个答案不起作用(我什至不知道我在想什么)

无论如何,另一种方法可能是

  • 创建一个新的空 iframe (about:blank)
  • 获取所有window属性从一开始就包含的属性
  • 将所有其他人推入一个数组

例子

function getNonNatives(window) {
var iframe = document.createElement("iframe");
iframe.src = "about:blank";
document.body.appendChild(iframe);
var natives = iframe.contentWindow,nonnatives = {};
for(var prop in window)
  if(!natives[prop] && window[prop] !== null)
    nonnatives[prop] = window[prop];
document.body.removeChild(iframe);
  return nonnatives;
};
console.log(getNonNatives(window));

这样,如果有人重写 Objects/Functions 方法,您就不必费心了toString

为了便于阅读,我不会在此编辑中包含旧代码

评论

要回答评论中的问题是什么!!~

~是一个按位非运算符,它反转其操作数的位。

因此,鉴于这个逻辑,它可以用作indexOf检查是否找到任何东西的简写,
因为如果没有找到任何东西,它就会返回-1一个正数。

~-1 == 0例如~4 == -5

然后!!用于将其转换为布尔值

!!0 == false!!-5 == true

基本上它的简写

if( myString.indexOf("myValue") > -1)

于 2013-01-29T15:45:31.283 回答