Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >对象作为函数参数的对象

对象作为函数参数的对象
EN

Stack Overflow用户
提问于 2018-04-14 11:44:41
回答 2查看 33关注 0票数 0

正如您从我的代码示例中看到的,我想知道为什么下面的东西不能工作。我有一个以对象作为属性的对象(在下面的文本中将它称为支柱)。当我将值赋值给函数中的支柱时,这些值就存在了,因为很明显,它是通过引用传递的,但是我不明白为什么可以引用这个支柱来指向另一个对象。

在将支柱设置为另一个对象的情况下,我只得到空对象,因为它正在启动。我在这里错过了什么?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const person = {
  basic: {}
}


function initPersonBasics(b) {
  // doesn't work
  b = {
    firstName: 'John',
    lastName: 'Doe'
  }

  // works
  // b.firstName = 'John';
  // b.lastName = 'Doe';
}




initPersonBasics(person.basic);
console.log(person);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-14 12:00:42

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const person = {
  basic: {}
}


function initPersonBasics(b) {
  b = {
    firstName: 'John',
    lastName: 'Doe'
  };

  console.log(b);
}

initPersonBasics(person.basic);
console.log(person);

原因是您正在重新分配b以指向initPersonBasics中的另一个对象。但这并没有改变person.basic指向的位置。

您所做的类似于以下简单代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function foo(i) {
    i = 42;
}

let j = 10;
foo(j);

你不会指望j在打电话给foo后就满42岁了,是吗?

票数 1
EN

Stack Overflow用户

发布于 2018-04-14 12:14:55

initPersonBasics()函数中,参数b的行为类似于局部变量。当函数启动时,它已经用函数的第一个参数(person.basic)的值初始化了。

但声明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
b = {
    firstName: 'John',
    lastName: 'Doe'
}

b中放置一个不同的值;它不会以任何方式改变person.basic

正如您已经注意到的,如果不将新对象分配给b并设置b.firstNameb.lastName,则这些值将存储在person.basic中。这是因为JavaScript赋值不复制对象,而是存储对它们的引用。

有几种方法可以让它像你想的那样工作。您已经发现了其中的一个:将值一个一个地存储在b的属性中(在函数调用执行期间它是person.basic的别名)。

另一种选择是使用Object.assign()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function initPersonBasics(b) {
    Object.assign(b, {
        firstName: 'John',
        lastName: 'Doe'
    });
}

请注意,它不工作在旧浏览器(甚至在一些较新的浏览器)。仔细检查浏览器兼容性部分。

另一个选项(适用于所有浏览器)是Object.defineProperties(),但它的语法更冗长:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function initPersonBasics(b) {
    Object.defineProperties(b, {
        firstName: {
            value: 'John',
            writable: true,
        },
        lastName: {
            value: 'Doe',
            writable: true,
        }
    });
}

请注意,如果您没有提到属性的writable: true,它就变成只读的,不能分配给它(并且没有报告错误)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49835495

复制
相关文章
JS处理函数将对象作为参数传递
做项目的时候遇到一个不是很常见的问题,就是js函数传递参数的时候,我们一般是传递一个数字或者是一个字符串,但是当你的需求满足不了的时候,就需要将对象或者数组作为一个参数传递过去,这个时候怎么做呢,今天简单的说有一下:
何处锦绣不灰堆
2020/05/29
7.1K0
C++对象模型_Class Obj作为函数参数
开发环境 VC6.0 编辑器 Cmd Markdown 关于C/C++中基本类型(如:int,int*等)作为函数参数时,是通过将该变量的值压栈来进行参数传递;本文通过C++反汇编代码分析了当对象作为函数参数时(该形参非引用或指针),参数如何传递以及此时栈帧的结构。 对象作为函数参数时,参数传递过程(如:函数的声明为:void show(class Object obj);该函数的调用的为show(arg);其中实参arg的类型为class Object):1,在栈顶上为obj对象分配内存空间,然
chinchao.xyz
2022/04/25
1.2K0
C++对象模型_Class Obj作为函数参数
【C++】拷贝构造函数调用时机 ② ( 对象值作为函数参数 | 对象值作为函数返回值 )
" 拷贝构造函数 " 又称为 " 赋值构造函数 " , 该类型构造函数有 4 种调用时机 ;
韩曙亮
2023/10/15
2590
【C++】拷贝构造函数调用时机 ② ( 对象值作为函数参数 | 对象值作为函数返回值 )
(十六)函数作为参数值、变量值或对象时的类型
# 一、函数作为参数值、变量值或对象时的类型 说明 函数作为参数值、变量值或对象时它的类型该如何限定 问题 // 这个时候限定传入的参数要符合这种类型参数呢 function request(callback) { callback('sucess') } 解决方式 语法:callback: (名字: 类型) => 返回值类型,没有返回值用 void function request(callback: (result: string) => void) { callback('sucess
老怪兽
2023/02/22
1.3K0
VBA Object对象的函数参数传递
VBA的函数参数传递方式是Byval和Byref,数值类型、Stirng等那些值类型的是要非常注意用哪种方式的。对于Object对象引用类型的一直都说2种方式完全没有区别。
xyj
2020/07/28
3.5K0
JavaScript 函数参数-Arguments(实参)对象
上式的 x 就是square函数的 参数。每次运行的时候,需要提供这个值,否则得不到结果。
WEBING
2019/02/26
2.7K0
JavaScript 函数参数-Arguments(实参)对象
运算符重载使用它类对象作为参数
我们想实现一个功能,分别有两个类,一个名为 Sender,负责发送邮件。另外一个类名为 Mail,负责管理发送的标题和内容。在使用的时候,我们需要让类 Sender 重载 << 操作符,以实现将 Mail 类的数据发送出去,大致用法就是 Sender << Mail 这样的方式。这就涉及到了诸多问题。
我与梦想有个约会
2023/10/20
1450
day11(函数参数,函数对象,打散机制
一,复习 # 什么是函数:具体特定功能的代码块 - 特定功能代码块作为一个整体,并给该整体命名,就是函数 # 函数的优点: # 1.减少代码的冗余 # 2.结构清晰,可读性强 # 3.具有复用性,开发效率高,维护成本低 # 如何定义一个函数:用def关键词来声明函数 ''' def fn(参数列表): 函数体 return 函数的返回值 ''' # -- 定义函数时,函数体不会被执行 | 函数必须先定义后使用 # 函数的四部分: # 函数名:存放着函数的地址,是调用函数
py3study
2020/01/17
5450
函数(四)(数组作为函数参数)
一是数组元素作为函数参数,这种情况下与简单变量作为函数的参数完全一样,数组元素的值被单向传递给形参变量。
pigeon
2022/04/11
1.5K0
函数(四)(数组作为函数参数)
js匿名函数作为函数参数
继承,多态,甚至指针,c能实现,c++,java有,javascript(和java是雷锋和雷峰塔的区别,名字上不知道坑了多少人)也能变通实现。
全栈程序员站长
2022/11/10
5.3K0
c++之类模板对象作函数参数
三种方式: 1.指定传入的类型(这种最常用) 2.参数模板化 3.整个类模板化 #include<iostream> using namespace std; template<class T1,class T2> class Person { public: T1 name; T2 age; Person(T1 name, T2 age) { this->name = name; this->age = age; } void sh
西西嘛呦
2020/08/26
7110
函数对象
函数是第一类对象,即函数可以被当做数据处理。 def func(): print('from func') print(func) <function func at 0x10af72f2
py3study
2020/01/15
5660
函数对象
概念: 重载调用函数操作符的类,其对象称为函数对象 函数对象使用重载()时,行为类似函数调用,也叫仿函数 函数对象本质是一个类,不是一个函数 函数对象使用: features: 1.函数对象
大忽悠爱学习
2021/03/02
2830
函数对象
结构体作为函数的参数
> 只要结构体成员是一个具有单个值的数据类型,便可把它作为参数传递给接受该特定类型的函数。 > 使用这种方式为函数传递参数与普通变量作为参数相同,都是以传值的方式传递的。
怪兽
2022/12/31
2.1K0
JavaScript 的 this 小结纯粹的函数调用作为对象方法的调用作为构造函数调用apply 调用
函数的不同使用场合,this有不同的值。 总的来说,this就是函数运行时所在的环境对象。 下面分情况,详细讨论
JavaEdge
2018/08/02
2.7K0
JavaScript 的 this 小结纯粹的函数调用作为对象方法的调用作为构造函数调用apply 调用
7.3 数组作为函数参数
2、用数组元素作实参时,向形参变量传递的是数组元素的值,而用数组名作函数实参时,向形参传递的是数组首元素的地址。
小林C语言
2019/07/12
1.6K0
Python 函数作为参数传递
#map()的功能是将函数对象依次作用于表的每一个元素,每次作用的结果储存于返回的表re中。 #map通过读入的函数(这里是lambda函数)来操作数据 def test_func_map():     re = map((lambda x: x+3), [1, 2, 3, 4])     print re def testA(a, b, **kargs):     print a+b     print "testA: %s" % kargs #函数作为参数传递 def test_func(func, a, b, **kargs):     func(a, b)     print "test_func: %s" % kargs #函数作为参数传递 def test_func_lambda(func, **kargs):     func()     print "test_func_lambda: %s" % kargs def test_func_getattr():     func = getattr(obj, "testA")     func(1, 2) class TestGetattr():     aa = "2a"     def get_attr(self):         print "test getattr()"     def print_text(self):         print "print text"     def print_string(self):         print "print string" #getattr(obj, "a")的作用和obj.a是一致的,但该方法还有其他的用处,最方便的就是用来实现工厂方法 #根据传入参数不同,调用不同的函数实现几种格式的输出 def output(print_type="text"):     tg = TestGetattr()     output_func = getattr(tg, "print_%s" % print_type)     output_func() if __name__ == "__main__":     #test_func(testA, 1, 2, aa="aa")     #test_func_lambda((lambda: testA(1, 2, bb="bb")), cc="cc")     #test_func_map()     #test_func_getattr()     #getattr方法,传入参数是对象和该对象的函数或者属性的名字,返回对象的函数或者属性实例     obj = TestGetattr()     func = getattr(obj, "get_attr") #getattr()获得对象的属性和方法     func()     print getattr(obj, "aa") #完成对象的反射     print obj.aa     #callable方法,如果传入的参数是可以调用的函数,则返回true,否则返回false。     print callable(getattr(obj, "aa"))     output("string")
py3study
2020/01/09
3K0
6.5 数组作为函数参数
在用数组元素作函数实参时,把实参的值传递给形参,是“值传递”方式。数据传递的方向是从实参传到形参,单向传递
小林C语言
2019/08/19
1.3K0
PHP面向对象-对象方法的调用和参数传递
要调用对象方法,需要先创建对象,然后使用对象名和方法名调用该方法。下面是一个示例,演示如何创建对象并调用其方法:
堕落飞鸟
2023/04/27
2K0
【Python】函数进阶 ③ ( 函数作为参数传递 )
之前介绍的函数 , 都是 接收具体的 变量 或 字面量 数据 作为参数 , 如 : 数字 / 布尔值 / 字典 / 列表 / 元组 等 ;
韩曙亮
2023/10/11
4700
【Python】函数进阶 ③ ( 函数作为参数传递 )

相似问题

对象作为函数参数

15

函数作为对象参数

21

对象作为函数参数

22

使用对象参数作为函数的参数

30

JavaScript对象作为函数参数

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文