分类 JavaScript 下的文章

const arr = [10,12,15,21];

/**结果:
 * Index: 4, element: undefined
 * Index: 4, element: undefined
 * Index: 4, element: undefined
 * Index: 4, element: undefined
 */
for (var i = 0; i < arr.length; i++){
    setTimeout(function(){
        console.log('Index: ' + i + ', element: ' + arr[i]);
    }, 3000);
}

/**
 * 下面3个,都是正确结果:
 * Index: 0, element: 10
 * Index: 1, element: 12
 * Index: 2, element: 15
 * Index: 3, element: 21
 */
for (var i = 0; i < arr.length; i++){
    setTimeout(function(i2){
        return function(){
            console.log('Index: ' + i2 + ', element: ' + arr[i2]);
        }
    }(i), 3000);
}

for (let i = 0; i < arr.length; i++){
    setTimeout(function(){
        console.log('Index: ' + i + ', element: ' + arr[i]);
    }, 3000);
}

for (var i = 0; i < arr.length; i++){
    (setTimeout(function(j){
        console.log('Index: ' + j + ', element: ' + arr[j]);
    }, 3000))(i);
}

- 阅读剩余部分 -

复制操作符=,其实这个很简单的东西,但如果深究起来,那也还是需要一些精力去理解的。

C语言是有指针的,也就是pointer。但Java没有,JavaScript也没有,其实不是没有,而是很多高级语言是不允许你直接操作内存数据的,为了安全,也为了方便。

最近刷leetcode,遇到一个小问题,21. Merge Two Sorted Lists

解法比较简单,先设置一个变量,比如叫做dummy,let dummy = {val = 0, next= null},然后再把dummy赋值给另一个变量,比如叫做runner。然后,对这个runner进行各种操作,最后返回dummy.next

这个就比较费解了。

其实原因呢,就是dummy这个变量指向了一个内存里的地址,把dummy赋值给runner之后,runner也指向了内存中的这个地址。
但后来,操作runner这个变量名,改变了内存里变量的一个小小的属性,就是next,其实这时dummy.next也肯定是变了。
再后来,直接改变了runner,让它指向新的内存地址,最后反正是生成了一个新的linked list

所以最后返回dummy.next,其实就是runner第一次改变了next属性后,next指向的第一个新的node,也就是新生成的linked list的第一个node

完。