javascript - 为什么 Object.assign() 拆分字符串并创建具有多个键的对象?
问题描述
如果将 astring literal
传递给Object.assign()
,它将创建一个object
具有多个的,keys
如下例所示:
var v1 = 'myTest';
var obj = Object.assign({}, v1);
console.log(obj);
这背后的原因是什么,而不是返回{0:'myTest'}
?
解决方案
来自MDN
Object.assign()方法用于将所有可枚举自身属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
因此,字符串文字v1
将被强制转换object
为方法才能工作。当字符串文字被强制转换为object
时,使用String()构造函数,您将获得一个具有数字属性的array-like
对象(具有长度属性和索引元素的对象),但不是数组,即实际上相同好像你这样做new String(v1)
:
let v1 = "myString";
let obj = new String(v1);
console.log(obj);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
你没有得到一个 Array:
只是为了澄清起见,object
你从string
文字中得到的强制是一个array-like
对象而不是一个array
,正如你在下一个使用Array.isArray()进行检查的测试中看到的那样:
let v1 = "myString";
let strObj = new String(v1);
console.log(Array.isArray(strObj));
let arr = v1.split("");
console.log(Array.isArray(arr));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
要了解有关array-like
对象和数组差异的更多信息,也许您可以阅读下一个链接:
推荐阅读
- c# - 在 SSIS 中,如何修复此异常(Rebex.Net.SmtpException、Rebex.Net.ProxySocketException 和 System.Net.Sockets.SocketException)
- javascript - 将字符串数组作为键值对
- python - 为什么我的 python 代码的一部分会留下一个空行?
- algorithm - 整数乘法中使用的算法是什么?
- c# - 如何修复连接未关闭。连接的当前状态是连接?
- reactjs - React 中高阶组件的默认值
- python - Django Logging 在模块中不起作用
- excel - Excel VBA - 在工作簿之间复制 Listobject 值
- pentaho - 如何减少pentaho cde上图例和图表之间的距离?
- docker - 如何修复“无法连接到 localhost 端口 9515:连接被拒绝” Laravel Dusk