写的代码是想把一段字符串中的字母,不重复地添加到一个新数组中,
使用indexOf(),是想判断某个字符是否已存在于新数组中。
问题代码:
var str = 'abcoefoxyozzopp';
var arr = [];
var p;
for (var i = 0; i <= str.length; i++) {
p = str.charAt(i);
if (arr.indexOf(p) === -1) {
arr = arr.push(p);
}
}
首先我根据报错内容尝试了用函数封装(虽然我也不知道为什么需要这样),并且改了一些命名:
function add(str) {
var arr = [];
var letter;
for (var i = 0; i < str.length; i++) {
letter = str.charAt(i);
if (arr.indexOf(letter) === -1) {
arr.push(letter);
}
}
return arr;
}
var str = add('abcoefoxyozzopp');
console.log(str);
结果成功了:
Array(10) [ "a", "b", "c", "o", "e", "f", "x", "y", "z", "p" ]
之后我又试了一下不封装函数,只改命名,也成功了。
var str = 'abcoefoxyozzopp';
var arr = [];
var letter;
for (var i = 0; i < str.length; i++) {
letter = str.charAt(i);
if (arr.indexOf(letter) === -1) {
arr.push(letter);
}
}
console.log(arr);
百思不得其解,最后我一 一对照,发现是第七行造成的差异。
arr = arr.push(letter);
//报错
arr.push(letter);
//不报错
我想问的就是,为什么第七行的差异会影响第六行;还有为什么报错内容会是“is not a function”。
因为push()是直接修改原数组, 不是返回新的数组
push()的返回值是添加元素之后数组的长度
var arr = ["a","b"];
arr = arr.push("c");
console.log(arr); //输出数组长度3
这时arr 是数值类型
数值类型没有 indexOf() 方法, 访问arr.indexOf会返回 undefined
你下次循环调用 arr.indexOf() 就等于是调用undefined()
undefined 不是一个函数, 不能在之后加()调用,就会报错“arr.indexOf is not a function”。
意思就是 arr.indexOf 不是一个函数
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
arr.push(p)本身就能改变arr,不用赋值给arr
数组的push方法修改数组内容的同时,将返回当前push的数据。
由于题主压入的是字符,第一次执行赋值后arr变为字符,不再是数组,没有push方法,再次执行就报错了。
去重可以split下再用Set数组结构去重
var str = 'abcoefoxyozzopp';
var arr = Array.from(new Set(str.split('')));
console.log(arr)