JS-补充-json,符号优先级

Posted YC小杨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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规范,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,符号优先级的主要内容,如果未能解决你的问题,请参考以下文章

js常用代码片段

JS 运算符号补充

vscode用啥符号把某一段代码包起来,类似C#的#region?

如何在 Next.js 代码优先方法中使用 graphql-type-json 标量

JS变量与函数声明提升补充

VSCode 配置 用户自定义代码片段 自定义自动代码补充