JavaScript中indexOf()的使用规范

问题遇到的现象和发生背景

写的代码是想把一段字符串中的字母,不重复地添加到一个新数组中,
使用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);
    }
}
运行结果及报错内容

img

我的解答思路和尝试过的方法

首先我根据报错内容尝试了用函数封装(虽然我也不知道为什么需要这样),并且改了一些命名:

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 不是一个函数

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

arr.push(p)本身就能改变arr,不用赋值给arr

数组的push方法修改数组内容的同时,将返回当前push的数据。

由于题主压入的是字符,第一次执行赋值后arr变为字符,不再是数组,没有push方法,再次执行就报错了。

去重可以split下再用Set数组结构去重

img

var str = 'abcoefoxyozzopp';
var arr = Array.from(new Set(str.split('')));
console.log(arr)

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632