!this.hasOwnProperty('myObj') //因使用this,所以变量定义在window下面了
typeof myObj == "undefined"
myObj === undefined //window下的变量 直接访问会报错:uncaught ReferenceError: a is not defined //所以重新定义了一组 变量c,d
typeof myObj == "undefined"; // typeof 检测出来的结果无论是什么都是一个字符串类型的结果 // 如果此时 myObj 存在 => 相当于 : typeof {} == "undefined" -> "object" == "undefined" -> false // 如果此时 myObj 不存在 => 相当于 : typeof null == "undefined" -> "null" == "undefined" -> false // 不论 myObj 是否存在该判断语句都返回 false 所以 A 错。
myObj === undefined; // 如果此时 myObj 存在 => 相当于 : {} === undefined -> 【三个等于是严格等于不会进行数据类型转换】-> false // 如果此时 myObj 不存在 => 相当于 : null === undefined -> false【三个等于与两个等于的区别要注意】 -> false // 不论 myObj 是否存在该判断语句都返回 false 所以 B 错。
myObj === null; // 如果此时 myObj 存在 => 相当于 : {} === null -> false // 如果此时 myObj 存在 => 相当于 : null === null -> true // myObj 存在返回 false , 不存在返回 true 所以 C 对。
!this.hasOwnProperty('myObj'); 最后一个选项败在这个取反操作符上了!
// 例一:如果obj不存在,就进入if语句里(obj只声明,未赋值情况下) var obj; if(obj === undefined ){ ... //能进入这个if语句 } // 例二:如果obj不存在,就进入if语句里(obj只声明,未赋值情况下) var obj; if( typeof obj == 'undefined' ){ ... //能进入这个if语句 } // 例三:如果obj不存在,就进入if语句里 if(obj === null ){ //其实obj是不存在的,但是obj === null结果是false ... //故不能进入这个if语句 }// 例四:如果obj不存在,就进入if语句里(obj未声明的情况下) if(!this.hasOwnProperty('obj')){ ... //能进入这个if语句 }
!this.hasOwnProperty('myObj') this是什么?this是动态的!hasOwnPrototype 查找自身是否有该属性,这个不是很严格,我不同意它是正确的