【问题标题】:Find which variable holds a value using Chrome Devtools使用 Chrome Devtools 查找哪个变量包含一个值
【发布时间】:2014-12-10 22:27:58
【问题描述】:

我正在尝试访问远程 Web 应用程序中的一些值来构建 Chrome 扩展程序。

为此,我想找出哪个 JS 变量拥有给定的值,我想知道是否可以对内存中所有变量的值进行某种“全局搜索”。

这可以用任何工具吗?检查员、分析员等...?

【问题讨论】:

    标签: javascript google-chrome-devtools


    【解决方案1】:

    this answer goes to tomwrong 的所有功劳。有关此 sn-p 的问题/改进的更多详细信息,请参阅他的回答。

    代码

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

    【讨论】:

      【解决方案2】:

      您可以像这样遍历全局范围内的所有项目:

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

      这只是一个又快又脏的例子。它只检查严格相等(所以没有 "string contains"),它使用 for in 迭代数组,这是邪恶的。但它应该让您了解它是如何工作的。

      不过,不要将windowdocument 传递给此函数。由于循环引用,这将不起作用。


      不过,您也可以添加breakpoint in your code in the chrome dev tools
      然后,您可以在右侧的“作用域变量”区域中检查变量的当前值。

      【讨论】:

      • 为什么不使用window[key] === 123 而不是手动比较类型然后使用强制相等?
      • @JanDvorak:如果我不这样做,我会报错:Uncaught TypeError: Cannot convert object to primitive value (Chrome 控制台)
      • 这很容易失败:接触跨域框架时抛出的安全异常,循环结构(其实已经有几个了)...
      • “但是不要将窗口或文档传递给这个函数” - 或任何 DOM 节点(除了可能没有子节点的分离节点)或 ...
      • ... 或任何 JSON.stringify 会拒绝的东西
      猜你喜欢
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多