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"
)复制的类数组属性。