====JSON.parse
JSON.parse(text,callback(k,v)) 方法解析一个JSON字符串
返回值:对象(对应的text文本)
参数:
text要解析的json字符串
callback(k,v)可选的回调函数//规定了原始值在被返回之前如何被解析改造
//例1:
JSON.parse(‘{}‘); // {}
JSON.parse(‘true‘); // true
JSON.parse(‘"foo"‘); // "foo"
JSON.parse(‘[6, 6, "hello"]‘); // [6, 6, "hello"]
JSON.parse(‘null‘); // null
JSON.parse()
不允许用逗号作为结
尾
JSON.parse("[1, 2, 3, 4, ]")//
错误
JSON.parse(‘{"foo" : 1, }‘)//
错误
JSON
格式的字符串
,
必须遵循
JSON
规范
,key
和
value
都以引号引起来
(
而且
,
外部用单引号
,
内部用双引号
)//
否则解析不出来会报错
var person_json=JSON.parse(‘{"name":"jack","age":"19","phone":"182"}‘)
console.log(person_json["name"])
//例2:(基础好的掌握)
2.1
var obj=JSON.parse(‘{"p": 5}‘, function (k, v) {
if(k === ‘‘) return v; // 如果到了最顶层,则直接返回属性值,
return v * 2; // 否则将属性值变为原来的 2 倍。
});
console.log(obj)
// { p: 10 }
2.2
JSON.parse(‘{"1": “hello”, "2": 2,"3": {"4": 4, "5": {"6": 6}}}‘, function (k, v) {
console.log(k); // 输出当前的属性名,从而得知遍历顺序是从内向外的,
// 最后一个属性名会是个空字符串。
return v; // 返回原始属性值,相当于没有传递 回调参数。
});
如果指定了回调
函数,则解析出的对象值(解析值)会经过一次转换后才将被最终返回(返回值)。更具体点讲就是:解析值本身以及它所包含的所有属性,会按照一定的顺序(从最最里层的属性开始,一级级往外,最终到达顶层,也就是解析值本身)分别的去调用 回调
函数,在调用过程中,当前属性所属的对象会作为 this
值,当前属性名和属性值会分别作为第一个和第二个参数传入回调函数
中。如果 回调
返回 undefined
,则当前属性会从所属对象中删除,如果返回了其他值,则返回的值会成为当前属性新的属性值。
当遍历到最顶层的值(解析值)时,传入回调
函数的参数会是空字符串 ""
(因为此时已经没有真正的属性)和当前的解析值(有可能已经被修改过了),当前的 this
值会是 {"":
修改过的解析值}
====
JSON.stringify
JSON.stringify(value,replacer,space )
方法将对象转换为
JSON
字符串
返回值
:json
字符串
参数
:
value:
将要序列化的对象
后面两个可选参数
,
基础好的掌握
:
replacer:
①如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;注
:
这个函数第一次调用的时候
replacer(k,v) k
值是没有的
,v
值就是对象自己
,
后面调用传入的是对象内部的属性
,
并且按照属性名的
ASCII
表的顺序来分别调用
.
如果返回一个
Number,
转换成相应的字符串被添加入
JSON
字符串。
//return 5 “5”
如果返回一个
String,
该字符串作为属性值被添加入
JSON//return “hello” “hello”
如果返回一个
Boolean, "true"
或者
"false"
被作为属性值被添加入
JSON
字符串。
如果返回任何其他对象,该对象递归地序列化成
JSON
字符串,对每个属性调用
replaceer
方法。除非该对象是一个函数,这种情况将不会被序列化成
JSON
字符串。
如果返回
undefined
,该属性值不会在
JSON
字符串中输
例
:
对象中属性值为字符串的属性除外
,
将这个对象变为
json
格式的字符串
var obj={“name”:”karen”,”age”:46,”beatiful”:true,”tel”:”136xxx”}
function replacer(k,v){
if(typeof(v)===’string’){return undefined}
return v
}
var jsonStr=JSON.stringify(obj,replacer)
②如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的
JSON
字符串中;
var obj={“name”:”karen”,”age”:46,”beatiful”:true,”tel”:”136xxx”}
var arr=[‘age’,’tel’]
var jsonStr=JSON.stringify(obj,arr)
③如果该参数为
null
或者未提供,则对象所有的属性都会被序列化;
Space:
用来控制结果字符串里面的间距。如果是一个数字
,
则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多
10
个空格);如果是一个字符串,则每一级别会比上一级别多缩进用该字符串(或该字符串的前十个字符
)
var obj=JSON.stringify({ name: 1, age : 2 }, null,0)
alert(obj)
var obj=JSON.stringify({ name: 1, age : 2 }, null,10)
alert(obj)
var obj=JSON.stringify({ name: 1, age : 2 }, null,”heihei”)
alert(obj)
====符号优先级
1---
圆括号---()
2--
成员访问(从左到右)---p1.name
new带参数---new Person()
3----
函数调用(从左到右)----fn(10)
new无参数---new person
4----
后置递增---a++
后置递减----a--
5----
逻辑非(从右到左)----!true
按位非(从右到左)----~20
一元加法(从右到左)---- -20
一元减法(从右到左)---- +0
前置递增(从右到左)---- ++a
前置递减(从右到左)----- --a
Typeof(从右到左)----- typeof p1
6----
乘(从左到右)----20*10
除(从左到右)----a/2
求余(从右到左)----20%3
7----
加(从左到右)----a+b
减(从左到右)----a-b
8----
小于(从左到右)----a<b
小于等于(从左到右)----a<=b
大于(从左到右)----a>b
大于等于(从左到右)----a>=b
in(从左到右)----for(k in arr)
instanceof(从左到右)----p1.instanceof(Person)
9----
等号(从左到右)----a==b
非等号(从左到右)----a!=b
全等号(从左到右)----a===b
非全等号(从左到右)---a!==b
10----
按位与(从左到右)----2&3
11---
按位异或(从左到右)----10^20
12---
按位或(从左到右) ----10|10
13---
逻辑与(从左到右)----true&&true
14----
逻辑或(从左到右)----false||true
15---
三目运算符(从右到左)---- a?b:c
16---
赋值(从右到左)----a=20
17----
逗号(从左到右)---- for(var a=20;a++,a++,a++,a<10;a++){}
原文:http://www.cnblogs.com/YCxiaoyang/p/7376462.html