如何检查JavaScript对象或数组中是否存在特定键?
如果密钥不存在,并且我试图访问它,它会返回false吗?或者抛出错误?
如何检查JavaScript对象或数组中是否存在特定键?
如果密钥不存在,并且我试图访问它,它会返回false吗?或者抛出错误?
当前回答
这里有一个我觉得很有用的助手函数
此keyExists(key,search)可用于轻松查找对象或数组中的键!
只需将要查找的键传递给它,然后搜索要查找它的obj(对象或数组)。
函数keyExists(键,搜索){if(!search||(search.constructor!==数组&&search.constructionr!==对象)){return false;}for(var i=0;i<search.length;i++){if(搜索[i]==键){返回true;}}搜索中的返回键;}//如何使用://在数组中搜索关键字console.log(keyExists('apple',[apple','banana','orange']);//真的console.log(keyExists('水果',[苹果','香蕉','橙色']);//假的//在对象中搜索关键字console.log(keyExists('age',{'name':'Bill','age':29}));//真的console.log(keyExists('title',{'name':'Jason','age':29}));//假的
它非常可靠,跨浏览器运行良好。
其他回答
检查未定义性不是测试密钥是否存在的准确方法。如果键存在但值实际上未定义怎么办?
var obj={key:undefined};console.log(obj[“key”]!==未定义);//false,但密钥存在!
您应该改用in运算符:
var obj={key:undefined};console.log(obj中的“key”);//true,无论实际值如何
如果要检查键是否不存在,请记住使用括号:
var obj={not_key:undefined};console.log(!(obj中的“key”));//如果对象中不存在“key”,则为trueconsole.log(obj中的!“key”);//不要这样做!它相当于“obj中的false”
或者,如果要特别测试对象实例的财产(而不是继承的财产),请使用hasOwnProperty:
var obj={key:undefined};console.log(obj.hasOwnProperty(“key”));//真的
有关hasOwnProperty和key未定义的方法之间的性能比较,请参阅以下基准:
检查javascript对象中是否存在属性的三种方法:
!!对象.属性将值转换为布尔值。对于除false值之外的所有值返回true对象中的“属性”如果属性存在,无论其值如何(甚至为空),都将返回trueobj.hasOwnProperty(“属性”)不检查原型链。(由于所有对象都有toString方法,因此1和2将返回true,而3可以返回false。)
参考:
http://book.mixu.net/node/ch5.html
虽然这不一定检查键是否存在,但它确实检查值的真实性。其中未定义和空值属于。
布尔(obj.foo)
这个解决方案最适合我,因为我使用了typescript,并且在obj或obj.hasOwnProperty('fo')中使用了像so'foo'这样的字符串检查密钥是否存在并不能为我提供智能感知。
使用“反射”的替代方法
根据MDN
Reflect是一个内置对象,它提供可拦截的方法JavaScript操作。静态Reflect.has()方法的工作方式类似于in运算符作用
变量obj={a: 未定义,b: 1中,c: “hello world”}console.log(Reflect.has(obj,“a”))console.log(Reflect.has(obj,'b'))console.log(Reflect.has(obj,“c”))console.log(Reflect.has(obj,“d”))
我应该使用它吗?
这取决于。
Reflect.has()比公认答案中提到的其他方法慢(根据我的基准测试)。但是,如果您只在代码中使用它几次,我看不出这种方法有多大问题。
这里有一个我觉得很有用的助手函数
此keyExists(key,search)可用于轻松查找对象或数组中的键!
只需将要查找的键传递给它,然后搜索要查找它的obj(对象或数组)。
函数keyExists(键,搜索){if(!search||(search.constructor!==数组&&search.constructionr!==对象)){return false;}for(var i=0;i<search.length;i++){if(搜索[i]==键){返回true;}}搜索中的返回键;}//如何使用://在数组中搜索关键字console.log(keyExists('apple',[apple','banana','orange']);//真的console.log(keyExists('水果',[苹果','香蕉','橙色']);//假的//在对象中搜索关键字console.log(keyExists('age',{'name':'Bill','age':29}));//真的console.log(keyExists('title',{'name':'Jason','age':29}));//假的
它非常可靠,跨浏览器运行良好。