1. 程式人生 > >JS-補充-json,符號優先級

JS-補充-json,符號優先級

ons 個數 replace all 運算符 defined 三目運算 repl 直接

====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規範,keyvalue都以引號引起來(而且,外部用單引號,內部用雙引號)//否則解析不出來會報錯

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,符號優先級