1

如果我们有一个不存在的数组并且我们检查数组的值,它会给我一个错误。“未定义变量”

例如我有:

var arr = new Array();

arr['house']['rooms'] = 2;

我用

if ( typeof arr['plane']['room'] != 'undefined' ) )

它说 arr['plane'] 未定义...

我不想用这个:

if ( typeof arr['plane'] != 'undefined' ) ) {
    if ( typeof arr['plane']['room'] != 'undefined' ) {

    }
}

在 php 中,我使用了对我很好的 isset,我在谷歌上搜索了很多以找到答案,但我不能......

4

3 回答 3

1

要意识到的是,javascript 中没有多维数组。使数组元素包含一个数组并使用它很容易,但是您所做的所有引用都必须使用该考虑因素。

所以,你可以做

arr = [];  // or more appropriately {}, but I'll get to that soon
arr['house'] = [];
arr['house']['rooms'] = 2;

但是做

arr['house']['rooms'] = 2;

应该给你一个错误,除非你已经定义了arrand arr['house']

如果您已定义arr但未定义arr['house'],则引用它是有效的语法arr['house']- 但返回值将(适当地)为undefined.

这就是你在看的地方arr['plane']['room']arr已定义,所以没关系,但arr['plane']返回未定义,并且引用undefined.['room']会引发错误。

如果您想避免错误并拥有多个参考级别,则必须确保除最低级别之外的所有级别都存在。

你被困住了if (arr && arr['plane'] && arr['plane']['room'])

或者可能if (arr && arr['plane'] && room in arr['plane']会更准确,具体取决于您的需要。第一个将检查是否arr['plane']['room']具有真值,而第二个将检查是否arr['plane']['room']存在(并且可能具有假值)。

数组与对象

数组和对象非常相似,都可以用[]符号来访问,所以它有点令人困惑,但从技术上讲,你正在使用数组的对象方面来做你正在做的事情。请记住,所有数组(以及除基元之外的所有内容 - 数字、字符串和布尔值)都是对象,因此数组可以做对象可以做的所有事情,甚至更多。但数组只适用于数字索引,即 arr[1][2]。当您使用字符串引用数组时,您正在尝试访问与该字符串匹配的基础对象的成员。

但在这种情况下,这并不重要。没有多维数组或对象。

[]对象符号只是一种使用变量检查对象成员的方法。arr['plane']['rooms'] 实际上等价于arr.plane.rooms. 但也许该arr.plane.room符号将有助于更清楚地说明您必须首先检查arr.plane(and arr) 的原因。

于 2013-10-29T15:19:33.717 回答
0

如果要测试对象是否存在,请使用以下命令:

if ( 'plane' in arr && 'room' in arr.plane ) {
    // Do something
}
于 2013-10-29T15:07:45.167 回答
0

这不是一个数组,而是一个对象,也就是associative array. 你可以这样声明:

var aarr = { house: { rooms: 2 } };

现在你可以这样做:

if (aarr.house && aarr.house.rooms) {/* do stuff */ } 

或者更丑,但更短:

if ((aarr.house || {}).rooms) {/* do stuff */ } 

另见...

要更一般地遍历对象以在其中找到路径,您可以使用:

Object.tryPath = function(obj,path) {
    path = path.split(/[.,]/);
    while (path.length && obj) {
      obj = obj[path.shift()];
    }
    return obj || null;
};
Object.tryPath(aarr,'house.rooms'); //=> 2
Object.tryPath(aarr,'house.cellar.cupboard.shelf3'); //=> null

提琴手

于 2013-10-29T15:21:06.660 回答