一Symbol
给对象添加属性时,如 let obj = {}; obj.a = 1 这是应该用一Symbol作为属性名
二对象的属性可以用表达式
let obj = {};obj[a] = 1 或者 let a = 'a' obj = { [a] : 1 } 可以有效防止对象属性名相同被覆盖
三.对象的 for in 和 object.keys()遍历
for...in
循环:只遍历对象自身的和继承的可枚举的属性(不含 Symbol 属性)。Object.keys()
:返回对象自身(不含继承的)的所有可枚举的属性的键名(不含 Symbol 属性)。- Object.getOwnPropertySymbols(obj)返回一个数组,包含对象自身的所有 Symbol 属性的键名。
四、对象的结构是浅拷贝,如果一个值是复合类型的如: const {arr} = { arr: [1,2]} 解构出来的arr是引用地址
五、对象的扩展运算符
只能取对象自身且是可遍历的值,取不到对象原型上的值。对象的结构赋值是可以取到对象原型上的属性的
const o = Object.create({ x: 1, y: 2 });
o.z = 3;
let { x, ...newObj } = o;
let { y, z } = newObj;
x // 1
y // undefined
z // 3
对象的扩展运算符等同于使用Object.assign()
方法。
let aClone = { ...a };
// 等同于
let aClone = Object.assign({}, a);
let ab = { ...a, ...b };
// 等同于
let ab = Object.assign({}, a, b);
与数组的扩展运算符一样,对象的扩展运算符后面可以跟表达式。
const obj = {
...(x > 1 ? {a: 1} : {}),
b: 2,
};
六、do表达式
七、&& 运算符的优先级高于 || 运算符的优先级
||运算符的优先级高于?:运算符的优先级
八、&&和||是左关联
?:运算符是右关联
=也是右关联
九、数组也可以解构
let [key, value, value2] = [1,2,3]
console.log(key, value,value2) //1 2 3
const items = [
['name', '张三'],
['title', 'Author']
];
const map = new Map();
items.forEach(
([key, value]) => map.set(key, value)
);
十、数组的indexOf
let dataArr = [2,3,5,1,3,5]
dataArr.splice(dataArr.indexOf(1),1)