当数据为null时,Javascript代码会中断

时间:2017-01-23 20:53:56

标签: javascript

我正在使用以下代码,该代码效果很好但完全停止工作时#34; thsub"为null并且不会继续读取其余数据,只返回一个TypeError,表示" thsub in null"

以下是代码:

part2 = part[:] #This will create a copy
part2.remove(p1)
happ = p1 + ' ' + random.choice(acon) + ' ' + random.choice(part2)

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

它会因为您引用thsub的{​​{1}}属性而中断。由于length没有属性,而且不能,这将引发错误。在这种情况下以及您使用null的所有其他情况下,这可以通过添加某种条件来轻松解决,这些条件会破坏循环或避免执行代码。

这是一个简单的例子:

null

注意添加的for (var l = 0, m = data.cars.length; l < m; l++) { if (data.cars[l].thsub) { for (var i = 0, j = data.cars[l].thsub.length; i < j; i++) { if (data.cars[l].thsub[i].stats) { thCount[l]+=data.cars[l].thsub[i].stats.items; } } } } - 如果此值为null,则条件将评估为false,并且异常引起的代码将永远不会执行。

答案 1 :(得分:1)

只需在访问属性之前添加保护条件,如果您尝试在nullundefined对象上调用属性,则会引发错误。

for (var l = 0, m = data.cars.length; l < m; l++) {
  thCount[l] = 0;
  let tsubs = data.cars[l].thsub || []; <--- Guard condition
  for (var i = 0, j = tsubs.length; i < j; i++) {
    if (data.cars[l].thsub[i].stats) {
      thCount[l] += data.cars[l].thsub[i].stats.items;
    }
  }
}

在固定用例中,当属性访问返回虚假值时,tsubs将被设置为空数组。

答案 2 :(得分:1)

你的循环正在检查thsub的长度属性。如果thsub为null,那么您的代码正在尝试检查空对象的属性(长度),这将始终破坏您的代码。尝试在检查长度之前添加对thsub对象本身的检查:

for (var l = 0, m = data.cars.length; l < m; l++) {
  thCount[l] = 0;
  if (data.cars[l].thsub) {
    for (var i = 0, j = data.cars[l].thsub.length; i < j; i++) {
      if (data.cars[l].thsub[i].stats) {
        thCount[l]+=data.cars[l].thsub[i].stats.items;
      }
    }
  }
}

工作样本:

https://jsfiddle.net/mspinks/bwmwntay/5/

答案 3 :(得分:0)

首先检查thsub变量:

var thsub;

for (var l = 0, m = data.cars.length; l < m; l++) {
  thCount[l] = 0;
  thsub = data.cars[l].thsub;

  if (!(thsub instanceof Array)) continue; // If it's not an array, skip it.

  for (var i = 0, j = thsub.length; i < j; i++) {
    if (!thsub[i].stats) continue; // If it doesn't contain 'stats', skip it.

    thCount[l] += thsub[i].stats.items;
  }
}