我无法弄清楚如何获取一个对象名称字符串并检查该对象是否确实存在。
我想要完成的是有一个数组,它定义了特定JavaScript"模块所需的对象。工作,例如:
var requiredImports = ['MyApp.Object1', 'MyApp.Object2'];
然后使用requiredImports
,我想循环遍历它们并检查是否已定义。如果不使用上面的数组,我可以执行以下操作:
if (MyApp.Object1 == undefined) {
alert('Missing MyApp.Object1');
}
但是使用上面的代码,我必须为每个模块硬编码,而不是制作一个通用的方法,我可以将它传递给一个字符串数组,让它有效地为我做同样的检查。
我尝试通过传递对象本身来实现这一点,例如:
var requiredImports = [MyApp.Object1, MyApp.Object2];
但是当这些对象不存在时抛出JavaScript错误,这就是我想要抓住的东西。
答案 0 :(得分:3)
您可以使用
检查定义if ( typeof window['MyApp'] === 'undefined' ||
typeof window['MyApp']['Object1'] === 'undefined' )
{
alert('Missing MyApp.Object1');
}
等等。
答案 1 :(得分:3)
var MyApp = {
Object1: {}
};
function exists(varName, scope) {
var parent = scope || window;
try {
varName.split('.').forEach(function (name) {
if (parent[name] === undefined) {
throw 'undefined';
}
parent = parent[name];
});
}
catch (ex) {
return false;
}
return true;
}
console.log(
exists('MyApp.Object1'), // true
exists('MyApp.Object2'), // false
exists('window'), // true
exists('document'), // true
exists('window.document') // true
);
// or
console.log(
['MyApp.Object1', 'MyApp.Object2', 'window', 'document', 'window.document'].filter(function (varName) {
return !exists(varName);
})
);
// => ["MyApp.Object2"]
注意:forEach
是ES5,因此在某些浏览器中未实现。但如果您使用此解决方案,则会有一个很好的polyfill here。
答案 2 :(得分:2)
假设MyApp.Object1
是全局范围,window
是父对象,因为它是顶级对象,所以您不需要在全局变量前加上它。因此window.MyApp.Object1
与MyApp.Object1
相同(同样,假设这在全局范围内)。
此外,在javascript中,MyApp['Object1']
与MyApp.Object1
相同。因此,如果我们将此原则应用于主窗口对象,您可以检查window['MyApp']
或window['MyApp']['Object1']
,此处的关键是您可以用变量替换“MyApp”和“Object1”。
示例:
/* check if a variable/object exists in the global scope) */
function checkIfExists(someVar) {
if (typeof(window[someVar]) == 'undefined')
return true;
return false;
}
var foo = 'bar';
alert(checkIfExists('foo'));
答案 3 :(得分:1)
您可以在JavaScript中评估自定义表达式。请考虑以下代码:
var MyApp = {
Object1: "foo",
Object2: "bar"
};
var IsExists = function(varName) {
return new Function('return typeof(' + varName + ') === "undefined" ? false : true;')();
};
<强> USAGE 强>
var requiredImports = ['MyApp.Object1', 'MyApp.Object2'];
for (var i = 0; i < requiredImports.length; i++)
{
alert(requiredImports[i] + ": " + IsExists(requiredImports[i]))
}
答案 4 :(得分:0)
您只能获得第一级错误(示例中为MyApp
)。我假设你只有一些初级需求,所以请window[x]
手动检查它们不会抛出:
var requiredTopLevel = ['MyApp'];
for (var i = 0; i < requiredTopLevel.length; ++i) {
if ("undefined" === typeof window[requiredTopLevel[i]]) {
// problem with requiredTopLevel[i]
}
}
然后,要检查嵌套需求(如果存在顶级),您可以毫无顾虑地使用这些值。例如,这将起作用:
var requiredNested = { 'Object1':MyApp.Object1, 'Object2':Myapp.Object2 };
for (var name in requiredNested) {
if ("undefined" === typeof requiredNested[name]) {
// problem with name
}
}