为啥我们必须通过请求对数组而不是对象进行字符串化?
Posted
技术标签:
【中文标题】为啥我们必须通过请求对数组而不是对象进行字符串化?【英文标题】:Why must we stringify arrays but not objects over requests?为什么我们必须通过请求对数组而不是对象进行字符串化? 【发布时间】:2014-09-24 15:50:10 【问题描述】:昨晚我通过 AJAX(特别是 $.post
)向我的服务器发送了一些数据,当时我遇到了 javascript 数组需要“字符串化”并在发送之前作为字段应用于对象的问题。那就是:
$.post("/myUrl/", "myKey": json.stringify(myArray), ... );
如果我不执行stringify
,POST 的格式会在到达 Django 时搞砸。
当对象可以按原样发送时,为什么需要对请求进行字符串化?或者,这是否在使用的后端有很大差异?
【问题讨论】:
对象没有“按原样”发送。 jQuery 对其进行了一些处理以将其转换为 URL 键/值:http://this.url?myKey=stringifiedArray
。使用对象是因为它们是一种易于操作的数据结构。
啊,有趣。所以 jQuery 只是没有对数组做同样的“东西”——或者说它对待它们的方式不同?
啊……这可以解释为什么request.POST
被分解成list[index]
位;它正在尝试从数组中创建唯一的键/值对!对吗?
jQuery 的 post 方法接受键/值对的数据对象(或字符串 - 见下文)。
【参考方案1】:
对象没有“按原样”发送。 jQuery 将对象重新编码为 URL 键/值对,例如:
http://this.url?myKey=stringifiedArray.
The documentation has more information on this.
data
Type: PlainObject or String
A plain object or string that is sent to the server with the request.
使用对象是因为它们是一种易于开发人员操作的数据结构。
【讨论】:
嗯...Array
是 Object
,但 不是 PlainObject
是这样吗? (***.com/questions/5048371/…)
区别在于数组是一个类似列表的对象,它有数字索引并且是可排序的,而一个对象有键/值对,其中键必须是唯一的并且不能排序。
顺便说一句,MDN library 是一个很好的资源,如果你从未看过它的话。
是的,我看过 MDN 库——谢谢。 :) 我实际上只是在浏览它(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)。看起来最大的区别在于 plain 对象 (
) 与包含数组的更通用的对象类——而且似乎 jQuery 默认只处理前一种情况。有趣的!谢谢,@Andy!以上是关于为啥我们必须通过请求对数组而不是对象进行字符串化?的主要内容,如果未能解决你的问题,请参考以下文章