===当两个引用都应该指向同一个对象时,在Nashorn中返回false
=== returns false in Nashorn when both references should be pointing to the same object
下面是一个示例,演示了我面临的问题:
ScriptEngine engine = new NashornScriptEngineFactory().getScriptEngine(
new String[] { "-strict" }
);
try {
engine.eval("function Foo(src) { this.src = src }; var e = { x: new Foo('"what'") };");
ScriptContext c = new SimpleScriptContext();
c.setBindings(engine.createBindings(), ScriptContext.ENGINE_SCOPE);
c.getBindings(ScriptContext.ENGINE_SCOPE).putAll(engine.getBindings(ScriptContext.ENGINE_SCOPE));
System.out.println(engine.eval("var z = e.x; z === e.x;", c));
} catch(Exception e) {
throw new RuntimeException(e);
}
我知道,在另一个上下文中实例化的对象被认为是"外来的",最终被ScriptObjectMirror
实例封装。我想这就是我遇到问题的原因。我相信每当x
被取消引用时,就会创建一个新的ScriptObjectMirror
实例;这是唯一可以解释以下代码位也返回false
:的东西
System.out.println(engine.eval("e.x === e.x;", c));
有办法绕过这个吗?我正在寻找一些我可以从Java中做的事情,也许可以以某种方式设置上下文/绑定,而不必用JavaScript编写代码来绕过这一点。
只是为了其他可能在这里阅读此问题的人的利益:
nashorn dev openjdk电子邮件别名中有一个关于这一点的讨论主题:http://mail.openjdk.java.net/pipermail/nashorn-dev/2015-December/005764.html
不确定您是否在此处看到文档:(https://wiki.openjdk.java.net/display/Nashorn/Nashorn+jsr223+engine+notes),但如果你的假设是正确的,也许你可以使用"显式脚本对象镜像包装"来避免你遇到的问题。
相关文章:
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- AngularJS&JSON-从Previous&下一个对象
- jQuery$.inArray()总是返回-1和一个对象数组
- javascript处理一个对象数组以获得一个新的对象数组
- javascript函数,它接受两个输入:一个对象和一个键,并返回对象中该键的相应值
- 你能用来自数组的属性名称生成一个对象吗
- 预期响应包含一个对象,但在angular js中得到一个数组错误
- Protractor:element.getText()返回一个对象,而不是String
- 如何使用jQuery添加另一个对象的高度作为边距
- 计算从一个对象到另一个对象的路径并沿其移动
- 如何将一个对象添加到每个对象数组中
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 将javascript对象(属性+值)合并到一个对象中
- 尝试简化检查对象键是否为true并将其推送到另一个对象
- 从 javascript 中的对象方法返回一个对象
- 响应应包含一个对象,但得到的却是GET操作的数组
- js:如何制作一个循环,将20个不同的东西添加到一个对象中
- 用javascript创建另一个对象的实例