* 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>