JavaScript解构赋值的顺序问题

今天在写算法题(缺失的正数)的时候,发现解构赋值的书写顺序影响了最终得结果,故在此作记录。

var firstMissingPositive = function(nums){
    let n=nums.length;
    for(let i=0;i<n;i++){
        while(nums[i]<n+1 && nums[i]>0 && nums[i]!=nums[nums[i]-1])
            [nums[nums[i]-1],nums[i]] = [nums[i],nums[nums[i]-1]]; //正确的代码
            [nums[i],nums[nums[i]-1]] = [nums[nums[i]-1],nums[i]]; //错误的写法
    }
    for(let i=0;i<n;i++){
        if(nums[i]!=i+1)return i+1;
    }
    return n+1;
};

解构赋值的执行流程是:
1.先完全计算右侧表达式的值(一次性求值,不会变)。
2.再按顺序计算左侧每个目标表达式的地址(即索引表达式),然后赋值。

结合上面的代码,我们来分析错误的式子:[nums[i],nums[nums[i]-1]] = [nums[nums[i]-1],nums[i]]
1.假设输入的nums为[3,4,-1,1],i为0时,即[nums[0],nums[nums[0]-1]] = [nums[nums[0]-1],nums[0]]
2.经过第一步解构,错误的式子会被转换成[nums[0],nums[nums[0]-1]] = [-1,3]
3.接下来左边的表达式会从左到右计算,这里会先读取nums[0]的地址并赋值为-1,导致后续nums[nums[0]-1]变成了nums[-2]地址计算出错。

总结:有可能被别的赋值影响的表达式要尽量往左侧放提高优先级。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值