• 数组转JSON json对象 json字符串


    入参格式JSON对象与JSON字符串的区别

    1、Object.assign()

    Object.assign() 方法将所有可枚举Object.propertyIsEnumerable() 返回 true)的自有Object.hasOwnProperty() 返回 true)属性从一个或多个源对象复制到目标对象,返回修改后的对象。

    介绍Object.assign()

    Object.assign() - JavaScript | MDN (mozilla.org)icon-default.png?t=M85Bhttps://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

    示例

    复制对象

    1. const obj = { a: 1 };
    2. const copy = Object.assign({}, obj);
    3. console.log(copy); // { a: 1 }

    Copy to Clipboard

    深拷贝问题

    针对深拷贝 (en-US), 需要使用其他办法,因为 Object.assign() 只复制属性值。

    假如源对象是一个对象的引用,它仅仅会复制其引用值。

    1. function test() {
    2. 'use strict';
    3. let obj1 = { a: 0 , b: { c: 0}};
    4. let obj2 = Object.assign({}, obj1);
    5. console.log(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}}
    6. obj1.a = 1;
    7. console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 0}}
    8. console.log(JSON.stringify(obj2)); // { "a": 0, "b": { "c": 0}}
    9. obj2.a = 2;
    10. console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 0}}
    11. console.log(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 0}}
    12. obj2.b.c = 3;
    13. console.log(JSON.stringify(obj1)); // { "a": 1, "b": { "c": 3}}
    14. console.log(JSON.stringify(obj2)); // { "a": 2, "b": { "c": 3}}
    15. // Deep Clone
    16. obj1 = { a: 0 , b: { c: 0}};
    17. let obj3 = JSON.parse(JSON.stringify(obj1));
    18. obj1.a = 4;
    19. obj1.b.c = 4;
    20. console.log(JSON.stringify(obj3)); // { "a": 0, "b": { "c": 0}}
    21. }
    22. test();

    Copy to Clipboard

    合并对象

    1. const o1 = { a: 1 };
    2. const o2 = { b: 2 };
    3. const o3 = { c: 3 };
    4. const obj = Object.assign(o1, o2, o3);
    5. console.log(obj); // { a: 1, b: 2, c: 3 }
    6. console.log(o1); // { a: 1, b: 2, c: 3 }, target object itself is changed.

    Copy to Clipboard

    合并具有相同属性的对象

    1. const o1 = { a: 1, b: 1, c: 1 };
    2. const o2 = { b: 2, c: 2 };
    3. const o3 = { c: 3 };
    4. const obj = Object.assign({}, o1, o2, o3);
    5. console.log(obj); // { a: 1, b: 2, c: 3 }

    Copy to Clipboard

    属性会被后续参数中具有相同属性的其他对象覆盖。

    拷贝 Symbol 类型属性

    1. const o1 = { a: 1 };
    2. const o2 = { [Symbol('foo')]: 2 };
    3. const obj = Object.assign({}, o1, o2);
    4. console.log(obj); // { a : 1, [Symbol("foo")]: 2 } (cf. bug 1207182 on Firefox)
    5. Object.getOwnPropertySymbols(obj); // [Symbol(foo)]

    Copy to Clipboard

    原型链上的属性和不可枚举属性不能被复制

    1. const obj = Object.create({ foo: 1 }, { // foo is on obj's prototype chain.
    2. bar: {
    3. value: 2 // bar is a non-enumerable property.
    4. },
    5. baz: {
    6. value: 3,
    7. enumerable: true // baz is an own enumerable property.
    8. }
    9. });
    10. const copy = Object.assign({}, obj);
    11. console.log(copy); // { baz: 3 }

    Copy to Clipboard

    基本类型会被包装为对象

    1. const v1 = 'abc';
    2. const v2 = true;
    3. const v3 = 10;
    4. const v4 = Symbol('foo');
    5. const obj = Object.assign({}, v1, null, v2, undefined, v3, v4);
    6. // Primitives will be wrapped, null and undefined will be ignored.
    7. // Note, only string wrappers can have own enumerable properties.
    8. console.log(obj); // { "0": "a", "1": "b", "2": "c" }

    Copy to Clipboard

    异常会打断后续拷贝任务

    1. const target = Object.defineProperty({}, 'foo', {
    2. value: 1,
    3. writable: false
    4. }); // target.foo is a read-only property
    5. Object.assign(target, { bar: 2 }, { foo2: 3, foo: 3, foo3: 3 }, { baz: 4 });
    6. // TypeError: "foo" is read-only
    7. // The Exception is thrown when assigning target.foo
    8. console.log(target.bar); // 2, the first source was copied successfully.
    9. console.log(target.foo2); // 3, the first property of the second source was copied successfully.
    10. console.log(target.foo); // 1, exception is thrown here.
    11. console.log(target.foo3); // undefined, assign method has finished, foo3 will not be copied.
    12. console.log(target.baz); // undefined, the third source will not be copied either.

    Copy to Clipboard

    拷贝访问器

    1. const obj = {
    2. foo: 1,
    3. get bar() {
    4. return 2;
    5. }
    6. };
    7. let copy = Object.assign({}, obj);
    8. console.log(copy);
    9. // { foo: 1, bar: 2 }
    10. // The value of copy.bar is obj.bar's getter's return value.
    11. // This is an assign function that copies full descriptors
    12. function completeAssign(target, ...sources) {
    13. sources.forEach(source => {
    14. let descriptors = Object.keys(source).reduce((descriptors, key) => {
    15. descriptors[key] = Object.getOwnPropertyDescriptor(source, key);
    16. return descriptors;
    17. }, {});
    18. // By default, Object.assign copies enumerable Symbols, too
    19. Object.getOwnPropertySymbols(source).forEach(sym => {
    20. let descriptor = Object.getOwnPropertyDescriptor(source, sym);
    21. if (descriptor.enumerable) {
    22. descriptors[sym] = descriptor;
    23. }
    24. });
    25. Object.defineProperties(target, descriptors);
    26. });
    27. return target;
    28. }
    29. copy = completeAssign({}, obj);
    30. console.log(copy);
    31. // { foo:1, get bar() { return 2 } }

     

     2、JSON.stringify()

    JSON.stringify() | 菜鸟教程 (runoob.com)icon-default.png?t=M85Bhttps://www.runoob.com/json/json-stringify.htmlJSON 通常用于与服务端交换数据。

  • 相关阅读:
    深入了解Elasticsearch的CRUD:ES Java API之增删改查
    Camunda 7.x 系列【49】存储服务 RepositoryService
    大数据之Linux(一)
    vue中的 this.$refs,this.$emit,this.$store,this.$nextTick 的使用
    剑指offer刷题篇——第一篇(栈和队列)【秋招,前后端,客户端】
    Windows更新导致AMD Radeon Software等软件无法正常启动
    如何在PostgreSQL数据库中插入当前时间
    【云原生】Docker Compose初窥门径
    springboot+vue+java校园交友信息推荐网站
    SkyWalking服务应用
  • 原文地址:https://blog.csdn.net/qq_43784821/article/details/126858921