开发者问题收集

TypeError:无法从未定义读取属性长度

2022-05-20
2545

我有两个字符串数组,它们可能未定义或已定义某些值。

var a ; // [Array of strings]
var b ; // [Array of strings]
var c; // result array

每当数组 a 或数组 b 已定义且其长度 > 0 时,我需要将一些静态值(如“abc”)推送到第三个数组(如 var c)。但我的脚本中断了,这是下面的代码行。

if((typeof a !== 'undefined' ||typeof b !== 'undefined' ) && (a.length > 0 || b.length > 0) )

当我为“a”分配一些值并且 b 未定义时,上述 loc 失败。错误日志显示以下内容。

by: javax.script.ScriptException: TypeError: Cannot read property \"length\" from undefined\n\tat 

我如何更改此条件以满足我的要求。有没有更好的方法来实现这一点。另外,我使用的是 Rhino JS 引擎 1.13 版。

3个回答

您可以像这样重写它

if((a !== undefined && a.length > 0) || (b !== undefined && b.length > 0)) {
  c = ...
}

以确保您仅在每个变量未定义时才检查其长度。

顺便说一句,如果您使用 'use strict' 模式,则只需使用 a !== undefined 而不是 typeof a !== 'undefined'

Pablo Lozano
2022-05-20

我在您的代码中看到的问题是第一次评估

(typeof a !== 'undefined' ||typeof b !== 'undefined' )

ab'undefined' 时,它返回 true。 例如,想象一个实例,其中 a 未定义,但 b 是一个数组; (typeof a !== 'undefined' ||typeof b !== 'undefined' ) 计算结果为 true

第二次计算使用 OR ( || ) 运算,该运算从左到右开始;

(a.length > 0 || b.length > 0)

首先计算

a.length

a'undefined' ,因此出现错误。

我会使用这个

if((a !== undefined && a.length > 0) || (b !== undefined && b.length > 0)) {
  // Do something
}
Elias Gikonyo
2022-05-20

在 Javascript 中,您还可以使用以下方式检查变量的值是否为 null 或未定义。

我想这会对您有所帮助。试试这个:

if(a?.length > 0 && b?.length > 0){
    // Code here
}
Nikhil
2022-05-20