標籤:code 傳遞 number ons name 直接 縮排 replace ++
====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); // 輸出當前的屬性名稱,從而得知遍曆順序是從內向外的,
// 最後一個屬性名稱會是個Null 字元串。
return v; // 返回原始屬性值,相當於沒有傳遞 回調參數。
});
如果指定了回調函數,則解析出的對象值(解析值)會經過一次轉換後才將被最終返回(傳回值)。更具體點講就是:解析值本身以及它所包含的所有屬性,會按照一定的順序(從最最裡層的屬性開始,一級級往外,最終到達頂層,也就是解析值本身)分別的去調用 回調函數,在調用過程中,當前屬性所屬的對象會作為 this 值,當前屬性名稱和屬性值會分別作為第一個和第二個參數傳入回呼函數中。如果 回調返回 undefined,則當前屬性會從所屬對象中刪除,如果返回了其他值,則返回的值會成為當前屬性新的屬性值。
當遍曆到最頂層的值(解析值)時,傳入回調函數的參數會是Null 字元串 ""(因為此時已經沒有真正的屬性)和當前的解析值(有可能已經被修改過了),當前的 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,符號優先順序