Bir nesnenin JavaScript'te belirli bir özelliği olup olmadığı nasıl belirlenir


311

Bir nesnenin değerine bakılmaksızın xtanımlanmış bir özelliğe sahip olup olmadığını nasıl belirleyebilirim ?yx.y

Şu anda kullanıyorum

if (typeof(x.y) !== 'undefined')

ama bu biraz hantal görünüyor. Daha iyi bir yol var mı?

Yanıtlar:


584

Nesnenin özelliği:

Nesnenin kendisinde bulunan özellikleri (prototip zincirinin bir parçası değil) test ediyorsanız şunları kullanabilirsiniz .hasOwnProperty():

if (x.hasOwnProperty('y')) { 
  // ......
}

Nesne veya prototipinin bir özelliği vardır:

inDevralınan özellikleri de sınamak için işleci kullanabilirsiniz .

if ('y' in x) {
  // ......
}

23
Ya da daha iyisi - Object.prototype.hasOwnProperty.call(x, 'y'), "hasOwnProperty" adlı mülkün inceleme süreciyle
çelişmemesi

4
Ya da daha kısa - {}.hasOwnProperty.call(x, 'y').
axmrnv


78

Nesnenin fiziksel olarak özelliği içerip içermediğini bilmek istiyorsanız @ gnarf'ın cevabını kullanarak işinizihasOwnProperty yaparsınız.

Özelliğin, nesnenin kendisinde veya prototip zincirinde herhangi bir yerde olup olmadığını bilmek istiyorsanız, inişleci kullanabilirsiniz .

if ('prop' in obj) {
  // ...
}

Örneğin.:

var obj = {};

'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically

18

Underscore.js veya Lodash

if (_.has(x, "y")) ...

:)


Hayır! Bu sadece bir takma ad Object.prototype.hasOwnProperty.call(x, "y"). Dizilerin için İstediğin düşünüyorum Array.prototype.indexOf, _.indexOfya_.contains
nackjicholson

13

Bunu şu şekilde kırpabilirsiniz:

if ( x.y !== undefined ) ...

15
Bu başarısız olurx = {y:undefined}
James

20
Herkesin "tanımlanmamış" ile "tanımsız olarak tanımlanmış" arasında ayrım yapması gerekiyor mu?
jpsimons

16
@darkporter bazen yaparım;)
mmm

6

Orijinal kodumun bir özelliği

if ( typeof(x.y) != 'undefined' ) ...

bazı durumlarda yararlı olabilecek bu, xvar olup olmadıklarını kullanmanın güvenli olmasıdır . Gnarf'ın cevabındaki yöntemlerden herhangi biri ile, ilk öncex eğer varsa, herhangi bir şüphe olup olmadığını .

Belki de üç yöntemin de birinin hile çantasında yeri vardır.


Her zaman (x && x.hasOwnProperty('y'))veya(x && 'y' in x)
gnarf

Kabul ediyorum, x için test tek başına ayrı bir durum olmalı. Ayrıca daha iyi hata raporlaması sağlar.
b01

Bu benim için başarısız oldu. X tanımsızsa, typeof (xy) ReferenceError, 'undefined' dizesinden ziyade bir döndürür
Craig

1

Soru, özellik denetiminin tıkanıklığı ve işlev bağımsız değişken seçenekleri nesnelerinin doğrulanması için düzenli bir kullanım alanı olduğundan, birden çok özelliğin varlığını test etmenin kitaplıksız kısa bir yolundan bahsettiğimi düşündüm. Feragatname: ECMAScript 5 gerektirir (ancak IE8 kullanan herkes IMO bozuk bir web'i hak eder).

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

-2

Neden sadece:

if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");

Veya belirli bir tür bekliyorsanız:

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");

1
Çünkü okumak zor ve katı değil. Size sormalıyım: neden basit değil x.hasOwnProperty('y')?
Fabian Picone
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.