javascript - 在 Nashorn 中启用乐观类型的嵌套对象中出现奇怪的行为(属性设置为零)

标签 javascript java java-8 nashorn

这是在 JDK 8u102 上。我看到奇怪的行为,当乐观类型设置为 true 时,对象的某些属性设置为零。下面是一个演示该行为的 jjs 脚本:

var config = {};

var creativeDetails = {
    fanpage_id: config.fanpage_id || "293867224112667",
    image_url: config.image_url || "http://some.url",
    title: config.title || "Ad Title",
    description: config.description || "Ad Description",
    link_description: config.link_description || "Link Description",
    call_to_action: config.call_to_action || "LEARN_MORE",
    destination_url: "http://some.url",
    link_body: config.link_body || "Link Body"
};

var linkData = {
    call_to_action: {
        type: creativeDetails.call_to_action,
        value:{
            link_caption: creativeDetails.link_description,
            link: creativeDetails.destination_url
        }
    },
    link: creativeDetails.destination_url,
    picture: creativeDetails.image_url,
    message: creativeDetails.description,
    name: creativeDetails.title
};

print(JSON.stringify(linkData, null, 4) + "\n");

在不带任何参数的情况下使用 jjs 运行此命令会给出:

{
    "call_to_action": {
        "type": "LEARN_MORE",
        "value": {
            "link_caption": "Link Description",
            "link": "http://some.url"
        }
    },
    "link": "http://some.url",
    "picture": "http://some.url",
    "message": "Ad Description",
    "name": "Ad Title"
}

而使用 jjs --optimistic-types=true 运行它会给出:

{
    "call_to_action": {
        "type": "LEARN_MORE",
        "value": {
            "link_caption": "Link Description",
            "link": "http://some.url"
        }
    },
    "link": 0,
    "picture": 0,
    "message": 0,
    "name": 0
}

|| 表达式更改为三元表达式并没有改变行为。但是,在初始化 linkData 对象之前以任何方式引用 creativeDetails 对象的属性(例如,将其分配给另一个变量或将其打印出来),最终都会打印出预期的结果。

奇怪的是,嵌套对象获得了正确的值,但外部对象却没有。仅当您使用有问题的对象的属性来初始化嵌套对象的属性时,才会出现此行为。例如,以下代码不会导致该问题:

var linkData = {
    link: creativeDetails.destination_url,
    picture: creativeDetails.image_url,
    message: creativeDetails.description,
    name: creativeDetails.title
};

我知道 Nashorn 的乐观类型的工作原理是假设某物的类型是 int,然后逐渐降级为 Object。所以这可能与此有关,但我不确定这是如何或为何发生的。有人见过这种行为吗?

最佳答案

这是 Nashorn 中的一个错误,已被 resolved .

关于javascript - 在 Nashorn 中启用乐观类型的嵌套对象中出现奇怪的行为(属性设置为零),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39759208/

相关文章:

javascript - 如何停止 Promise 对象的自动解析?

javascript - jQuery : Kill Mouseenter/mouseleave function on mouseleave

java - 不同 PC 上的 RMI

java - 将一个元素与列表中的每个其他元素相加

用于计算唯一对象的 Java lambda 表达式

javascript - 将开关转换为对象

javascript - 如何使用 Javascript 对动态数组中的项目进行分组

java - 从其他语言(如 Java、PHP、Perl、Python 等)调用 C/C++ 代码的最佳方式是什么?

Java for 循环优化

java - Double 上的数学运算结果是否完全可重复?