开发者社区> 问答> 正文

对象类型和原始类型的不同之处?函数参数是对象会发生什么问题?

对象类型和原始类型的不同之处?函数参数是对象会发生什么问题?JavaScript的参数是按照什么方式传递的?


【精品问答】前端面试手册

【精品问答】前端面试手册之JavaScript篇

展开
收起
前端问答 2019-11-24 19:45:44 1347 0
1 条回答
写回答
取消 提交回答
  • 前端问答小助手

    JS中,除了原始类型那么其他的都是对象类型了。对象类型和原始类型不同的是,原始类型存储的是对象类型存储的是地址(指针)。当你创建了一个对象类型的时候,计算机会在内存中帮我们开辟一个空间来存放值,但是我们需要找到这个空间,这个空间会拥有一个地址(指针)。

    const a = []
    

    对于常量a来说,假设内存地址(指针)为#001,那么在地址#001的位置存放了值 [],常量a存放了地址(指针)#001,再看以下代码

    const a = []
    const b = a
    b.push(1)
    

    当我们将变量赋值给另外一个变量时,复制的是原本变量的地址(指针),也就是说当前变量b存放的地址(指针)也是#001,当我们进行数据修改的时候,就会修改存放在地址(指针)#001上的值,也就导致了两个变量的值都发生了改变。

    接下来我们来看函数参数是对象的情况:

    function test(person) {
      person.age = 26
      person = {
        name: 'yyy',
        age: 30
      }
    
      return person
    }
    const p1 = {
      name: 'yck',
      age: 25
    }
    const p2 = test(p1)
    console.log(p1) // -> ?
    console.log(p2) // -> ?
    
    • 首先,函数传参是传递对象指针的副本
    • 到函数内部修改参数的属性这步,我相信大家都知道,当前p1的值也被修改了
    • 但是当我们重新为person分配了一个对象时就出现了分歧,请看下图

    image.png

    所以最后person拥有了一个新的地址(指针),也就和p1没有任何关系了,导致了最终两个变量的值是不相同的。


    JavaScript的参数是按照什么方式传递的?

    1. 基本类型是按值传递的;
    2. 复杂类型是按引用传递共享传递的。
    2019-11-25 06:30:24
    赞同 1 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载