Nashorn中使用Array.from(string)报错,求兼容的字符串转字符数组方案
解决Nashorn中
Array.from()不支持的问题 你遇到的问题核心在于Nashorn引擎默认仅支持ECMAScript 5.1,而Array.from()是ES6(ECMAScript 2015)才新增的方法,直接调用自然会抛出TypeError。下面给你几个兼容Nashorn的字符串转字符数组方案,以及如果坚持要用Array.from()的适配方法:
方案1:用ES5原生的split('')快速转换
这是最简洁的替代方案,ES5完全支持,能直接把字符串按单个字符拆分成数组:
修改你的fun.js代码:
function fun1(){ var str='apple'; var charArray = str.split(''); // 替换Array.from(str) return charArray; }
注意:如果你的字符串包含Unicode代理对(比如emoji、部分生僻汉字),
split('')可能会拆分出错误的单个字符,但常规ASCII或普通字符场景下完全够用。
方案2:手动遍历构建数组(兼容特殊字符)
如果需要处理特殊字符,或者想更灵活控制转换逻辑,可以手动遍历字符串:
function fun1(){ var str='apple'; var charArray = []; for(var i = 0; i < str.length; i++){ charArray.push(str.charAt(i)); // 也可以直接用str[i],ES5支持字符串索引访问 } return charArray; }
方案3:添加Array.from()的Polyfill
如果你一定要保留Array.from()的语法,可以给Nashorn补充ES6方法的兼容代码(polyfill),在你的JS代码开头加入这段:
// Array.from的ES5兼容polyfill if (!Array.from) { Array.from = function(object) { 'use strict'; return [].slice.call(object); }; }
添加后你原来的Array.from(str)代码就能正常运行了。这个基础版polyfill支持类数组对象转换,如果需要映射函数等进阶功能,可以扩展这个逻辑。
附Java端调用验证示例
确保Java代码正确接收返回的数组:
System.out.println("initialising parser...."); ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); engine.eval(new FileReader("fun.js")); Invocable invocable = (Invocable) engine; Object result = invocable.invokeFunction("fun1"); if (result instanceof List) { List<?> charList = (List<?>) result; System.out.println(charList); // 输出 [a, p, p, l, e] }
内容的提问来源于stack exchange,提问作者Rahul Choubey
相关产品推荐
相关产品推荐

