js 奇怪的结果,不好解释的问题

问题一:

function fn1() {
let i=0;

// 注意:只要这里一传递,到内部函数里面就变成了新的变量,及时改变外部变量,或者全局变量也不会改变。
fn2(i);
console.log('fn1: ',i);
}
function fn2(i){
i--;
console.log('fn2: ',i)
}
fn1()

结果:

fn2: -1
fn1: 0

原因是基本数据类型

function fn1() {
let key = {i: 0};
fn2(key);
console.log('fn1: ',key['i']);
}
function fn2(key){
key['i']--;
console.log('fn2: ',key['i'])
}
fn1()

结果:

fn2: -1
fn1: -1

改成对象的形式就可以2个函数都改变值了

想改变i的值,可以这样用全局变量的形式

let j=0
function fn3(){
fn4()
console.log('fn3 j',j)
}
function fn4(){
j--;
console.log('fn4 j',j);
}
fn3()

结果:

fn4 j -1
fn3 j -1

  

当然也可以通过返回值进行修改。 

//

问题二:

var a = { n: 1 };

var b = a;

a.x = a = { n: 2 }

a.x // -> undefined

b.x // -> { n: 2 }

解释:

首先:. 的优先级 高于 =
a = { n: 1 } -> [栈地址a = 00XXX11] // 00XXX11 对应的值是 { n : 1 }
b = a -> [栈地址b = 00XXX11]
a.x = a = { n: 2 }

先执行 a.x : 00XXX11.x =
从右到左赋值: [栈地址a = 00XXX11] -> [栈地址a = 00XXX22] // 00XXX22 对应的值是 { n : 2 }
返回第一步: 00XXX11.x -> { n: 2 } // [00XXX11 = 00XXX22]
所以: a.x 相当于 00XXX22.x => { n: 2 }.x 输出: undefined ; b.x 相当于 00XXX11.x => { x: { n: 2 } }.x 输出: { n: 2 }

原文地址:https://www.cnblogs.com/zhangzs000/p/11147133.html