JSON.stringify的注意点

* 1、不获取值为undefined、function、symbol的属性,null会被获取哦
* 2、不获取原型链的属性
* 3、不获取不可枚举属性

再加一点,正则会被转为'{}',解析的时候会变成一个对象..

/reg/.toString(); // "/reg/"
/reg/.valueOf(); // "/reg/"

JSON.stringify([/\d+/]); //"{}"
JSON.parse(JSON.stringify([/\d+/])) // [{}]
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>JSON.stringify的注意点</title>
</head>

<body>
    <script>
        /**
         * 1、不获取值为undefined、function、symbol的属性,null会被获取哦
         * 2、不获取原型链的属性
         * 3、不获取不可枚举属性
         */
        class Person {
            constructor(options = {}) {
                this.name = Math.random().toString(36);
                Object.assign(this, options);
            }
            sayHello() {
                // 此为不可枚举属性,之前记录过,class中的方法都是由Object.defineProperty()添加的
                console.log(`my name is ${this.name}`);
            }
        }
        console.log(Object.getOwnPropertyDescriptor(Person.prototype, 'sayHello'));
        Person.prototype.sayHello = function () {
            console.log(`--- my name is ${this.name}`);
        };
        Object.defineProperty(Person.prototype, 'sayHello2', {
            configurable: true,
            writable: true,
            value() {
                console.log(`2222my name is ${this.name}`);
            },
        });
        Person.prototype.sayHello2 = function () {
            console.log(`--- 2222my name is ${this.name}`);
        };
        Person.prototype.sayHello3 = function () {
            console.log(`--- 3333my name is ${this.name}`);
        };
        const person = new Person({
            a: null,
            b: undefined,
            c() {
                console.log('c')
            },
            d: Symbol('d'),
        });
        person.sayHello();
        person.sayHello2();
        person.sayHello3();
        /**
         * sayHello1、sayHello2,虽然看起来重写了,这是因为writable:true,只是重写了value
         * sayHello3,是原型链上的可枚举属性
         * 
         */
        console.log('------------------------------------------'); {
            const allKeys = [];
            for (let k in person) {
                allKeys.push(k);
            }
            console.log(allKeys); // ["name", "a", "b", "c", "d", "sayHello3"]
        }
        console.log('------------------------------------------');
        const personDP = JSON.stringify(person);
        console.log(personDP); // name、a
    </script>
</body>

</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值