zoukankan      html  css  js  c++  java
  • 面试题-JS中的作用域相关问题

    对象类型:

    • 原始数据类型存储的是值,而对象类型存储的是地址(指针)。下面的这个例子就比较有意思了。

    先看题:  

     function test(person) {
      person.age = 26
      person = {
        name: 'yyy',
        age: 30
       }
        return person
      }
    
      const p1 = {
        name: 'yck',
        age: 25
      }
    // 问题1:
      const p2 = test(p1)
      console.log(p1) //---->???
    // 答案1:{name:'yck',age:26}
    
    
    // 问题2:
      console.log(p2)//---->???
    // 答案2:{name:'yyy',age:30}

    对于理解问题1需要明确的:

    • a.首先要明确的是js函数中所有参数都是按照值进行传递的。
    • 参数传递过程中有分为两种情况:①被传递参数类型为值类型;②被传递参数类型为引用类型
      •   被传递参数为值类型的时候,就将值复制一个给参数(函数的局部变量);
      •   被传递的参数为引用类型的时候,就将这个值内存的指针复制一个给参数(函数的局部变量)

      首先person复制到了p1的地址(这里p1是引用类型,p1和person指向同一个地址),进入到test函数, p1对象和函数内的局部变量person拥有同一个指针,所以当在函数内修改age的值为26时,p1对象的age也会被修改为26;

      但是当在函数内部将person重写为其他对象的时候,就相当于把函数内的person之前的指针给修改了(这个地方注意了,只是内部的person修改了, 外面的p1现在已经和他没有联系了,之前有联系是因为二者指向同一个地址,现在内部的局部变量的指针指向了新的对象,而p1依然是被修改过的);

      所以控制台的console.log的结果是{name:'yck',age:26}

    问题2: console.log(p2)//---->??? 答案2:{name:'yyy',age:30} 这个地方没什么好说的了,p2等于函数return的这个新对象。

    今天你学习了吗!!!
  • 相关阅读:
    springboot使用mybatis-plus表单更新null值问题通用解决方案
    ASP.NET MVC快速开发框架FastExecutor开发全过程感受及总结
    NetCore实现Transitional自定义注解事物
    NetCore3.0实现自定义IOC容器注入
    ADO.NET事务封装
    ASP.NET MVC模块化开发——动态挂载外部项目
    后台管理tab栏滑动解决方案
    c#使用CefSharp开发winform——环境搭建
    c#通过Redis实现轻量级消息组件
    ASP.NET MVC实现依赖注入
  • 原文地址:https://www.cnblogs.com/nayek/p/11816191.html
Copyright © 2011-2022 走看看