JSON.stringify

JSON.stringify是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串。

1.方法的定义

JSON.stringify(value,replace,space)

参数一:将要转换成JSON字符串的值

参数二:可选,为函数时,被序列化的值的每个属性都会经过该函数的转换和处理;

              为数组时,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中。

参数三:可选,格式化输出,用于美化输出。

               为数字时,表示每个属性前面添加n个空格(最多不超过10个);

               为字符串时,则该字符串会添加在每行前面(最多不超过10个)。

返回值:JSON字符串

2.方法的使用

第一个参数

JSON.stringify(true); // 'true'
JSON.stringify({name: "Sara",age: 14}); // 输出结果:  "{"name":"Sara","country":14}"
JSON.stringify("json string!"); // 输出结果: ""json string!""
JSON.stringify([1,2,"open","the","door"]); // 输出结果: "[1,2,"open","the","door"]"
JSON.stringify([new Number(1), new String("false"), new Boolean(false)]); 
// '[1,"false",false]'

// 单独出现undefined、任意的函数以及 symbol 值,会返回undefined
// 在数组中会返回null值;在对象中会被忽略
JSON.stringify(function(){}); //undefined
JSON.stringify({x: undefined, y: Object, z: Symbol("")}); // '{}'
JSON.stringify([undefined, Object, Symbol("")]); // '[null,null,null]' 

// 正则对象会被转换成空对象
JSON.stringify(/foo/) // "{}"

// 不可枚举的属性会被忽略
let obj = {};
Object.defineProperties(obj, {
  'foo': {
    value: 1,
    enumerable: true
  },
  'bar': {
    value: 2,
    enumerable: false
  }
});
JSON.stringify(obj); // {"foo":1}

第二个参数

// 函数参数,更改默认的字符串化的行为
function replacer(key, value) {
  if (typeof value === "string") {
    return undefined;
  }
  return value;
}
let foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7};
let jsonString = JSON.stringify(foo, replacer); //"{"week":45,"month":7}"

// 数组参数,指定需要转成字符串的属性
JSON.stringify(foo, ["Mozilla", 7]); // "{"foundation":"Mozilla","month":7}"


// 多级嵌套的对象
let o1 = {a: {b:1}};
// 1.递归处理所有的键
function f(key, value) {
  // 处理三次,依次输出 []:{"a":{"b":1}};  [a]:{"b":1};   [b]:1;
  console.log("["+ key +"]:" + JSON.stringify(value));
  return value;
}
JSON.stringify(o1, f); // "{"a":{"b":1}}"

let o2 = {a: 1};
// 2.递归处理中,每一次处理的对象,都是前一次返回的值。
// 函数修改了对象o2为{b:2},接着JSON.stringify方法就递归处理修改后的对象o2,
// 此时key为b,value为2,所以value*2=4,即结果为{b:4}
function f(key, value){
  if (typeof value === "object"){
    return {b: 2};
  }
  return value*2;
}
JSON.stringify(o2,f); // '{"b":4}'

// 3.如果处理函数返回undefined或没有返回值,则该属性会被忽略。
function f(key, value) {
  if (typeof(value) == "string") {
    return undefined;
  }
  return value;
}
JSON.stringify({ a:"abc", b:123 }, f); // '{"b":123}'

第三个参数

JSON.stringify({ a: 2 }, null, " ");   // '{\n"a": 2\n}'
// 数字参数
JSON.stringify({ a: 2 }, null, 2);   // '{\n  "a": 2\n}'

// 字符串参数
JSON.stringify({ p1:1, p2:2 }, null, "|-");
// "{
// |-"p1": 1,
// |-"p2": 2
// }"

//\t表示用制表符进行缩进
JSON.stringify({ uno: 1, dos : 2 }, null, '\t')
// '{            \
//     "uno": 1, \
//     "dos": 2  \
// }' 

JSON.stringify 方法处理的对象,包含一个 toJSON 方法

let obj = {
  foo: 'foo',
  toJSON: function () {
    return 'bar';
  }
};
JSON.stringify(obj);      // '"bar"'
JSON.stringify({x: obj}); // '{"x":"bar"}'

// Date对象就部署了一个自己的toJSON方法。
JSON.stringify(new Date("2011-07-29")); // "2011-07-29T00:00:00.000Z"

// toJSON方法的一个应用是,可以将正则对象自动转为字符串。
RegExp.prototype.toJSON = RegExp.prototype.toString;
JSON.stringify(/foo/); // "/foo/"
//分析:在正则对象的原型上面部署了toJSON方法,将其指向toString方法,
//那么toJSON就实现了返回正则表达式的字符串值,因此遇到转换成JSON时,
//正则对象就先调用toJSON方法转为字符串,然后再被JSON.stingify方法处理。

3.常用的使用场景

1)判断数组是否包含某对象,或者判断对象是否相等。

let dataArr =[{name:'Tom'},{name:'Lucky'},{name:"Lili"}]
let obj ={name:'Tom'};
let flag = JSON.stringify(dataArr).indexOf(JSON.stringify(obj));
console.log(flag);

let arr1 = [1,2,3];
let arr2 =[1,2,3];
console.log(JSON.stringify(arr1)===JSON.stringify(arr2));

2)使用localStorage/sessionStorage时可以存储对象。

let val =[1,2,3];
function setLocalStorage(key,val){
    window.localStorage.setItem(key,JSON.stringify(val));
};
function getLocalStorage(key){
    let val = JSON.parse(window.localStorage.getItem(key));
    return val;
};
setLocalStorage('demo',[1,2,3]);
getLocalStorage('demo')

3)实现对象深拷贝

function deepClone(data){
   let jsonStr = JSON.stringify(data);
   let obj = JSON.parse(jsonStr);
   return obj;
 }
 let arr = [1,2,3];
 let arrClone = deepClone(arr);
 arr[0] = 2;
 console.log(arr,arrClone); //[2, 2, 3]  [1, 2, 3]

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值