如果string包含某个子字符串,则对任何字符串赋值断点

sas*_*alm 9 javascript debugging breakpoints

如果将任何变量分配给包含某个子字符串的字符串,我可以设置一个触发的数据断点吗?

例如,我想反向设计如何&ctoken=构造包含的URL .这是通过复杂的JavaScript完成的,其目标是对其进行模糊处理.

如果我可以告诉JS VM监视所有字符串变量并在任何变量上出现某个子字符串时中断,这将对我有很大帮助.

这可能吗?

Rob*_* F. 8

在我开始之前 - 据我所知,这是不可能的.

您需要的内容(甚至在创建调试功能之前)是已经String装入本机内置对象String然后已经代理的原始字符串类型.

更多解释:

只有

const s = "hi"
Run Code Online (Sandbox Code Playgroud)

还不是String内置本机对象的实例,它由ECMAScript实现提供给您的作用域 - 但是是原始类型.这种原始类型只不过是指向原始数据存储器引用的指针.我甚至假设有像Java一样的内置池来优化像

const s = "hi"
const x = new String("hi")
Run Code Online (Sandbox Code Playgroud)

是数据对象的相同内存引用.但后者当然会被装箱String. http://bespin.cz/~ondras/html/classv8_1_1String.html

在原始类型上,我们不能 - 即使我们想 - 添加订阅者.

例如然后:

s.charAt(i)
Run Code Online (Sandbox Code Playgroud)

将自动装箱s到其包装机上String.

观察每一种原始类型意味着我们必须将所有原始字符串包装起来,String这对于性能来说根本不是一件好事.

不仅如此,而且String自身的实现必须允许我们添加订户,因此已经代理.

在JS这样的代理看起来像这样(为了让代理人更明白我的意思):

var proxiedString = new Proxy(String, {
  defineProperty(target, propKey, propDesc) {
    console.log('defined a new string')
  },
  set(obj, prop, value) {
    console.log('set a new value to a string')
  }
});

proxiedString.x = 'newPropValue'
Run Code Online (Sandbox Code Playgroud)

而且我想再次 - 对性能不会有好处.