知识卡片
三种属性存在性检测各自的语义边界
内容
判断一个属性是否”存在”看似简单,实际有三种不同粒度的工具:o.x!==undefined只能说明属性存在且值不是undefined,但一个显式赋值为undefined的属性和一个根本不存在的属性,在这种检测下无法区分;hasOwnProperty(“x”)能区分出这个属性是自身的还是继承来的,但对继承属性一律返回false;“x” in o则不关心属性来自自身还是原型链,只要能通过查询链条找到就返回true,是唯一能把”属性存在但值为undefined”和”属性根本不存在”区分开的方式。选用哪一种取决于真正要问的问题是什么:关心值本身用!==undefined,关心是不是自己定义的用hasOwnProperty,关心这个名字在整条继承链上是否被占用就用in。
参考来源
《JavaScript权威指南(原书第6版)》第6章《对象》