我在javascript中有一个对象:
var a = {
n1: 1,
n2: 2
}
我希望得到a.n3
的值,但稍后会将n3
添加到对象中。
如何在不使用任何循环的情况下获取n3
的值并导致任何错误?
修改
对象a
是一个容器,来自不同作用域的不同脚本正在异步添加变量(我使用requireJS来维护脚本)。
我的一个脚本init.js
希望从对象获取属性n3
,但属性n3
由另一个脚本swatchRenderer.js
添加到对象中,不幸的是,在 init.js
之后被称为。因此,init.js
脚本未获得值n3
。
那么有没有办法停止在init.js
中取值。
注意:我无法更改脚本的加载顺序。
答案 0 :(得分:0)
如果对象a.n3
中不存在,则undefined
的值将为a
。因此,您可以使用if
条件来防止错误。
var a = {
n1: 1,
n2: 2
}
if(a.n3){
console.log('value found first');
}
a.n3 = 10;
if(a.n3){
console.log('value found second');
}
但是我们可以说n3
是boolean
值,那么此if
条件将无效,因此最好的方法是检查类型undefined
,< / p>
var a = {
n1: 1,
n2: 2
}
if(typeof a.n3 !== 'undefined'){
console.log('value found first');
}
a.n3 = false;
if(typeof a.n3 !== 'undefined'){
console.log('value found second');
}
答案 1 :(得分:0)
var value = a.n3;
如果值未定义,则n3尚未定义,如果已定义,则得到它是值。
答案 2 :(得分:0)
如果要在更改n3
时给定新值const a = {
n1: 1,
n2: 2,
get n3() {
return this._n3;
},
set n3(val) {
this._n3 = val;
console.log('saw change, new val: ' + val);
},
};
console.log('start');
a.n3 = 'foo';
console.log('end');
运行函数,则一个选项是使用getter / setter:
{{1}}&#13;
但这通常不能依赖 - 当对象发生变化时触发外部事物会更好。
的更多详细信息/示例答案 3 :(得分:0)
使用JavaScript的此功能(仅此示例)
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
var obj = {
n1: 2,
n2: 3
}
async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds();
console.log(result);
if (obj.n3) {
console.log("obj.n3 found");
//Here do your task
return;
}else {
asyncCall();
}
// expected output: "resolved"
}
asyncCall();
答案 4 :(得分:0)
因为您说您的脚本是先加载的。您可以做的是每隔x
秒继续获取值,直到找到该值。
示例强>
var fetchN3 = function () {
if (obj.n3 === undefined){
return setTimeout(function() {
fetchN3();
}, 500);
}
console.log("Found N3!!!", obj.n3);
}