Object.assign(), 一道关于基本类型合并的面试题
var s1 = "abc";
var s2 = true;
var s3 = 10;
var s4 = Symbol("foo")
var obj = Object.assign( s1, null, s2, undefined, s3, s4);
console.log(obj); // { "0": "a", "1": "b", "2": "c" },怎么运行成这样的结果呢
以上题目,为何运行成最后的结果呢????
在你提供的代码中,Object.assign()
的行为可能让你感到困惑。首先,让我们逐步分析一下:
代码分析:
var s1 = "abc";
var s2 = true;
var s3 = 10;
var s4 = Symbol("foo");
var obj = Object.assign(s1, null, s2, undefined, s3, s4);
console.log(obj); // { "0": "a", "1": "b", "2": "c" }
-
Object.assign()
方法:
Object.assign(target, ...sources)
会把所有源对象(sources
)的可枚举属性复制到目标对象(target
)上。特别注意,如果源是基本数据类型(如字符串、数字等),会将其转换为对象类型,并复制属性。 -
分析参数:
s1 = "abc"
:字符串会被转换为一个类数组对象,它的每个字符成为一个属性,因此'a'
,'b'
,'c'
分别成为0
,1
,2
属性。即s1
变成了{"0": "a", "1": "b", "2": "c"}
。null
和undefined
是空值,它们不会对目标对象进行任何改变,因为它们没有属性。s2 = true
:布尔值true
会被转换成Boolean
对象(new Boolean(true)
),但该对象没有可枚举的自定义属性,基本上不会对目标对象产生影响。s3 = 10
:数字10
会被转换成Number
对象(new Number(10)
),同样它不会影响目标对象,因为Number
对象没有可枚举属性。s4 = Symbol("foo")
:Symbol
是一种原始值,它不会对目标对象产生影响,因为Symbol
本身是不可枚举的。
重要的转化:
- 字符串
s1 = "abc"
会被视为类数组对象,"a"
、"b"
和"c"
分别变成了属性名0
,1
和2
,并且这些属性会被复制到目标对象。 null
、undefined
、true
、10
、以及Symbol
在Object.assign()
中没有可枚举的属性,因此它们对obj
没有影响。
最终结果:
由于 Object.assign()
是将源对象的属性复制到目标对象上,最后得到的 obj
其实就是 s1
的类数组属性("0": "a"
, "1": "b"
, "2": "c"
)。
{ "0": "a", "1": "b", "2": "c" }
关键点:
- 字符串
s1
转为类数组:s1
被视为类数组对象,其字符分别成为了数组的索引。 null
和undefined
不产生影响:它们没有可枚举属性。- 其他基本类型如
true
、10
和Symbol
不影响目标对象。
所以,最终 Object.assign()
操作的结果是从 s1
(即字符串 "abc"
)复制的类数组属性。
相信坚持的力量,日复一日的习惯.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2018-11-06 array_merge 优化调整