JS-補充-json,符號優先級
====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++){}
JS-補充-json,符號優先級