JavaScript API响应-检查变量是否存在

JavaScript API响应-检查变量是否存在,javascript,Javascript,在API响应中,我想检查变量是否存在。如果没有,我希望为其指定一个空值: if(!data3.fields[i+2].values.value[0]) { data3.fields[i+2].values.value[0] = ""; } else { break; } 控制台中的错误为: 未捕获的TypeError:无法读取未定义的属性“值” 这让我很困惑,因为我认为这正是我的观点,如果这句话是正确的。你知道这里发生了什么吗?它不像PHP那样工作(它检查整个“链”)。在您的示例中,实

在API响应中,我想检查变量是否存在。如果没有,我希望为其指定一个空值:

if(!data3.fields[i+2].values.value[0]) {
  data3.fields[i+2].values.value[0] = "";
} else {
  break;
}
控制台中的错误为:

未捕获的TypeError:无法读取未定义的属性“值”


这让我很困惑,因为我认为这正是我的观点,如果这句话是正确的。你知道这里发生了什么吗?

它不像PHP那样工作(它检查整个“链”)。在您的示例中,实际上检查
值的
值[0]
是否存在,但不检查
值是否存在。完整版本应为:

  if( data3 && && data3.fields[i+2] && data3.fields[i+2].values && !data3.fields[i+2].values.value[0]) {}
在代码
ata3.字段[i+2]中,值
未定义,您正试图访问“未定义”的
值[0]


或者更简单一点,如果您想测试
d
是否有值,您必须确保
a
b
c
aldo有值:

if( a && a.b && a.b.c && !a.b.c.d){ /* ... */ }
如果确定存在检查,则可以删除检查左侧的检查。例如:如果您知道
a.b
始终存在,您可以简单地说:

if( a.b.c && !a.b.c.d){ /* ... */ }

如果确实要确保完整的属性链没有未定义,则必须检查每个步骤,如果至少
&&
条件为false,则不会执行后续步骤

if (data3 && data3.fields && data3.fields[i+2] && data3.fields[i+2].values && data3.fields[i+2].values.value && data3.fields[i + 2].values.value[0]) {
  data3.fields[i + 2].values.value[0] = "";
} else {
  break;
}
另一种方法是执行此操作并捕获异常:

try {
  data3.fields[i + 2].values.value[0] = "";
} catch (e) {
  break;
}

错误告诉您
data3.fields[i+2]。值
未定义。无法在
未定义的
上检查属性
.value

if (data3.fields[i+2] === undefined) {
  data3.fields[i+2] = {
    values: {
      value: ['']
    }
  };
}
如果您总是希望嵌套路径默认为空字符串,则需要验证每个属性/索引在此过程中所属

if (data3.fields[i+2] === undefined) {
  data.fields[i+2] = {};
}

if (data3.fields[i+2].values === undefined) {
  data3.fields[i+2].values = {};
}

if (data3.fields[i+2].values.value === undefined) {
  data3.fields[i+2].values.value = [];
}

// and finally your empty string assignment
if (data3.fields[i+2].values.value[0] === undefined) {
  data3.fields[i+2].values.value[0] = '';
}

根据您的需求,您可能可以在知道
data3后立即分配存根。字段[i+2]
未定义的

if (data3.fields[i+2] === undefined) {
  data3.fields[i+2] = {
    values: {
      value: ['']
    }
  };
}

if
检查无法防止您尝试使用未定义的变量。在您的实例中,
values
属性是
undefined
。如果您想测试它,您需要首先检查该特定属性

if(data3.fields[i+2].values !== undefined && data3.fields[i+2].values.value[0]){
   //do something with data3.fields[i+2].values.value[0]
}
此外,如果您处于甚至不知道data3是否存在的场景中(例如,您正在检查环境中是否存在第三方脚本或其他内容),则需要使用
typeof
运算符以确保安全。例如

if(typeof(ga) !== 'undefined'){ //typeof returns a string. This would be testing for google analytics on a page.

数据
字段
字段[i+2]
都可能在该查询中未定义,如果其中任何一个为
,则可能会出现重复情况。如果需要容纳空值,则条件的限制性会降低。在OPs问题中,
data3.fields[i+2]
未定义的
,不是空的,所以后面的所有内容都是空的。如果只替换“代码”>“(DATA3.Field[i+1]==未定义)< /COD> < <代码> >(DATA3.Field[i+1])/代码>它将迎合博思,我想使用一些类似于Loasy'的东西!数据3.字段[i+2]
,但这样的更改也会捕获
false
'
0
,等等。。。