如何确定一个对象是否在JavaScript中有一个给定的属性
不pipexy
的值如何确定一个对象x
是否有一个定义的属性y
?
我目前正在使用
if (typeof(xy) !== 'undefined')
但这似乎有点笨重。 有没有更好的办法?
对象有属性:
如果您正在testing对象本身的属性(不是其原型链的一部分),则可以使用.hasOwnProperty()
:
if (x.hasOwnProperty('y')) { // ...... }
对象或其原型有一个属性:
您可以使用in
运算符来testinginheritance的属性。
if ('y' in x) { // ...... }
如果你想知道对象物理上是否包含属性@ gnarf的答案使用hasOwnProperty
将做的工作。
如果您想知道属性是否存在,无论是在对象本身还是在原型链中,都可以使用in
运算符 。
if ('prop' in obj) { // ... }
例如。:
var obj = {}; 'toString' in obj == true; // inherited from Object.prototype obj.hasOwnProperty('toString') == false; // doesn't contains it physically
你可以修改这个有点像这样:
if ( xy !== undefined ) ...
Underscore.js或Lodash
if (_.has(x, "y")) ...
🙂
我原来的代码的一个特点
if ( typeof(xy) != 'undefined' ) ...
这在某些情况下可能是有用的,因为x
是否存在是安全的。 用gnarf的答案中的任何一种方法,如果存在任何疑问,应首先testingx
。
所以也许所有这三种方法都有一个诀窍。
这里是我写这个对象 – hasOwnProperty可重用组件来检查一个对象是否具有属性dproperty,返回一个布尔值:
function hasOwnProperty(obj: {}, prop: string|number): boolean { return Object.prototype.hasOwnProperty.call(obj, prop); };
它没有上升到原型链,这里是相关的例子:
hasOwnProperty({foo: 'bar'}, 'foo') // => true hasOwnProperty({foo: 'bar'}, 'bar') // => false
还添加了3个testing来显示它如何处理不同的用例(具有值,没有值,为空)
因为问题是关于属性检查的笨拙,以及一个用于validation函数参数选项对象的常规用例,我想我会提到一个无库的testing多个属性存在的简短方法。 免责声明:它确实需要ECMAScript 5(但是任何仍然使用IE8的IMO都应该有一个破损的网页)。
function f(opts) { if(!["req1","req2"].every(opts.hasOwnProperty, opts)) { throw new Error("IllegalArgumentException"); } alert("ok"); } f({req1: 123}); // error f({req1: 123, req2: 456}); // ok
为什么不简单:
if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");
或者如果你期望一个特定的types:
if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");