WildFly 9升级至12时JavaScript split函数异常问题咨询
解决WildFly 12中JavaScript split函数的报错问题
我帮你排查下这个WildFly升级后JS split报错的问题哈~
问题到底出在哪?
你的代码在WildFly 9里跑的好好的,升级到12就出问题,核心原因大概率是JS引擎的正则处理逻辑变严格了:
- WildFly 9用的是旧版JS引擎(早期Nashorn或者Rhino),对
split参数的处理比较宽松,会把"\\$"直接当作字面量$来匹配;但WildFly 12用的是更新的Nashorn引擎,严格遵循ES标准——它会把split的字符串参数转换成正则表达式,而$在正则里是个特殊字符(用来匹配行尾),这就导致它根本找不到你字符串里的$符号,分割出来的数组只有一个元素,你再去取[1]自然就报错了。 - 要是这段JS是写在JSP页面里的,还有可能是WildFly 12的JSP容器对转义字符的解析更严格了,
\\$会被提前解析成\$,传到浏览器后JS会把无效的\$直接当成$,同样会导致正则匹配失败。
怎么修复?给你两个靠谱方案:
1. 直接用正则表达式字面量(推荐)
最稳妥的方式是直接写正则字面量,明确告诉JS引擎要匹配字面量的$(记得在正则里给$加转义符\):
function testSplitFunction(){ var data="input$output"; // 用正则字面量 /\$/ 精准匹配$符号 var parts = data.split(/\$/); var variable1 = parts[0]; var variable2 = parts[1]; }
这种写法完全符合ES标准,不管是服务器端的Nashorn还是前端浏览器的JS引擎都能正确识别,不会有歧义。
2. 多转义一层(适合JSP场景)
如果你的代码是在JSP页面里,怕转义出问题,可以把反斜杠多写一层——用四个反斜杠来转义$:
function testSplitFunction(){ var data="input$output"; // 四个反斜杠最终会被解析成\\$,让JS引擎识别为正则里的\$ var variable1 = data.split("\\\\$")[0]; var variable2 = data.split("\\\\$")[1]; }
这样JSP容器解析后会把\\\\$变成\\$,传到JS里就会被正确转换成匹配字面量$的正则表达式。
额外提个小建议
为了避免以后再出现类似的数组越界报错,最好先检查下分割后的数组长度:
function testSplitFunction(){ var data="input$output"; var parts = data.split(/\$/); if(parts.length >= 2){ var variable1 = parts[0]; var variable2 = parts[1]; // 这里写你的业务逻辑 } else { // 数据格式不对的时候做个兼容处理 console.warn("哎呀,数据格式不对哦:" + data); } }
内容的提问来源于stack exchange,提问作者aravinda kc
相关产品推荐
相关产品推荐

