在 Nashorn 中启用乐观类型的嵌套对象中的奇怪行为(属性设置为零)
Strange behavior (properties set to zero) in nested objects with optimistic types enabled in 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。
这是在 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。