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")复制的类数组属性。
相信坚持的力量,日复一日的习惯.

浙公网安备 33010602011771号