js中几个字符串类型容易引起的bug

   在最近工作和刷题中遇到的,随手记录一哈。

   1.
Array.prototype.sort(详看MDN)

        这个是官方数组排序api,比如

const arr = ['b', 'c', 'a'];
arr.sort();
console.log(arr); // arr is ['a', 'b', 'c'] now

字符串类型是好用的,也仿佛是按ASCII顺序排

但是如果arr里是数字类型呢

const arr = [2, 100, 3, '9', 0];
arr.sort();
console.log(arr); // arr is [ 0, 100, 2, 3, '9' ] now

100和位置就不对,排到2前面了。官方说会有一个转字符串的操作,'100' < '2' is true

想要符合预期,就要传一个回调函数,这样就正常了:

const arr = [2, 100, 3, '9', 0];
arr.sort((a, b) => a - b);
console.log(arr); // arr is [ 0, 2, 3, '9', 100 ] now

2.String.prototype.indexOf(详看MDN)

这个不对劲的地方是,如果传入一个null且字符串本身含有null,会返回null的index:

const str = 'This is not a null string';
console.log(str.lastIndexOf('null')); // 14
console.log(str.slice(14, 14 + 4)); // 'null'
console.log(str.indexOf(null)); // 14

 不知道这算不算设计上的问题,所以最好还是在传参数前判断一下。可以试试undefined,好像也会这样,应该是强转成string了(String(null) is 'null', String(undefined) is 'undefined')。

 

3.for in Loop/Object.keys/Object.entries

这些都会把key弄成string类型,本身设计就是这样,但是容易引起困惑,比如自己在构造一个数字作key的obj时候,后面调用起来发现有问题,访问为undefined的情况。

const obj = { 1: 'a', '2': true };
console.log(obj); // { '1': 'a', '2': true }
const index = 1;
console.log(obj[index]);

for (let k in obj) {
    console.log(typeof k); // string
}

console.log(Object.keys(obj)); // [ '1', '2' ]

const arr = [1, 2, 3, 4];

for (let i in arr) {
    console.log(typeof i); // string
}

console.log(Object.entries(arr)); // [ [ '0', 1 ], [ '1', 2 ], [ '2', 3 ], [ '3', 4 ] ]

后面可能确实要试试Map类型和TS来限制一下了。

分享到这里,大家有遇到类似的问题嘛,欢迎评论区补充。

ps: 1024节日快乐!

你可能感兴趣的:(javascript,1024程序员节,javascript,字符串)