为啥需要方括号来在 Javascript 中对 Map 的所有元素进行字符串化?

Posted

技术标签:

【中文标题】为啥需要方括号来在 Javascript 中对 Map 的所有元素进行字符串化?【英文标题】:Why are square brackets needed to stringify all elements of a Map in Javascript?为什么需要方括号来在 Javascript 中对 Map 的所有元素进行字符串化? 【发布时间】:2018-10-02 09:36:04 【问题描述】:

问题: 我似乎无法找到令人满意的解释,解释为什么 javascript Maps 需要方括号,以便 JSON.stringify 方法“到达”(?)到嵌套元素中。我想我遗漏了一些关于 ES6 的东西,或者 Map 数据类型固有的东西。

我可以将 Map 转换为对象,然后进行字符串化——但为什么需要这个额外的步骤?

我的实验:

const blah = new Map();

blah.set('u', 
    'something': ['hey':98, 56, 'bob']
);

blah.set(
    'hey': 'hey': 78
, 'what?');

console.log(JSON.stringify(...blah));

//["u",]
//I thought this would yield the result of the below console.log

console.log(JSON.stringify([...blah]))

//[["u","something":["hey":98,56,"bob"]],["hey":"hey":78,"what?"]]
//Why are the square brackets needed to stringify and display each element of 
//the map?

article 确认了这种行为,但没有解释为什么会发生。

【问题讨论】:

该语法的作用是从地图创建一个数组。 地图对象大多(可能总是)字符串化,如JSON.stringify([...myMap]) 【参考方案1】:

JSON.stringify(...blah) 是 argument spread,它采用您在遍历地图时获得的值:

['u', 'something': …] ['hey': …, 'what?']

并将它们作为不同的参数传递给JSON.stringify

JSON.stringify(
    ['u', 'something': …],
    ['hey': …, 'what?']
);

JSON.stringifyis supposed to be a replacer function 的第二个参数。既然你给了它一些不是函数的东西,它就会忽略它。

论据传播并不是你想要的。您想要的是将映射转换为键/值对数组,这就是 [...blah] 所做的。 Array.from(blah) 会产生同样的效果。

【讨论】:

以上是关于为啥需要方括号来在 Javascript 中对 Map 的所有元素进行字符串化?的主要内容,如果未能解决你的问题,请参考以下文章

Scala中调用函数或者方法为啥有时候需要括号,有时候不需要括号

为啥 g++ 需要 -fpermissive 标志来在 c++ 中打印迭代器值? [关闭]

为啥我需要一个 QTranslator 来在 Windows 上的 QMessageBox 中本地化按钮文本?

为啥我们需要一个默认构造函数来在 C++ 中通过引用传递一个对象?

为啥在带有括号的 Javascript 事件处理函数中?

JavaScript - 为啥包含括号会导致三元表达式错误?