在最近工作和刷题中遇到的,随手记录一哈。
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节日快乐!