我正在尝试编写一个只将非内置全局变量转储到控制台的bookmarklet。我发现window.Audio和其他一些内置函数让toString()返回“[object Function]”。
是否可以构建函数(它有意义吗?).toString()返回“[object Function]”而不覆盖.toString()换句话说,我是否有可能跳过非内置函数,因为我跳过“[对象功能]”的?
这个问题是我尝试打磨书签的一部分:https://gist.github.com/4635185
答案 0 :(得分:4)
由于window.Audio
的方法与toString
不同Object
(Audio.toString === Object.toString //false
)
,任何其他function
或Object
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);
})();
感谢你指出最后一个答案没有成功(我甚至不知道我在想什么)
无论如何,另一种方法可能是
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));
这样一来,如果有人会覆盖对象/函数toString
方法,你就不必费心了。
为了便于阅读,我不会在此编辑中包含旧代码
回答评论!!~
做了什么:
~
是一个按位NOT运算符,它反转其操作数的位。
所以给定这个逻辑,它可以用作indexOf
的简写来检查它是否找到了什么,
因为它返回-1
如果没有找到任何其他正数。
~-1 == 0
,例如~4 == -5
然后!!
用于将其转换为布尔值
!!0 == false
和!!-5 == true
基本上是
的简写 if( myString.indexOf("myValue") > -1)