几个Object原生的遍历方法详解
之前对于Object最熟悉的当然是Object.keys(), 平时开发也算是常用,今日才学习到原来还有Object.values()和Object.entries()
Object.values返回一个对象自身可枚举属性的值组成的数组
Object.entries则是返回一个对象自身可枚举属性的键值对,在需要将对象转成Map的时候就非常适用。
这里还牵涉到一个for...in和for...of的区别问题,for...of由ES6引入,只能对拥有迭代器的数组/Map等对象使用
参考
为什么![] == []返回true
// ![]返回是一个boolean类型 -> !Boolean([]) -> !true -> false
[] == ![] <=> [] == false
// object类型和boolean对比,先转换对象 -> [] -> [].toString() -> ''
[] == false <=> '' == false
// ==两边操作数出现boolean类型,我们先将它做数字类型转换 -> false -> Number(false) -> 0
'' == false <=> '' == 0
// ==两边操作数出现string类型和number类型,我们先将string类型做数字类型转换 -> '' -> Number('') -> 0
'' == 0 <=> 0 == 0
// 所以最后得出的结果为 true。
参考
连续赋值的问题
var a = {n: 1};
var b = a;
a.x = a = {n: 2};
a.x // 这时 a.x 的值是多少
b.x // 这时 b.x 的值是多少
// a => {n: 2};
// b => {n: 1, x: {n: 2}}
原因在于如下两点 1、js中运算符优先级顺序(.优先级大于=) 2、赋值语句执行顺序(从右向左)
a.x在编译时就已经确定了引用地址,所以还是会改变原来跟b指向的同一个对象的x