2019第31周学习内容

140 阅读1分钟

几个Object原生的遍历方法详解

之前对于Object最熟悉的当然是Object.keys(), 平时开发也算是常用,今日才学习到原来还有Object.values()Object.entries()
Object.values返回一个对象自身可枚举属性的值组成的数组
Object.entries则是返回一个对象自身可枚举属性的键值对,在需要将对象转成Map的时候就非常适用。
这里还牵涉到一个for...infor...of的区别问题,for...of由ES6引入,只能对拥有迭代器的数组/Map等对象使用

参考

JS中轻松遍历对象属性的几种方式

为什么![] == []返回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

参考

连续赋值的题