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

Javascript Nashorn中启用乐观类型的嵌套对象中的奇怪行为(属性设置为零),javascript,java,java-8,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 ||

这是在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
}
|
表达式更改为ternaries不会改变行为。但是,在初始化
linkData
对象之前,以任何方式引用
creativeDetails
对象的属性(例如,将其分配给另一个变量或将其打印出来),最终打印出预期结果

奇怪的是嵌套对象得到了正确的值,而外部对象却没有。只有在使用问题对象的属性初始化嵌套对象的属性时,才会显示此行为。例如,以下代码不会导致问题:

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

我知道纳肖恩的乐观类型是通过假设某事物的类型是
int
,然后逐渐降级为
对象来工作的。因此,这可能与此有关,但我不确定这是如何或为什么发生的。有人见过这种行为吗?

这是纳肖恩的一个错误,而且一直都是。

这是纳肖恩的一个错误,而且一直都是。

看起来像个错误。你应该报告,看来是这样。是的,看起来像只虫子。你应该报告,看来是这样。是的。