我尝试访问远程Web应用程序中的某些值以构建Chrome扩展程序。
为此,我想找到哪个JS变量包含给定值,我想知道是否可以进行某种"全局搜索"关于内存中所有变量的值。
这可以用任何工具吗?检查员,探查员等......?
答案 0 :(得分:5)
this answer goes to tomwrong的所有功劳。有关此代码段的问题/改进的更多详细信息,请参阅他的回答。
代码
function globalSearch(startObject, value) {
var stack = [[startObject,'']];
var searched = [];
var found = false;
var isArray = function(test) {
return Object.prototype.toString.call( test ) === '[object Array]';
}
while(stack.length) {
var fromStack = stack.pop();
var obj = fromStack[0];
var address = fromStack[1];
if( typeof obj == typeof value && obj == value) {
var found = address;
break;
}else if(typeof obj == "object" && searched.indexOf(obj) == -1){
if ( isArray(obj) ) {
var prefix = '[';
var postfix = ']';
}else {
var prefix = '.';
var postfix = '';
}
for( i in obj ) {
stack.push( [ obj[i], address + prefix + i + postfix ] );
}
searched.push(obj);
}
}
return found == '' ? true : found;
}
答案 1 :(得分:3)
您可以迭代全局范围内的所有项目,如下所示:
var test = 123,
someVar = 812;
for(key in window){
if(typeof window[key] === 'number' && window[key] == 123){
console.log(key, window[key]);
}
}
将它与一些递归相结合,理论上你可以迭代一个对象中可用的所有对象及其子对象:
function searchObject(object, search){
for(key in object){
if(typeof object[key] === 'number' || typeof object[key] === 'string'){
if(object[key] === search){
console.log(key, window[key]);
}
}else if(typeof object[key] === 'object'){
searchObject(object[key], search);
}
}
}
这只是 快速而肮脏的 示例。它只检查严格的相等性(所以没有"字符串包含" ),它用for in
迭代数组,这是邪恶的。但它应该让你知道它是如何工作的。
不要将window
或document
传递给此功能。由于循环引用,它不会起作用。
但是,您也可以放置breakpoint in your code in the chrome dev tools 然后,您可以在"范围变量"中检查变量的当前值。在右边区域。