最近刚刚入职,接手了一个老项目,前人留下来的注释信息少之又少,经过“测试同事”的加班工作,我迎来了我的入职礼物:修改前人留下来的bug。
今日排雷:js判断对象是否包含某个元素
话不多说,上代码 ~
let data = {
a:111,
b:0,
c:undefined,
d:null,
e:'',
f:NaN,
g:-0
}
if(data['a']){ console.log('data内包含a元素')} //data内包含a元素
if(data['b']){ console.log('data内包含b元素')}
if(data['c']){ console.log('data内包含c元素')}
if(data['d']){ console.log('data内包含d元素')}
if(data['e']){ console.log('data内包含e元素')}
if(data['f']){ console.log('data内包含f元素')}
if(data['g']){ console.log('data内包含g元素')}
if(data['h']){ console.log('data内包含h元素')}
当判断data中是否包含指定元素时,只有a可以照常执行if代码块中的内容。
其原理: 在Js中当if语句中的表达式不是Bool类型时,会将其强制转换成Bool类型。其中 0、undefined、null、''(空字符串)、NaN 在强制转换成Bool类型时,其值为false。因此,当出现以上状况时,无法准确判断对象内是否某个元素。
经修改
let data = {
a:111,
b:0,
c:undefined,
d:null,
e:'',
f:NaN,
g:-0
}
if(data.hasOwnProperty('a')){ console.log('data内包含a元素')} //data内包含a元素
if(data.hasOwnProperty('b')){ console.log('data内包含b元素')} //data内包含b元素
if(data.hasOwnProperty('c')){ console.log('data内包含c元素')} //data内包含c元素
if(data.hasOwnProperty('d')){ console.log('data内包含d元素')} //data内包含d元素
if(data.hasOwnProperty('e')){ console.log('data内包含e元素')} //data内包含e元素
if(data.hasOwnProperty('f')){ console.log('data内包含f元素')} //data内包含f元素
if(data.hasOwnProperty('g')){ console.log('data内包含g元素')} //data内包含g元素
if(data.hasOwnProperty('h')){ console.log('data内包含h元素')}
所有继承了
Object的对象都会继承到hasOwnProperty方法。这个方法可以用来检测一个对象是否含有特定的自身属性;和in运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
**hasOwnProperty()** 方法会返回一个布尔值,即:对象中是否具有指定的属性。所以不论对象属性的值为null还是undefined,都会返回true。
写在最后 ~
这是我的第一篇分享,很感谢在这个资源丰富的大环境中让我不断成长,希望以后的日子里我也可以做到相互分享,还请多多指教~
最后的最后,为了避免以后我成为挖坑的前人,我一定认真写注释,合理组件化 !!