Javascript 检查是否在JS中设置了数组项

Javascript 检查是否在JS中设置了数组项,javascript,arrays,isset,Javascript,Arrays,Isset,我有一个数组 var assoc_pagine = new Array(); assoc_pagine["home"]=0; assoc_pagine["about"]=1; assoc_pagine["work"]=2; 我试过了 if (assoc_pagine[var] != "undefined") { 但它似乎不起作用 我正在使用jquery,我不知道它是否有帮助 谢谢使用中的关键字测试对象中是否定义了属性 if (assoc_var in

我有一个数组

    var assoc_pagine = new Array();
    assoc_pagine["home"]=0;
    assoc_pagine["about"]=1;
    assoc_pagine["work"]=2;
我试过了

    if (assoc_pagine[var] != "undefined") {
但它似乎不起作用

我正在使用jquery,我不知道它是否有帮助


谢谢

使用中的关键字测试对象中是否定义了属性

if (assoc_var in assoc_pagine)


这里有很多问题

首先,
var
是否假定变量的值为“home”、“work”或“about”?或者你的意思是检查一个叫做“var”的实际属性

如果
var
应该是一个具有字符串值的变量,请注意
var
在JavaScript中是一个保留字,您需要使用另一个名称,例如
assoc\u var

var assoc_var = "home";
assoc_pagine[assoc_var] // equals 0 in your example
如果您想检查名为“var”的属性,那么只需将其放在引号中即可

assoc_pagine["var"]
然后,
未定义的
未定义的
不同。您需要
typeof
来获取对象类型的字符串表示形式

这是所有步骤的分解

var assoc_var = "home"; 
var value = assoc_pagine[assoc_var]; // 0
var typeofValue = typeof value; // "number"
所以要解决你的问题

if (typeof assoc_pagine[assoc_var] != "undefined") 

更新:如其他答案所示,使用数组并不是解决此问题的最佳方法。考虑使用<强>对象< /强>。

var assoc_pagine = new Object();
assoc_pagine["home"]=0;
assoc_pagine["about"]=1;
assoc_pagine["work"]=2;

var是一个语句。。。所以这是一个保留字。。。所以换个说法吧。 这是一种更好的方法

不要为此使用
数组。数组用于数字索引列表。只需使用一个普通的
对象(
{}

您对
“未定义”
字符串的想法可能是:

if (typeof assoc_pagine[key]!=='undefined')
这(或多或少)等于说

if (assoc_pagine[key]!==undefined)
然而,不管怎样,这都有点难看。您正在解引用一个可能不存在的键(这在任何更合理的语言中都是一个错误),并且依赖JavaScript的奇怪技巧,为不存在的属性提供特殊的
未定义的

这也不能告诉您该属性是否真的不存在,或者它是否存在,而是显式地设置为
undefined

这是一种更明确、可读性更好、更全面的方法:

if (key in assoc_pagine)
这不是一个数组。 最好这样声明:

var assoc_pagine = {};
assoc_pagine["home"]=0;
assoc_pagine["about"]=1;
assoc_pagine["work"]=2;
if('work' in assoc_pagine){
   // do your thing
};

要检查对象是否包含某个标签,只需执行以下操作:

var assoc_pagine = {};
assoc_pagine["home"]=0;
assoc_pagine["about"]=1;
assoc_pagine["work"]=2;
if('work' in assoc_pagine){
   // do your thing
};

TLDR;我能想到的最好的方法是:(根据您的用例,有许多方法可以优化此函数。)

另一个答案的例子非常接近,将用于某些(可能是大多数)目的,但由于我在下面解释的原因,在技术上是非常不正确的

Javascript数组只使用“数字”键。在数组上设置“关联键”时,实际上是在该数组对象上设置属性,而不是该数组的元素。例如,这意味着在使用Array.forEach()时不会迭代“关联键”,并且在计算Array.length时也不会包含该键。(例外情况是像“0”这样的字符串将解析为数组的元素,但像“0”这样的字符串不会。)

此外,检查不存在的数组元素或对象属性时,其计算结果为未定义,但这实际上并不会告诉您尚未设置数组元素或对象属性。例如,undefined也是通过调用不以return语句终止的函数得到的结果。这可能会导致一些奇怪的错误和调试代码的困难

这可能会让人困惑,但可以使用浏览器的javascript控制台轻松地进行探索。(我使用了chrome,每个注释都表示前面一行的评估值。)

这表明关联键不是用于访问数组中的元素,而是用于访问对象的属性

foo[0] = 0;
//0
foo;
//[0]
foo.length;
//1
foo[2] = undefined
//undefined
typeof foo[2]
//"undefined"
foo.length
//3
这表明检查typeof不允许您查看是否已设置元素

var foo = new Array();
//undefined
foo;
//[]
foo[0] = 0;
//0
foo['0']
//0
foo[' 0']
//undefined
这显示了我上面提到的异常,以及为什么不能只使用parseInt()

如果要使用关联数组,最好像其他答案所建议的那样使用简单对象

if (assoc_pagine.indexOf('home') > -1) {
   // we have home element in the assoc_pagine array
}

最有效的方法是:

if (array.indexOf(element) > -1) {
   alert('Bingooo')
}
这对我很有效

if (assoc_pagine[var] != undefined) {
而是这个

if (assoc_pagine[var] != "undefined") {

唯一的答案似乎解决了将数组用作关联数组的明显问题+1(话虽如此,但它确实有效,因为
Array
Object
的一个子类。除了在原型上加载更多可能发生冲突的属性外,它没有任何作用。)您希望使用“hasOwnProperty”而不是“in”,因为“in”也会检查继承的属性。(例如,'hasOwnProperty in{}==true)Oops,忽略了Bobinces答案,它告诉您所有的一切,而不是您想知道的。这个答案确实解决了OP所需的用例,但是您希望使用'hasOwnProperty'而不是'in',因为'in'还检查继承的属性。(例如,{}==true中的hasOwnProperty)有人能解释我为什么是-2吗?@ErickRobertson这个答案可能很简单,但也不正确。谢谢,@Omn!这个回答对我来说很有效,但我发现有一个更简单的答案。不幸的是,它被埋藏在公认答案的底部。所以我把它移到了顶部,现在它更清晰了!“
var
是JavaScript中的保留字”应为first@jozxqk,修正了。还有一点清理。-1这真是一团糟。很难从中找到答案。我只想知道如何检查数组项是否在Javascript中设置。这就是我搜索以找到此答案的内容,这是一个质量非常低的答案。您希望使用“hasOwnProperty”而不是“in”,因为“in”也会检查继承的属性。(例如,{}==true中的hasOwnProperty)在像这样的对象上定义
var obj={}更好
,建议不要使用
new
关键字创建空对象。javascript中的数组不使用关联键。在数组上设置“关联键”时,实际上是在数组上设置属性
var foo = new Array();
//undefined
foo;
//[]
foo[0] = 0;
//0
foo['0']
//0
foo[' 0']
//undefined
if (assoc_pagine.indexOf('home') > -1) {
   // we have home element in the assoc_pagine array
}
if (array.indexOf(element) > -1) {
   alert('Bingooo')
}
if (assoc_pagine[var] != undefined) {
if (assoc_pagine[var] != "undefined") {