为什么我得到“未捕获的类型错误:无法读取未定义(...)的属性'长度'".
Why do I get "Uncaught TypeError: Cannot read property 'length' of undefined(…)"?
错误消息:未捕获的类型错误:无法读取未定义(...)的属性"长度"
第44 行,第 23 列
我已经阅读了我能找到的与此错误相关的每篇帖子,但没有找到适用于这种情况的任何内容。
我试图把一个字符串变成一个数组数组,它的格式被格式化为步骤的形式(codewars的kata);一个单词横跨,下一个单词向下,依此类推。我遇到的问题是我不断收到一个未捕获的类型错误:尝试在 for 循环中使用数组元素的长度时,无法读取 undefined(...) 的属性"长度"。所以在这个嵌套循环中:
for(var i = 0; i < masterStringOdd.length; i++){
temp2 = proArr.slice(0);
start2 = even[i].length - 1;
for(let j = 0; j < odd[i].length; j++){
let replace2 = masterStringOdd.charAt(i);
Array.prototype.splice.apply(temp2, [start2, 1].concat(replace2));
finalOdd.push(temp2);
}
start2 += even[i+1].length - 1;
}
最后一行是"start2 += 偶数[i+1].length - 1;"(我已经尝试了大约一千种不同的)我收到错误,但是如果我返回该行"返回偶数[i+1].length - 1;"我得到 5,这是正确的长度。如果有人想看它,我的完整代码在这封电子邮件的末尾,相信我,我知道这是荒谬和尴尬的(工作代码和完全未经修饰) - 手头的技能等等。
只是无法弄清楚为什么在这种情况下我无法获取和使用元素长度的值。任何帮助将不胜感激。
function wordStep(str) {
let array = str.split(" ");
let even = [], odd = [], proArr = [], finalEven = [], finalOdd = [];
//for loop to create sperate arrays for across and down
for (let i = 0; i < array.length; i++){
if (i%2 === 0){
even.push(array[i]);
} else {
odd.push(array[i].slice(1,-1));
}
}
//data collection and tool variables, might delete them if the are not needed
let finalLength = even.join("").toString().length - (even.length - 1);
let masterStringEven = even.join("").toString();
let yAxis = odd.join("").toString().length;
let masterStringOdd = odd.join("").toString();
//for loop to create protype array
for (let i = 0; i < finalLength; i++){
proArr.push(",");
}
// for loop to create final evens arrays
let start = 0;
for(let i = 0; i < even.length; i++){
let temp1 = proArr.slice(0);
let replace = even[i].split("");
Array.prototype.splice.apply(temp1, [start, replace.length].concat(replace));
finalEven.push(temp1);
start += replace.length-1;;
}
// nested loops for final odds' array
let temp2 = []
let start2 = 0;
for(var i = 0; i < masterStringOdd.length; i++){
temp2 = proArr.slice(0);
start2 = even[i].length - 1;
for(let j = 0; j < odd[i].length; j++){
let replace2 = masterStringOdd.charAt(i);
Array.prototype.splice.apply(temp2, [start2, 1].concat(replace2));
finalOdd.push(temp2);
}
start2 += even[i+1].length - 1;
}
}
从根本上说,正在发生的事情是你正在经过even
数组的末尾,所以even[i]
给你undefined
,然后你尝试读取undefined
的length
,这会导致错误。
事实上,我们可以在这个循环中看到这一点:
for(var i = 0; i < masterStringOdd.length; i++){
temp2 = proArr.slice(0);
start2 = even[i].length - 1;
for(let j = 0; j < odd[i].length; j++){
let replace2 = masterStringOdd.charAt(i);
Array.prototype.splice.apply(temp2, [start2, 1].concat(replace2));
finalOdd.push(temp2);
}
start2 += even[i+1].length - 1;
}
。您假设masterStringOdd.length
将始终小于 even.length
。代码中没有任何内容可以确保这一点,事实上,它通常不是真的。 masterStringOdd.length
是作为字符串连接在一起的 odd
数组条目的长度; even.length
是even
条目的数量。因此,even.length
可能至少没有masterStringOdd.length
那么大有两个原因:1。后者是字符串的长度,而不是数组;和 2.后者与odd
有关,而不是even
。
代码的问题在于,在访问偶数组和奇数组之前,您没有检查它们的长度。如果您在 wordStep(str) 中有 str 值,并且不会在您访问这些数组的索引处推送这些数组中的值,这将产生问题。
对特定索引处的数组进行适当的数组长度检查以访问数组。
for(var i = 0; i < masterStringOdd.length; i++){
temp2 = proArr.slice(0);
if(even.legth > i)
start2 = even[i].length - 1;
if(odd.length > i){
for(let j = 0; j < odd[i].length; j++){
let replace2 = masterStringOdd.charAt(i);
Array.prototype.splice.apply(temp2, [start2, 1].concat(replace2));
finalOdd.push(temp2);
}
}
if(even.length > i +1)
{
console.log(even.length);
start2 += even[i+1].length - 1;
}
}
例如wordStep("生活对我们有益"); 此调用将正确填充数组,并且您不会收到任何错误。
但如果它的wordStep("生活良好");,如果不应用适当的长度检查,您将在代码中看到问题
要验证的 plunker : http://plnkr.co/edit/QQovAAzlDhXgucikCGAb?p=preview
- TypeError:无法读取属性'推'未定义的JavaScript
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 未捕获的类型错误:无法读取属性'删除'的未定义
- AngularJS指令出错-无法读取属性'编译'的未定义
- 看到“;未捕获的类型错误:无法读取属性'weight'未定义的“;尽管按照字面上的指示
- angularjs无法读取未定义的属性then
- 无法读取属性'材料'未定义的Three.js
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- JavaScript承诺-无法读取属性'那么'的未定义
- 未捕获的类型错误:无法读取属性'中止'的未定义
- 角度推入数组给出:TypeError:无法读取属性'推'的未定义
- Javascript未捕获类型错误:无法读取属性'0'的未定义
- jQuery控制台错误:无法读取属性'top'的未定义
- TypeError:无法读取属性'findAll'的未定义
- 无法读取属性'errcap'未定义的jqgrid
- 无法读取未定义的属性“rid”
- 未捕获的类型错误: 无法读取未定义的属性“图像”
- 可以't读取'getHTML'未定义的Liferay CK Editor内容
- 在node.js中未定义读取属性错误