使用三元运算符时返回undefined的对象属性
问题描述:
我正在构建一个对象字面值并使用if-else简写来设置我的属性值之一,但它一直返回undefined
,我不明白为什么:使用三元运算符时返回undefined的对象属性
var cca = cca || {};
var initialization = function() {
cca = {
languageCode: _spPageContextInfo.currentLanguage,
language: (_spPageContextInfo.currentLanguage == 1033) ? "english" : "french",
englishTitle: "ENGLISH SITE",
frenchTitle: "FRENCH SITE",
site_title: (_spPageContextInfo.currentLanguage == 1033) ? cca.englishTitle : cca.frenchTitle,
page: _spPageContextInfo,
path: _spPageContextInfo.webAbsoluteUrl,
isGrantSite: function() {
return _.includes(cca.path, "grants");
}
};
};
当我用断点评估时,评估会返回正确的值,但不会保存到属性中。但是,我以类似的方式(cca.language)设置另一个属性,并且工作正常。
答
在三元表达式求值时,分配给cca
初始化函数内还没有发生。因此,cca.englishTitle
和cca.frenchTitle
尚不存在。一个解决方案是推迟特定属性赋值,直到算账:
var initialization = function() {
cca = {
languageCode: _spPageContextInfo.currentLanguage,
language: (_spPageContextInfo.currentLanguage == 1033) ? "english" : "french",
englishTitle: "ENGLISH SITE",
frenchTitle: "FRENCH SITE",
page: _spPageContextInfo,
path: _spPageContextInfo.webAbsoluteUrl,
isGrantSite: function() {
return _.includes(cca.path, "grants");
}
};
cca.site_title: (_spPageContextInfo.currentLanguage == 1033) ? cca.englishTitle : cca.frenchTitle;
site_setup();
};
至于为什么调试器正在评估表达"ENGLISH SITE"
,这是因为分配已经完成(你是下一个语句)。
答
你也可以用promise来解决它。看看下面的代码:
var test = {
a: 'aaa',
b: Promise.resolve(test).then(()=>test.b = test.a)
}
async function show() {
\t await test.b;
\t console.log(test);
}
show();
,所以你会怎么做:
var cca = cca || {};
_spPageContextInfo = { currentLanguage: 1033};
var initialization = function() {
cca = {
languageCode: _spPageContextInfo.currentLanguage,
language: (_spPageContextInfo.currentLanguage == 1033) ? "english" : "french",
englishTitle: "ENGLISH SITE",
frenchTitle: "FRENCH SITE",
site_title: Promise.resolve(cca).then(()=>
cca.site_title = (_spPageContextInfo.currentLanguage == 1033) ? cca.englishTitle : cca.frenchTitle),
page: _spPageContextInfo,
path: _spPageContextInfo.webAbsoluteUrl,
isGrantSite: function() {
return _.includes(cca.path, "grants");
}
};
};
async function show() {
\t await cca.site_title;
\t console.log(cca);
}
initialization();
show();
请明白,
async function show() {
await cca.site_title;
console.log(cca);
}
show();
部分只是为了让您能够看到完整的对象,因为它现在是异步性质,因此在cca声明之后它将不可用。
但是,因为这是以微秒为单位解决的,所以您可以继续正常执行代码并且不用担心。
所以基本上我在他们发起之前就打电话给他们? – Batman
@Batman - 确实如此。 –