zoukankan      html  css  js  c++  java
  • 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 }

  • 相关阅读:
    poj 3636
    poj 1065 Wooden Sticks
    2017北京国庆刷题Day6 afternoon
    2017北京国庆刷题Day5 afternoon
    2017北京国庆刷题Day3 afternoon
    2017北京国庆刷题Day3 morning
    2017北京国庆刷题Day2 afternoon
    2017北京国庆刷题Day2 morning
    poj2420 A Star not a Tree?
    NOIP2016 愤怒的小鸟
  • 原文地址:https://www.cnblogs.com/zhangzs000/p/11147133.html
Copyright © 2011-2022 走看看