date1203面试题

49 阅读1分钟
// 1.
        // var obj = { name: 'Jack' }
        // function fn() {
        //     obj.name = 'Rose';   // 修改的 全局的 obj, 全局obj 被修改为 {name:'rose'}
        //     obj = {};    // 修改全局的 obj, 给一个新的空对象
        //     obj.name = 'Jerry';  // 修改全局的 obj, 给新对象添加一个 name属性 对应的值 jerry
        //     console.log(obj.name);   // Jerry
        // }
        // fn()
        // console.log(obj.name);   // Jerry




        // // 2.
        // var obj = { name: 'Jack' }
        // function fn() {
        //     obj.name = 'Rose'   // 此时 obj 因为变量提升只提升定义, 所以为 undefined , 所以这里报错
        //     var obj = {}
        //     obj.name = 'Jerry'
        //     console.log(obj.name)   // Jerry
        // }
        // fn()
        // console.log(obj.name)   // Jack

        // /*
        //     自己写的代码:
        //     function fn() {
        //         obj.name = 'Rose'
        //         var obj = {}
        //         obj.name = 'Jerry'
        //         console.log(obj.name)   // 
        //     }

        //     预解析
        //     function fn() {
        //         obj.name = 'Rose'   // 不需要
        //         var obj = {}        // 需要
        //         obj.name = 'Jerry'  // 不需要
        //         console.log(obj.name)   // 不需要
        //     }

        //     变量提升后
        //     function fn() {
        //         var obj;            ---> undefined
        //         obj.name = 'Rose'   ---> undefined.name
        //         obj = {}
        //         obj.name = 'Jerry'
        //         console.log()
        //     }
        // */


        // // 3.
        // var obj = { name: 'Jack' }
        // function fn(obj) {
        //     obj.name = 'Rose'   // 参数 obj 的 name 属性修改为 Rose, 因为引用数据类型传参, 传的是地址, 所以会影响外部的对象
        //     var obj = {}    // 参数 obj 重新赋值为, 现在 参数obj的引用地址, 和全局对象obj的引用地址, 已经不一样了
        //     obj.name = 'Jerry'  // 参数 obj 对象 添加一个属性 name 值为 Jerry
        //     console.log(obj.name)   // 参数 obj 对象的 name ---> Jerry
        // }
        // fn(obj)
        // console.log(obj.name)   // Rose

        /*
            自己写的
                function fn(obj) {
                    obj.name = 'Rose'
                    var obj = {}
                    obj.name = 'Jerry'
                    console.log(obj.name)   // 
                }

            预解析
            function fn(obj) {
                obj.name = 'Rose'       // 不需要
                var obj = {}            // 需要
                obj.name = 'Jerry'      // 不需要
                console.log(obj.name)   // 不需要
            }
            变量提升后
            function fn(obj) {
                var obj;            ---> undefined
                obj.name = 'Rose'
                obj = {}
                obj.name = 'Jerry'
                console.log(obj.name)
            }
        */

        // // 4.
        var obj = { name: 'Jack' }
        function fn(obj) {
            obj.name = 'Rose'   // 参数 obj 的name属性 修改为 Rose, 因为传参是引用数据类型, 所以是传递的地址, 所以这里会改变外部对象的属性
            obj = {}    // 参数 obj 重新赋值为空对象, 相当于 更改它内部的 引用地址, 此时参数obj和全局obj不是一个引用地址
            obj.name = 'Jerry'  // 参数obj新增一个 name 属性 值为 Jerry
            console.log(obj.name)   // 参数 obj.name    ---> Jerry
        }
        fn(obj)
        console.log(obj.name)   // 全局obj ---> Rose