zoukankan      html  css  js  c++  java
  • 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++){}

     

     

     

     

     

    你好!如果你有什么更好的建议或意见,请在评论区留言。感谢你的阅读!
  • 相关阅读:
    C++类型转换(字符串)
    GDI+ 中Image::FromStream ,用流的方式显示图像
    mfc对话框序列化实例
    配置android开发环境eclipse获取ADT获取不到(转)
    vs开发错误总结
    MFC获取文件操作
    Android系统架构剖析(转)
    OpenCV 图像采样 插值 几何变换
    C++ char*,char[],string,CString转换
    Simscape Multibody 教程 —— 入门学习
  • 原文地址:https://www.cnblogs.com/YCxiaoyang/p/7376462.html
Copyright © 2011-2022 走看看