Javascript 如果字符串包含某个子字符串,则在任何字符串赋值上设置断点
我是否可以设置一个数据断点,如果将任何变量分配给包含某个子字符串的字符串,该断点将触发 例如,我想对包含Javascript 如果字符串包含某个子字符串,则在任何字符串赋值上设置断点,javascript,debugging,breakpoints,Javascript,Debugging,Breakpoints,我是否可以设置一个数据断点,如果将任何变量分配给包含某个子字符串的字符串,该断点将触发 例如,我想对包含&ctoken=的URL的构造方式进行反向工程。它是用复杂的JavaScript完成的,目标是混淆它 如果我可以告诉JSVM监视所有字符串变量,并在任何变量上出现某个子字符串时中断,这将对我有很大帮助 这可能吗 您可以在右侧的浏览器devTools中使用条件断点 用菜单单击 如果您可以在页面的某个地方编写js,那么 可以这样做: 在我开始之前——据我所知,这是不可能的 您需要的(甚至在创建调
&ctoken=
的URL的构造方式进行反向工程。它是用复杂的JavaScript完成的,目标是混淆它
如果我可以告诉JSVM监视所有字符串变量,并在任何变量上出现某个子字符串时中断,这将对我有很大帮助
这可能吗
在我开始之前——据我所知,这是不可能的 您需要的(甚至在创建调试功能之前)是原始字符串类型,这些类型已经装箱到本机内置对象
string
,然后已经代理
还有一些解释:
只有
const s = "hi"
还不是String
(ECMAScript实现为您的作用域提供的内置本机对象)的实例,而是原始类型。
这种原始类型只不过是指向原始数据内存引用的指针。我甚至假设有内置的池(如Java中的池)来优化以下情况:
const s = "hi"
const x = new String("hi")
与数据对象的内存引用相同。但是后者当然会被String
装箱。
在原始类型上,即使我们想添加订阅者,也无法添加订阅者
例如:
s.charAt(i)
将自动装箱s
添加到其包装字符串中
观察每一种原始类型意味着我们必须将所有原始字符串框到String
,这对性能根本不是一件好事
不仅如此,String
本身的实现也必须允许我们添加订阅者,因此已经被代理了
在JS中,这样的代理看起来是这样的(为了更容易理解我所说的代理的意思):
我想这对性能也不好。我理解技术要求。您还可以编写业务需求。根据您的IDE,您可以设置条件断点,仅当满足某个条件时才会导致代码停止执行。在您的情况下,您可以按照以下方式进行操作:myString.search(“&ctoken=”)!=-1
据我所知,您希望创建全局条件断点
,但不幸的是,这是不可能的@ThomasCook是的,只是需要注意,它应该适用于任何字符串变量,而不仅仅适用于具有特定名称的特定变量。也就是说,条件是“如果在任何执行点,任何变量都持有包含某个子字符串的字符串,则中断执行”。部分解决方案可以重写che string构造函数方法并在其上设置断点。这不能用于赋值var str=“Hello”
,但可用于var str=new String(“Hello”)代码>
s.charAt(i)
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'