是" [对象功能]"唯一的内置功能?

时间:2013-01-29 14:44:31

标签: javascript bookmarklet built-in

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

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

这个问题是我尝试打磨书签的一部分:https://gist.github.com/4635185

1 个答案:

答案 0 :(得分:4)

由于window.Audio的方法与toString不同ObjectAudio.toString === Object.toString //false
,任何其他functionObject toString方法可能会被覆盖并可能会返回[object Function]

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

更新

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

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

编辑:

感谢你指出最后一个答案没有成功(我甚至不知道我在想什么)

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

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

Example

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));

这样一来,如果有人会覆盖对象/函数toString方法,你就不必费心了。

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

注释

回答评论!!~做了什么:

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

所以给定这个逻辑,它可以用作indexOf的简写来检查它是否找到了什么,
因为它返回-1如果没有找到任何其他正数。

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

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

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

基本上是

的简写

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