如果JavaScript对象的名称是字符串,如何检查它?
我很难弄清楚如何获取对象名称的字符串并检查该对象是否确实存在 我试图实现的是让一个数组定义特定JavaScript模块工作所需的对象,例如:如果JavaScript对象的名称是字符串,如何检查它?,javascript,Javascript,我很难弄清楚如何获取对象名称的字符串并检查该对象是否确实存在 我试图实现的是让一个数组定义特定JavaScript模块工作所需的对象,例如: var requiredImports = ['MyApp.Object1', 'MyApp.Object2']; 然后使用requiredImports,我想循环它们并检查是否定义了。在不使用上述阵列的情况下,我可以执行以下操作,这正是我试图实现的目标: if (MyApp.Object1 == undefined) { alert('Miss
var requiredImports = ['MyApp.Object1', 'MyApp.Object2'];
然后使用requiredImports,我想循环它们并检查是否定义了。在不使用上述阵列的情况下,我可以执行以下操作,这正是我试图实现的目标:
if (MyApp.Object1 == undefined) {
alert('Missing MyApp.Object1');
}
但是使用上面的方法,我必须为每个模块硬编码,而不是生成一个通用方法,我只需向它传递一个字符串数组,让它有效地为我执行相同的检查
我尝试通过将对象本身传递给它来实现这一点,例如:
var requiredImports = [MyApp.Object1, MyApp.Object2];
但是,当这些对象不存在时,会抛出一个JavaScript错误,这正是我试图捕捉的
if ( typeof window['MyApp'] === 'undefined' ||
typeof window['MyApp']['Object1'] === 'undefined' )
{
alert('Missing MyApp.Object1');
}
等等。您可以使用
if ( typeof window['MyApp'] === 'undefined' ||
typeof window['MyApp']['Object1'] === 'undefined' )
{
alert('Missing MyApp.Object1');
}
等等。您可以在JavaScript中计算自定义表达式。考虑下面的代码:
var MyApp = {
Object1: "foo",
Object2: "bar"
};
var IsExists = function(varName) {
return new Function('return typeof(' + varName + ') === "undefined" ? false : true;')();
};
用法
您可以在JavaScript中计算自定义表达式。考虑下面的代码:
var MyApp = {
Object1: "foo",
Object2: "bar"
};
var IsExists = function(varName) {
return new Function('return typeof(' + varName + ') === "undefined" ? false : true;')();
};
用法
假设MyApp.Object1是一个全局范围,window是父对象,因为它是顶级对象,所以不需要在全局变量前面加上它。因此window.MyApp.Object1与MyApp.Object1相同,假设它在全局范围内
此外,在javascript中,MyApp['Object1']与MyApp.Object1相同。因此,如果我们将此原则应用于主窗口对象,您可以检查窗口['MyApp']或窗口['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'));
假设MyApp.Object1是一个全局范围,window是父对象,因为它是顶级对象,所以不需要在全局变量前面加上它。因此window.MyApp.Object1与MyApp.Object1相同,假设它在全局范围内
此外,在javascript中,MyApp['Object1']与MyApp.Object1相同。因此,如果我们将此原则应用于主窗口对象,您可以检查窗口['MyApp']或窗口['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'));
注意:forEach是ES5,因此在某些浏览器中没有实现。但是如果你使用这个解决方案,有一个很好的多边形填充
注意:forEach是ES5,因此在某些浏览器中没有实现。但如果您使用此解决方案,则有一个很好的多边形填充。在您的示例中,您只会得到第一级MyApp的错误。我假设您只有几个第一级需求,所以请通过窗口[x]手动检查它们,该窗口不会抛出:
var requiredTopLevel = ['MyApp'];
for (var i = 0; i < requiredTopLevel.length; ++i) {
if ("undefined" === typeof window[requiredTopLevel[i]]) {
// problem with requiredTopLevel[i]
}
}
在您的示例中,只有第一级MyApp出现错误。我假设您只有几个第一级需求,所以请通过窗口[x]手动检查它们,该窗口不会抛出:
var requiredTopLevel = ['MyApp'];
for (var i = 0; i < requiredTopLevel.length; ++i) {
if ("undefined" === typeof window[requiredTopLevel[i]]) {
// problem with requiredTopLevel[i]
}
}
为什么有这么多代码?如果window.MyApp&&window.MyApp.Object1{…会做同样的事情。@Yoshi:这是一种devops_borat方法来改进你的指标。无论如何,你完全正确-我想我是在决定MyApp的类型…和window.MyApp…之间选择了两者。@Yoshi:我想你没有正确地阅读这个问题。'MyApp.Object1'是字符串,那么你将如何做window.MyApp?我认为这个答案是完美的。+答案是1。@BheshGurung,来自Jareds最后一个示例var requireImports=[MyApp.Object1,MyApp.Object2];我猜他会或可能也会愿意使用这种语法。@Yoshi:这是他尝试过但没有成功的东西。你知道你不能使用一些你还需要判断是否定义的东西。为什么要这么多代码?if!window.MyApp&&window.MyApp.Object1{…会做同样的事情。@Yoshi:这是一种devops_borat方法来改进你的指标。无论如何,你完全正确-我想我是在决定MyApp的类型…和window.MyApp…之间选择了两者。@Yoshi:我想你没有正确地阅读这个问题。'MyApp.Object1'是字符串,那么你将如何做window.MyApp?我认为这个答案是完美的。+答案是1。@BheshGurung,来自Jareds最后一个示例var requireImports=[MyApp.Object1,MyApp.Object2];我猜他会或可能也会愿意使用这种语法。@Yoshi:这是他尝试过但没有成功的东西。你知道你不能使用你还需要判断它是否定义的东西。这正是我要找的!非常清晰易懂。我正在使用的应用程序使用ExtJS框架,所以我可以fely使用Ext.each可以获得与forEach相同的结果。非常感谢您的帮助!这正是我想要的!非常干净且易于理解。我正在开发的应用程序使用ExtJS框架,因此我能够安全地使用Ext.each来获得与forEach相同的结果。非常感谢您的帮助!以下是基本内容最后,我使用ExtJS处理@Yoshi Here is响应中的forEach 基本上,我使用ExtJS来处理@Yoshi响应中的forEach