之前做项目,因为组员来回的用了JSON.stringify,被看见的结果搞蒙了,今天写这个文章,来记录下。
比如一个数组
var a = [{'name': 'zj', 'age': 32}]
var a1 = JSON.stringify(a)
console.log(a1)
// "[{"name":"zj","age":32}]"
// 看打印结果,第一次stringify,只是在数组两边用""包裹起了。
// 但如果把"[{"name":"zj","age":32}]" 赋值给某一个值,会报错,这里有的不理解
// Uncaught SyntaxError: Unexpected identifier
var a2 = JSON.stringify(a1)
// 第二次stringify,开始在键值对的非number类型上写上\...\
console.log(a2)
// ""[{\"name\":\"zj\",\"age\":32}]""
如果要回到a初始化的状态,执行了几次stringify就执行几次JSON.parse原路返回
再来看encodeURIComponent
正常情况下,如果url上有query参数,浏览器可能会被默认encodeURIComponent
听闻小程序的onload这样的钩子函数,会默认把url的参数decodeURIComponent(需考证),这里可以直接拿到onload钩子函数里面的query里的键值对Map对象。
var a = [{'name': 'zj', 'age': 32}]
var a1 = JSON.stringify(a)
var a2 = encodeURIComponent(a1)
console.log(a2)
// %5B%7B%22name%22%3A%22zj%22%2C%22age%22%3A32%7D%5D
// 同理,如果再一次encodeURIComponent(a2)
// %255B%257B%2522name%2522%253A%2522zj%2522%252C%2522age%2522%253A32%257D%255D
再一次
%25255B%25257B%252522name%252522%25253A%252522zj%252522%25252C%252522age%252522%25253A32%25257D%25255D
// 如果要回到a1状态,执行了几次encodeURIComponent,就再执行几次decodeURIComponent,原路返回即可
// 我疯了吗,如果要执行这么多次,因为项目就遇见,我执行了一次encodeURIComponent,但后端接收参数,也给执行了一次encodeURIComponent
但小程序的onload钩子函数只会执行一次decodeURIComponent,所以这了还需要自己执行一次decodeURIComponent。
同理看见的stringify后的结果如果出现了\,想要回到正常的数组,至少还要执行一次JSON.parse(如果还有\,再执行一次JSON.parse 以此类推)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。