我正在尝试编写一个仅将非内置全局变量转储到控制台的小书签。我发现 window.Audio 和其他一些内置函数让 toString() 返回“[object Function]”。
是否可以构建函数(这有意义吗?)其 .toString() 返回“[object Function]”而不覆盖 .toString() 换句话说,我是否有可能跳过非内置函数,因为我跳过了“ [对象功能]"的?
这个问题是我试图完善我的书签的一部分:https ://gist.github.com/4635185
我正在尝试编写一个仅将非内置全局变量转储到控制台的小书签。我发现 window.Audio 和其他一些内置函数让 toString() 返回“[object Function]”。
是否可以构建函数(这有意义吗?)其 .toString() 返回“[object Function]”而不覆盖 .toString() 换句话说,我是否有可能跳过非内置函数,因为我跳过了“ [对象功能]"的?
这个问题是我试图完善我的书签的一部分:https ://gist.github.com/4635185
由于window.Audio
具有与
( )不同的toString
方法
,因此任何其他s 或s方法都可能被覆盖并返回Object
Audio.toString === Object.toString //false
function
Object
toString
[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);
})();
正如您幸运地指出的那样,最后一个答案不起作用(我什至不知道我在想什么)
无论如何,另一种方法可能是
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)