- arguments
arguments并不是一个真正的数组,而是一个“类似数组(array-like)”的对象,因为arguments拥有一个length属性,但它缺少所有的数组方法。
并且,我们就算是接受到参数了,arguments还是会把所有的参数放在里面
- 为什么传过去i定时器定时输出1s还是会一下子全输出出来?
例如:
let arr = [1, 2, 2, 3]
for(let i = 0;i < arr.length;++i) {
setTimeout(() => {
console.log(arr[i]);
},1000)
}
虽然输出1223,但是几乎是同时输出
这是因为for循环是主线程,执行完后再执行异步的setTimeout,此时每一次for循环里setTimout里的函数已经执行,但是都是延迟1s,所以会导致一下子全部输出。也就是说,定时器的执行机制并不会等上一个定时器的定时结束了再执行下一个定时器,而是都执行了。
举个例子:
console.log(1)
async function han() {
await console.log(2)
setTimeout(() => {
console.log(5)
}, 1000)
}
async function test() {
await console.log(3)
setTimeout(() => {
console.log(6)
}, 1000)
}
han()
test()
console.log(4)
//1 2 3 4 5 6 注意5和6是基本同时输出的
解决方法:
let arr = [1, 2, 2, 3]
for(let i = 0;i < arr.length;++i) {
setTimeout(() => {
console.log(arr[i]);
},i * 1000)
}
都延迟倍数的秒数,这样即可实现当我们开始执行setTimeout的内容时,是延迟分别1s
- 字符串截取
substring():从某个位置截取到结束位置,如果第二个不写,则到末尾.包左且包右
slice():从某个位置截取到结束位置,如果第二个不写,则到末尾.包左但不包右
substr():从某个位置开始截取几个字符,如果第二个参数length不写,则到末尾
4. 今天写数组去重的时候发现一个问题
push不行,那我就试试concat
let arr = [1, 2, 2, 3, 3].reduce((pre, curr) => {
console.log(pre, pre instanceof Array)
return pre.includes(curr) ? pre : pre.concat(curr)
}, [])
console.log(arr)//[1,2,3]
发现竟然神奇的可以了!
这个原因我觉得是,pre作为过去的数据,是无法去更改的,不然有点乱套,而我们如果用的concat,他是非响应式的方法,会返回一个新数组return出去,所以应该是允许的