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" }
  1. Object.assign() 方法
    Object.assign(target, ...sources) 会把所有源对象(sources)的可枚举属性复制到目标对象(target)上。特别注意,如果源是基本数据类型(如字符串、数字等),会将其转换为对象类型,并复制属性。

  2. 分析参数

    • s1 = "abc":字符串会被转换为一个类数组对象,它的每个字符成为一个属性,因此 'a', 'b', 'c' 分别成为 012 属性。即 s1 变成了 {"0": "a", "1": "b", "2": "c"}
    • nullundefined 是空值,它们不会对目标对象进行任何改变,因为它们没有属性。
    • 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" 分别变成了属性名 012,并且这些属性会被复制到目标对象。
  • nullundefinedtrue10、以及 SymbolObject.assign() 中没有可枚举的属性,因此它们对 obj 没有影响。

最终结果:

由于 Object.assign() 是将源对象的属性复制到目标对象上,最后得到的 obj 其实就是 s1 的类数组属性("0": "a", "1": "b", "2": "c")。

{ "0": "a", "1": "b", "2": "c" }

关键点:

  1. 字符串 s1 转为类数组s1 被视为类数组对象,其字符分别成为了数组的索引。
  2. nullundefined 不产生影响:它们没有可枚举属性。
  3. 其他基本类型如 true10Symbol 不影响目标对象

所以,最终 Object.assign() 操作的结果是从 s1 (即字符串 "abc")复制的类数组属性。

posted @   盘思动  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2018-11-06 array_merge 优化调整
点击右上角即可分享
微信分享提示