2017-02-14 60 views
-2

我得到这个例外在下面的代码:类型错误:无法读取 财产“的toString”的未定义原因不明的JavaScript错误

for (var key in obj) { 
    var val = obj[key]; 
    var s = val.toString(); 
} 

怎么可能为VAL在这段代码是不确定的?

我没有实际数据的日志,所以我不确定obj中是什么,但它是从JSON构建的,我没有JSON输入。

这才是真正的全码:

function deepMatchKeyword(obj, keyword) { 
    for (var key in obj) { 
     var val = obj[key]; 
     if (typeof val == 'object' && !(val instanceof Array)) { 
      if (deepMatchKeyword(val, keyword)) 
       return true; 
     } else { 
      var s = val.toString(); 
      if (s.toLowerCase().includes(keyword)) 
       return true; 
     } 
    } 
    return false; 
} 
+0

它并不是真正无法解释的,'val'没有被定义,可能是因为obj [key]没有被定义为 – adeneo

+1

'var obj = {a:undefined};'? –

回答

2

How is it possible for val to be undefined in this code?

变得非常容易。 undefined是一个像任何其他值一样的值,可以分配给一个属性。

for ... in处理可枚举的属性,而不仅仅是具有已定义值的属性。

var obj = { 
 
    someProperty: undefined 
 
}; 
 

 

 
for (var key in obj) { 
 
    var val = obj[key]; 
 
    var s = val.toString(); 
 
}

+0

哦,对,这很有道理。我不认为JSON.parse会返回类似的东西,但我确实有一些后处理的东西可能会导致这种情况。 –

0

这是很常见的,不仅包括性循环中的hasOwnProperty检查,以避免枚举的属性从对象的原型链继承。

// obj is defined earlier 

for (var key in obj) { 
    if (obj.hasOwnProperty(key)) { 
     var val = obj[key]; 
     var s = val.toString(); 
    } 
} 

参见例如, for..in and hasOwnProperty