213:对象
判断两者是否相等:
console.log(true === 1); // false console.log({} === {}); // false console.log("2" === 2); // falseconsole.log(NaN === NaN); // false console.log(isNaN(NaN)); // trueconsole.log(Object.is(true, 1)); // false console.log(Object.is({}, {})); // false console.log(Object.is("2", 2)); // false// 正确的 NaN 相等判定console.log(Object.is(NaN, NaN)); // true// 2. 属性值简写,可计算属性let name = 'Matt'; const nameKey = 'age';let person = { // name: name name, [nameKey]: '12', // [方括号内部的nameKye会计算为'age',此处也可以是根据函数或者方法设置]};
对象解构
// 嵌套解构时,使用的是浅拷贝,修改第一层的属性,原值不会改变,更深层会改变let person = { name: 'Matt', age: 27, job: { title: 'Software engineer' } }; // 声明 title 变量并将 person.job.title 的值赋给它let { job: job ,age: myage } = person; job.title = 'hello'myage = 12console.log(title,myage); // hello 12console.log(person.job.title,person.age) // hello 27// 可以采用嵌套的方式,深度拷贝,修改对应的属性时,原值不会改变// 声明 title 变量并将 person.job.title 的值赋给它let { job: { title } } = person; // 这样改变title时,原值不会该改变title = '123'console.log(title, person.job.title); // 123 'hello'
230:hasOwnProperty()能够清楚地看到访问的是实例属性还是原型属性
console.log(person1.name); // "Greg",来自实例 console.log(person1.hasOwnProperty("name")); // true 通过hasOwnProperty,属性来自实例上返回true,来自原型上返回falseconsole.log(person2.name); // "Nicholas",来自原型console.log(person2.hasOwnProperty("name")); // falseconsole.log("name" in person1) // true 通过in,无论该属性是在实例上还是在原型上都返回true// 确定某个属性是否存在于原型上function hasPrototypeProperty(object, name){ return !object.hasOwnProperty(name) && (name in object); }// 对象上所有可枚举的实例属性,可以使用 Object.keys()方法let keys = Object.keys(Person.prototype); console.log(keys); // "name,age,job,sayName"let p1 = new Person(); p1.name = "Rob"; p1.age = 31; let p1keys = Object.keys(p1); // 只列举出实例上的keyconsole.log(p1keys); // "[name,age]"// 列出所有实例属性,无论是否可以枚举,都可以使用 Object.getOwnPropertyNames()let keys = Object.getOwnPropertyNames(Person.prototype); console.log(keys); // "[constructor,name,age,job,sayName]"// for-in 循环和 Object.keys()的枚举顺序是不确定的,Object.getOwnPropertyNames()、Object.getOwnPropertySymbols()和 Object.assign()的枚举顺序是确定性的。// Object.values()返回对象值的数组,Object.entries()返回键/值对的数组,[sym]: 'foo'这种符号属性会被忽略const o = { foo: 'bar', baz: 1, qux: {} }; console.log(Object.values(o)); // ["bar", 1, {}] console.log(Object.entries((o))); // [["foo", "bar"], ["baz", 1], ["qux", {}]]