JavaScript'teki bir nesne özelliğinin olup olmadığını kontrol etmenin en iyi yolu nedir undefined
?
JavaScript'teki bir nesne özelliğinin olup olmadığını kontrol etmenin en iyi yolu nedir undefined
?
Yanıtlar:
Bir mülkün değerinin özel değer olup olmadığını kontrol etmenin genel yolu undefined
:
if(o.myProperty === undefined) {
alert("myProperty value is the special value `undefined`");
}
Bir nesnenin böyle bir özelliğe sahip olup olmadığını ve bu nedenle undefined
ona erişmeye çalıştığınızda varsayılan olarak geri dönüp dönmeyeceğini kontrol etmek için:
if(!o.hasOwnProperty('myProperty')) {
alert("myProperty does not exist");
}
Bir tanımlayıcı ile ilişkili değer özel değer olup olmadığını kontrol etmek undefined
, ya da o tanımlayıcı ilan edilmemiş ise. Not: Bu yöntem, erken bir hata olmadan bildirilmemiş (not: değerine sahip olmaktan farklı undefined
) bir tanımlayıcıya başvurmanın tek yoludur :
if(typeof myVariable === 'undefined') {
alert('myVariable is either the special value `undefined`, or it has not been declared');
}
ECMAScript 5'ten önceki JavaScript sürümlerinde, genel nesne üzerindeki "tanımsız" adlı özellik yazılabilirdi ve bu nedenle foo === undefined
, yanlışlıkla yeniden tanımlanmışsa basit bir denetim beklenmedik şekilde davranabilir. Modern JavaScript'te, özellik salt okunurdur.
Bununla birlikte, modern JavaScript'te, "tanımsız" bir anahtar kelime değildir ve bu nedenle işlevlerin içindeki değişkenler "tanımsız" olarak adlandırılabilir ve global özellik gölgelenebilir.
Bu (olası olmayan) uç durumdan endişe ediyorsanız , özel değerin kendisine ulaşmak için void operatörünü kullanabilirsiniz undefined
:
if(myVariable === void 0) {
alert("myVariable is the special value `undefined`");
}
obj !== undefined
Şimdi kullanabilirsiniz . undefined
eskiden değişebilirdi, undefined = 1234
ilginç sonuçlara neden olacak gibi . Ancak Ecmascript 5'ten sonra artık yazılamaz, bu yüzden daha basit sürümü kullanabiliriz. codereadability.com/how-to-check-for-undefined-in-javascript
Bu konuda bazı yanlış cevaplar olduğuna inanıyorum. Genel kanının aksine, "tanımsız", JavaScript'teki bir anahtar kelime değildir ve aslında kendisine atanmış bir değere sahip olabilir.
Bu testi yapmanın en sağlam yolu:
if (typeof myVar === "undefined")
Bu her zaman doğru sonucu döndürür ve hatta myVar
beyan edilmeyen durumu ele alır .
var undefined = false; // Shockingly, this is completely legal!
if (myVar === undefined) {
alert("You have been misled. Run away!");
}
Ayrıca, myVar === undefined
myVar'ın bildirilmediği durumda bir hata ortaya çıkarır.
=== undefined
Şaşkınlık kullanmadığı için burada verilen ilk gerekçesi buluyorum . Evet, atayabilirsiniz undefined
, ancak bunun meşru bir nedeni yoktur ve bunu yapmak kodunuzu bozabileceği öngörülebilir. C'de #define true false
ve Python'da atayabilir True
ve atayabilirsiniz False
, ancak insanlar kodlarını bu dillerde başka bir yerde kendi ortamlarını kasıtlı olarak sabote etme olasılığına karşı koruma sağlayacak şekilde tasarlama gereğini hissetmezler. . Neden undefined
burada düşünmeye bile değer atama olasılığı var?
void 0
eden değeri elde etmek için yapabileceğinizi unutmayın undefined
. Böylece yapabilirsiniz if (myVar === void 0)
. 0
özel değil, kelimenin tam anlamıyla orada herhangi bir ifade koyabilirsiniz.
undefined
. MDN: undefined
Burada birçok cevap tarafından şiddetle tavsiye edilmesine rağmen, typeof
kötü bir seçimdir . Asla değişkenlerin değere sahip olup olmadığını kontrol etmek için kullanılmamalıdır undefined
, çünkü değer undefined
ve bir değişkenin var olup olmadığı için birleşik kontrol görevi görür . Vakaların büyük çoğunluğunda, bir değişkenin ne zaman var olduğunu bilirsiniz typeof
ve değişken adında veya dizgi değişmezinde bir yazım hatası yaparsanız yalnızca sessiz bir hata potansiyeli ortaya koyar 'undefined'
.
var snapshot = …;
if (typeof snaposhot === 'undefined') {
// ^
// misspelled¹ – this will never run, but it won’t throw an error!
}
var foo = …;
if (typeof foo === 'undefned') {
// ^
// misspelled – this will never run, but it won’t throw an error!
}
Dolayısıyla, belirli bir adın kapsamda olup olmayacağı konusunda belirsizliğin typeof module !== 'undefined'
olduğu bir ortak özellik² yapmıyorsanız (bir CommonJS ortamına özgü kodda bir adım olarak kontrol etmek gibi), typeof
bir değişken üzerinde kullanıldığında zararlı bir seçimdir ve doğru seçenek değeri doğrudan karşılaştırmak için:
var foo = …;
if (foo === undefined) {
⋮
}
Bununla ilgili bazı yaygın yanılgılar şunları içerir:
“başlatılmamış” bir değişken ( var foo
) veya parametre ( function bar(foo) { … }
olarak adlandırılır ) okunmasının bar()
başarısız olacağını. Bu doğru değildir - açık başlatma ve değişkenler verilmeyen parametreler her undefined
zaman kapsamdadır.
O undefined
üzerine yazılır olabilir. Bundan daha fazlası var. undefined
JavaScript'teki bir anahtar kelime değil. Bunun yerine, genel nesne üzerinde Tanımsız değere sahip bir özelliktir. Ancak, ES5'ten bu yana, bu özellik salt okunur ve yapılandırılamaz . Hiçbir modern tarayıcı undefined
mülkün değiştirilmesine izin vermeyecek ve 2017'den bu yana uzun zamandır durum böyleydi. Katı modun olmaması undefined
da davranışını etkilemez - sadece undefined = 5
atmak yerine hiçbir şey yapmamak gibi ifadeler yapar . O bir anahtar kelime olmadığından, gerçi yapabilirsiniz beyan adıyla değişkenleri undefined
bu kez ortak desen yapma, ve bu değişkenler değiştirilebilir:
(function (undefined) {
// …
})()
küresel kullanmaktan daha tehlikeli undefined
. Eğer ES3-uyumlu olması gerekiyorsa, yerine undefined
birlikte void 0
- çare yoktur typeof
. ( void
her zaman herhangi bir işlenen için Tanımlanmamış değeri değerlendiren tekli bir operatör olmuştur.)
Değişkenlerin yoldan nasıl çıktığıyla, asıl soruyu ele alma zamanı: nesne özellikleri. typeof
Nesne özellikleri için kullanmak için hiçbir neden yoktur . Özellik algılama ile ilgili önceki istisna burada geçerli değildir - typeof
yalnızca değişkenler üzerinde özel davranışlar vardır ve nesne özelliklerine başvuran ifadeler değişken değildir.
Bu:
if (typeof foo.bar === 'undefined') {
⋮
}
her zaman tam olarak buna eşittir³:
if (foo.bar === undefined) {
⋮
}
ve yukarıdaki önerileri dikkate alarak, okuyucuları neden kullandığınız konusunda kafa karıştırmaktan kaçınmaktır typeof
, çünkü ===
eşitliği kontrol etmek için kullanmak en mantıklıdır , çünkü daha sonra bir değişkenin değerini kontrol etmek için yeniden düzenlenebilir ve sadece düz olduğu için daha iyi görünüyorsa, burada da her zaman === undefined
³ kullanmalısınız .
Nesne özellikleri söz konusu olduğunda dikkate alınması gereken başka bir şey, gerçekten kontrol etmek isteyip istemediğinizdir undefined
. Belirli bir özellik adı, bir nesnede ( undefined
okunduğunda değeri üreterek ), nesnenin kendisinde değerle undefined
, nesnenin prototipinde değerle undefined
mevcut olabilir veya değeri olmayanlardan birinde bulunabilir undefined
. 'key' in obj
bir anahtarın bir nesnenin prototip zincirinde herhangi bir yerde Object.prototype.hasOwnProperty.call(obj, 'key')
olup olmadığını ve doğrudan nesnenin üzerinde olup olmadığını söyleyecektir. Bununla birlikte, prototipler ve nesneleri dize anahtarlı haritalar olarak kullanma hakkındaki bu cevapta ayrıntıya girmeyeceğim, çünkü çoğunlukla orijinal sorunun olası yorumlarına bakılmaksızın diğer cevaplardaki tüm kötü tavsiyelere karşı koymayı amaçlıyor. Üzerinde okumakdaha fazla bilgi için MDN üzerinde prototipler !
Variable alışılmadık örnek değişken adı seçimi? Bu, Firefox için NoScript uzantısından gerçek ölü koddur.
² Yine de, kapsamda ne olduğunu bilmemenin genel olarak iyi olduğunu varsaymayın. Dinamik kapsamın kötüye kullanılması nedeniyle ortaya çıkan ilave güvenlik açığı: Sıfır Noktası 1225 Project bir
kez daha ES5 + ortamını kabul undefined
eder ve bu undefined
, global nesnenin özelliğine işaret eder . yerine void 0
, aksi.
undefined
gizleyerek kendi içeriğini tanımlayabilir . En pratik amaçlar için üzerine yazmakla aynı etkiye sahiptir.
void 0
tanımsız ile karşılaştırmak için kullanabilirsiniz ama yine - bu aptalca ve aşırı.
typeof something === "undefined")
kod görmeyi bırakmak istiyorum .
void 0
hem daha kısa (bir kez) olduğunu ve güvenli! Bu kitabımda bir kazanç.
JavaScript'te null ve undefined var . Farklı anlamları var.
Marijn Haverbeke, " Eloquent JavaScript " adlı ücretsiz çevrimiçi kitabında (benimki vurgu):
Benzer bir değer de vardır, null, anlamı 'bu değer tanımlanır, ancak bir değeri yoktur'. Undefined ve null arasındaki anlam farkı çoğunlukla akademiktir ve genellikle çok ilginç değildir. Pratik programlarda, genellikle bir şeyin 'değeri olup olmadığını' kontrol etmek gerekir. Bu durumlarda, == undefined ifadesi kullanılabilir, çünkü tam olarak aynı değer olmasa da, null == undefined true değerini üretir.
Yani, sanırım bir şeyin tanımsız olup olmadığını kontrol etmenin en iyi yolu:
if (something == undefined)
Bu yardımcı olur umarım!
Düzenleme: Düzenlemenize yanıt olarak, nesne özellikleri aynı şekilde çalışmalıdır.
var person = {
name: "John",
age: 28,
sex: "male"
};
alert(person.name); // "John"
alert(person.fakeVariable); // undefined
undefined
yalnızca kullanıcı tarafından yeniden atanabilen bir değişkendir: yazma undefined = 'a';
, kodunuzun artık düşündüğünü yapmasına neden olmaz. Kullanmak typeof
daha iyidir ve beyan edilmemiş değişkenler (sadece özellikler için değil) için de geçerlidir.
Bu ne anlama geliyor: "tanımsız nesne özelliği" ?
Aslında bu iki farklı anlama gelebilir! Birincisi, nesnede hiç tanımlanmamış özellik anlamına gelebilir ve ikincisi, tanımlanmamış bir değere sahip özellik anlamına gelebilir . Şimdi bu koda bakalım:
var o = { a: undefined }
Is o.a
tanımsız? Evet! Değeri tanımlanmamış. Is o.b
tanımsız? Elbette! Hiç 'b' özelliği yoktur! Tamam, şimdi her iki durumda da farklı yaklaşımların nasıl davrandığını görün:
typeof o.a == 'undefined' // true
typeof o.b == 'undefined' // true
o.a === undefined // true
o.b === undefined // true
'a' in o // true
'b' in o // false
Bunu açıkça görebiliyoruz typeof obj.prop == 'undefined'
ve obj.prop === undefined
eşdeğeriz ve bu farklı durumları ayırt etmiyorlar. Ve 'prop' in obj
bir mülk hiç tanımlanmadığında ve tanımlanamayan mülk değerine dikkat etmediğinde durumu tespit edebilir.
1) Bir mülkün birinci veya ikinci anlamı ile tanımlanıp tanımlanmadığını bilmek istersiniz (en tipik durum).
obj.prop === undefined // IMHO, see "final fight" below
2) Nesnenin bir özelliği olup olmadığını bilmek istiyorsunuz ve değerini önemsemiyorsunuz.
'prop' in obj
x.a === undefined
ya da bu typeof x.a == 'undefined'
yükselir ReferenceError: x is not defined
.undefined
genel bir değişkendir (yani aslında window.undefined
tarayıcılardadır). ECMAScript 1st Edition'dan beri desteklenmektedir ve ECMAScript 5'ten beri salt okunurdur . Modern tarayıcılarda , birçok yazar bizi korkutmayı sevdiği için doğru olarak yeniden tanımlanamaz , ancak bu hala eski tarayıcılar için geçerlidir.obj.prop === undefined
vstypeof obj.prop == 'undefined'
Artıları obj.prop === undefined
:
undefined
Eksileri obj.prop === undefined
:
undefined
eski tarayıcılarda geçersiz kılınabilirArtıları typeof obj.prop == 'undefined'
:
Eksileri typeof obj.prop == 'undefined'
:
'undefned'
( yanlış yazılmış ) burada sadece bir dize sabiti var, bu yüzden yaptığım gibi yanlış yazdıysanız JavaScript motoru size yardımcı olamaz.Node.js, global değişkeni undefined
şu şekilde destekler global.undefined
('global' öneki olmadan da kullanılabilir). Sunucu tarafı JavaScript'in diğer uygulamaları hakkında bilmiyorum.
undefined
üyesi olarak hiçbir şey söylemedi global
. Ayrıca ne console.log(global);
ne de for (var key in global) { ... }
göstermek değil tanımsız bir üyesi olarak küresel . Ama 'undefined' in global
tam tersini göstermek gibi test edin.
[[Enumerable]]
yanlış olduğunu söylüyor :-)
Minuses of typeof obj.prop == 'undefined'
, bu yazı olarak önlenebilir typeof obj.prop == typeof undefined
. Bu da çok hoş bir simetri verir.
obj.prop === undefined
.
if ('foo' in o
cevabınız gerçekten burada ilk doğru cevap. Hemen hemen herkes bu cümleyi cevaplıyor.
Sorun üç vakayla ilgilidir:
undefined
.undefined
.Bu bize önemli olduğunu düşündüğüm bir şey söylüyor:
Tanımlanmamış bir üye ile tanımlanmamış bir değere sahip tanımlı bir üye arasında bir fark vardır.
Ancak mutsuzca typeof obj.foo
bize bu üç durumdan hangisinin olduğunu söylemiyor. Bununla birlikte "foo" in obj
, vakaları ayırt etmek için bunu birleştirebiliriz .
| typeof obj.x === 'undefined' | !("x" in obj)
1. { x:1 } | false | false
2. { x : (function(){})() } | true | false
3. {} | true | true
Bu testlerin null
girişler için de aynı olduğunu belirtmek gerekir.
| typeof obj.x === 'undefined' | !("x" in obj)
{ x:null } | false | false
Bazı durumlarda, mülkün var olup olmadığını kontrol etmenin, tanımlanıp tanımlanmadığını kontrol etmekten daha mantıklı olduğunu (ve daha açık olduğunu) ve bu kontrolün farklı olacağı tek durumun durum 2 olduğunu, nesnede tanımlanmamış bir değere sahip gerçek bir girdi.
Örneğin: Bir nesnenin belirli bir özelliğe sahip olup olmadığını kontrol eden bir grup kodu yeniden düzenledim.
if( typeof blob.x != 'undefined' ) { fn(blob.x); }
Hangi tanımsız bir çek olmadan yazıldığında daha açıktı.
if( "x" in blob ) { fn(blob.x); }
Ancak belirtildiği gibi bunlar tam olarak aynı değildir (ancak ihtiyaçlarım için yeterince iyi değildir).
if (!("x" in blob)) {}
Köşeli parantez içinde söylemek zorundasınız , çünkü! operatörün 'in' yerine önceliği vardır. Umarım birine yardım eder.
a = {b: undefined}
; sonra typeof a.b === typeof a.c === 'undefined'
ama 'b' in a
ve !('c' in a)
.
{ x : undefined }
veya en azından tablodaki (2.) 'ye başka bir alternatif olarak eklemenizi öneririm - (2.)' nin undefined
( bundan sonra bahsedersiniz).
if ( typeof( something ) == "undefined")
Diğerleri yapmazken bu benim için çalıştı.
typeof (something == "undefined")
.
(typeof something) === "undefined"
.
Kullanarak kökeni nerede emin değilim ===
ile typeof
geldi ve bir kongre olarak bunu birçok kütüphanelerde kullanılan görüyorum, ama typeof operatörü dize döndürür ve biz o kadar ön biliyoruz, neden ayrıca tip isteyeyim kontrol etmek mi?
typeof x; // some string literal "string", "object", "undefined"
if (typeof x === "string") { // === is redundant because we already know typeof returns a string literal
if (typeof x == "string") { // sufficient
==
Yine de kullanmak için en azından bir tür denetim gerekir - yorumlayıcı önce türlerini bilmeden iki işleneni karşılaştıramaz.
==
bir karakterden daha az ===
:)
Benim yollamaktasınız cevabı ilgili sorudan Nasıl JavaScript "tanımsız" için kontrol edilir?
Bu soruya özgü olan test senaryolarına bakın someObject.<whatever>
.
Çeşitli cevapların sonuçlarını gösteren bazı senaryolar: http://jsfiddle.net/drzaus/UVjM4/
(Not kullanımı bu var
için in
testler bir fark olduğunda, bir kapsamlı sargı içinde)
Referans kodu:
(function(undefined) {
var definedButNotInitialized;
definedAndInitialized = 3;
someObject = {
firstProp: "1"
, secondProp: false
// , undefinedProp not defined
}
// var notDefined;
var tests = [
'definedButNotInitialized in window',
'definedAndInitialized in window',
'someObject.firstProp in window',
'someObject.secondProp in window',
'someObject.undefinedProp in window',
'notDefined in window',
'"definedButNotInitialized" in window',
'"definedAndInitialized" in window',
'"someObject.firstProp" in window',
'"someObject.secondProp" in window',
'"someObject.undefinedProp" in window',
'"notDefined" in window',
'typeof definedButNotInitialized == "undefined"',
'typeof definedButNotInitialized === typeof undefined',
'definedButNotInitialized === undefined',
'! definedButNotInitialized',
'!! definedButNotInitialized',
'typeof definedAndInitialized == "undefined"',
'typeof definedAndInitialized === typeof undefined',
'definedAndInitialized === undefined',
'! definedAndInitialized',
'!! definedAndInitialized',
'typeof someObject.firstProp == "undefined"',
'typeof someObject.firstProp === typeof undefined',
'someObject.firstProp === undefined',
'! someObject.firstProp',
'!! someObject.firstProp',
'typeof someObject.secondProp == "undefined"',
'typeof someObject.secondProp === typeof undefined',
'someObject.secondProp === undefined',
'! someObject.secondProp',
'!! someObject.secondProp',
'typeof someObject.undefinedProp == "undefined"',
'typeof someObject.undefinedProp === typeof undefined',
'someObject.undefinedProp === undefined',
'! someObject.undefinedProp',
'!! someObject.undefinedProp',
'typeof notDefined == "undefined"',
'typeof notDefined === typeof undefined',
'notDefined === undefined',
'! notDefined',
'!! notDefined'
];
var output = document.getElementById('results');
var result = '';
for(var t in tests) {
if( !tests.hasOwnProperty(t) ) continue; // bleh
try {
result = eval(tests[t]);
} catch(ex) {
result = 'Exception--' + ex;
}
console.log(tests[t], result);
output.innerHTML += "\n" + tests[t] + ": " + result;
}
})();
Ve sonuçlar:
definedButNotInitialized in window: true
definedAndInitialized in window: false
someObject.firstProp in window: false
someObject.secondProp in window: false
someObject.undefinedProp in window: true
notDefined in window: Exception--ReferenceError: notDefined is not defined
"definedButNotInitialized" in window: false
"definedAndInitialized" in window: true
"someObject.firstProp" in window: false
"someObject.secondProp" in window: false
"someObject.undefinedProp" in window: false
"notDefined" in window: false
typeof definedButNotInitialized == "undefined": true
typeof definedButNotInitialized === typeof undefined: true
definedButNotInitialized === undefined: true
! definedButNotInitialized: true
!! definedButNotInitialized: false
typeof definedAndInitialized == "undefined": false
typeof definedAndInitialized === typeof undefined: false
definedAndInitialized === undefined: false
! definedAndInitialized: false
!! definedAndInitialized: true
typeof someObject.firstProp == "undefined": false
typeof someObject.firstProp === typeof undefined: false
someObject.firstProp === undefined: false
! someObject.firstProp: false
!! someObject.firstProp: true
typeof someObject.secondProp == "undefined": false
typeof someObject.secondProp === typeof undefined: false
someObject.secondProp === undefined: false
! someObject.secondProp: true
!! someObject.secondProp: false
typeof someObject.undefinedProp == "undefined": true
typeof someObject.undefinedProp === typeof undefined: true
someObject.undefinedProp === undefined: true
! someObject.undefinedProp: true
!! someObject.undefinedProp: false
typeof notDefined == "undefined": true
typeof notDefined === typeof undefined: true
notDefined === undefined: Exception--ReferenceError: notDefined is not defined
! notDefined: Exception--ReferenceError: notDefined is not defined
!! notDefined: Exception--ReferenceError: notDefined is not defined
Yaparsan
if (myvar == undefined )
{
alert('var does not exists or is not initialized');
}
değişken myvar
var olmadığında başarısız olur , çünkü myvar tanımlanmamıştır, bu yüzden komut dosyası bozulur ve testin bir etkisi olmaz.
Pencere nesnesi bir işlevin dışında genel bir kapsama (varsayılan nesne) sahip olduğundan, pencere nesnesine bir bildirim eklenir.
Örneğin:
var myvar = 'test';
Genel değişken myvar , window.myvar veya window ['myvar'] ile aynıdır
Genel bir değişken olduğunda test edilecek hatalardan kaçınmak için şunları kullanın:
if(window.myvar == undefined )
{
alert('var does not exists or is not initialized');
}
Bir değişkenin gerçekten var olup olmadığı önemli değildir, değeri yanlıştır. Aksi takdirde, değişkenleri tanımsız olarak başlatmak saçmadır ve başlatmak için false değerini kullanmak daha iyidir. Bildirdiğiniz tüm değişkenlerin false ile başlatıldığını bildiğinizde, türünü kontrol edebilir veya !window.myvar
uygun / geçerli bir değere sahip olup olmadığını kontrol etmek için güvenebilirsiniz . Değişken tanımlanmamış olsa bile, veya veya !window.myvar
için aynıdır .myvar = undefined
myvar = false
myvar = 0
Belirli bir tür beklediğinizde, değişkenin türünü test edin. Bir koşulu test etmeyi hızlandırmak için şunları yapabilirsiniz:
if( !window.myvar || typeof window.myvar != 'string' )
{
alert('var does not exists or is not type of string');
}
İlk ve basit koşul doğru olduğunda, tercüman sonraki testleri atlar.
Geçerli bir değere sahip olup olmadığını kontrol etmek için değişkenin örneğini / nesnesini kullanmak her zaman daha iyidir. Daha kararlı ve daha iyi bir programlama yöntemidir.
(Y)
Kimse özellik önce nesneyi kontrol görmedim (umut özledim vermedi). Yani, bu en kısa ve en etkili olanıdır (her ne kadar mutlaka en açık olmasa da):
if (obj && obj.prop) {
// Do something;
}
Obj veya obj.prop tanımsız, null veya "falsy" ise, if ifadesi kod bloğunu yürütmez. Bu, çoğu kod bloğu deyiminde (JavaScript'te) genellikle istenen davranıştır.
var x = obj && obj.prop || 'default';
JavaScript'te Boş ve Tanımlanmamış Uçurumu Keşfetme makalesinde Underscore.js gibi çerçevelerin bu işlevi kullandığını okudum :
function isUndefined(obj){
return obj === void 0;
}
void 0
sadece kısa bir yazma yoludur undefined
( herhangi bir ifadenin ardından gelen boşluk budur ), 3 karakter kaydeder. Ayrıca yapabilirdi var a; return obj === a;
, ama bu bir karakter daha. :-)
void
ayrılmış bir kelimedir, ancak undefined
ie, varsayılan undefined
olarak eşit değilse void 0
, undefined
ör undefined = 1234
.
isUndefined(obj)
: 16 karakter. obj === void 0
: 14 karakter. dedi nough.
JavaScript'te tanımlanmayan herhangi bir şey tanımlanmamıştır , bir Object / Array içindeki bir özellik mi yoksa sadece basit bir değişken mi olduğu önemli değildir ...
JavaScript, typeof
tanımlanmamış bir değişkeni algılamayı çok kolaylaştırır.
Sadece typeof whatever === 'undefined'
bir boolean döndürüp döndürmeyeceğini kontrol edin .
isUndefined()
AngularJs v.1x'deki ünlü fonksiyon şöyle yazılır:
function isUndefined(value) {return typeof value === 'undefined';}
Bu nedenle, işlevin bir değer aldığını gördüğünüz gibi, bu değer tanımlanmışsa, döndürülür false
, aksi takdirde tanımlanmamış değerler için geri döner true
.
Öyleyse, aşağıdaki gibi nesne özellikleri de dahil olmak üzere değerleri geçerken sonuçların ne olacağına bir göz atalım, sahip olduğumuz değişkenlerin listesi:
var stackoverflow = {};
stackoverflow.javascipt = 'javascript';
var today;
var self = this;
var num = 8;
var list = [1, 2, 3, 4, 5];
var y = null;
ve bunları aşağıdaki gibi kontrol ediyoruz, önlerindeki sonuçları bir yorum olarak görebilirsiniz:
isUndefined(stackoverflow); //false
isUndefined(stackoverflow.javascipt); //false
isUndefined(today); //true
isUndefined(self); //false
isUndefined(num); //false
isUndefined(list); //false
isUndefined(y); //false
isUndefined(stackoverflow.java); //true
isUndefined(stackoverflow.php); //true
isUndefined(stackoverflow && stackoverflow.css); //true
Gördüğünüz gibi, kodumuzda böyle bir şey kullanarak herhangi bir şeyi kontrol edebiliriz, belirtildiği gibi kodunuzda kullanabilirsiniz typeof
, ancak tekrar tekrar kullanıyorsanız, paylaştığım açısal örnek gibi bir işlev oluşturun ve yeniden kullanmaya devam edin aşağıdaki KURU kod deseni.
Ayrıca, nesnenin var olup olmadığından emin olmadığınız gerçek bir uygulamadaki bir nesnenin özelliğini denetlemek için, nesnenin önce var olup olmadığını kontrol edin.
Bir nesnedeki bir özelliği kontrol ederseniz ve nesne yoksa, bir hata atar ve tüm uygulamanın çalışmasını durdurur.
isUndefined(x.css);
VM808:2 Uncaught ReferenceError: x is not defined(…)
Çok basit bir if ifadesinin içine aşağıdaki gibi sarılabilirsiniz:
if(typeof x !== 'undefined') {
//do something
}
Bu da eşittir Açısal 1.x ...
function isDefined(value) {return typeof value !== 'undefined';}
Ayrıca alt çizgi gibi diğer javascript çerçeveleri benzer tanımlayıcı kontrole sahiptir, ancak typeof
zaten herhangi bir çerçeve kullanmıyorsanız kullanmanızı öneririz .
Ayrıca bu bölümü typeof, undefined ve void (0) hakkında yararlı bilgilere sahip olan MDN'den de ekliyorum.
Katı eşitlik ve tanımsız
Bir değişkenin değerine sahip olup olmadığını belirlemek için undefined ve katı eşitlik ve eşitsizlik işleçlerini kullanabilirsiniz. Aşağıdaki kodda, x değişkeni tanımlanmamıştır ve if ifadesi true olarak değerlendirilir.
var x;
if (x === undefined) {
// these statements execute
}
else {
// these statements do not execute
}
Not: Burada standart eşitlik operatörü yerine katı eşitlik operatörü kullanılmalıdır, çünkü x == undefined ayrıca katı eşitlik olmasa da x'in boş olup olmadığını kontrol eder. null, tanımsız ile eşdeğer değil. Ayrıntılar için karşılaştırma operatörlerine bakın.
Operatör ve tanımsız tip
Alternatif olarak, typeof kullanılabilir:
var x;
if (typeof x === 'undefined') {
// these statements execute
}
Typeof kullanmanın bir nedeni, değişken bildirilmemişse bir hata atmamasıdır.
// x has not been declared before
if (typeof x === 'undefined') { // evaluates to true without errors
// these statements execute
}
if (x === undefined) { // throws a ReferenceError
}
Ancak bu tür tekniklerden kaçınılmalıdır. JavaScript statik olarak kapsamlandırılmış bir dildir, bu nedenle bir değişkenin bildirilip bildirilmediğini bilmek, onu çevreleyen bir bağlamda bildirilip bildirilmediğini okuyarak okunabilir. Tek istisna global kapsamdır, ancak global kapsam global nesneye bağlıdır, bu nedenle global bağlamda bir değişkenin varlığını kontrol etmek, global nesne üzerinde bir özelliğin varlığını kontrol ederek (in operatörünü, Örneğin).
Geçersiz operatör ve tanımsız
Geçersiz operatör üçüncü bir alternatiftir.
var x;
if (x === void 0) {
// these statements execute
}
// y has not been declared before
if (y === void 0) {
// throws a ReferenceError (in contrast to `typeof`)
}
daha> burada
Büyük olasılıkla istiyorsun if (window.x)
. Bu kontrol, x bildirilmemiş olsa bile güvenlidir ( var x;
) - tarayıcı bir hata atmaz.
if (window.history) {
history.call_some_function();
}
window , tüm global değişkenleri üyesi olarak tutan bir nesnedir ve var olmayan bir üyeye erişmeye çalışmak yasaldır. Eğer x sonra beyan edilmiş veya ayarlanmamış window.x
döndürür tanımsız . undefined , if () tarafından değerlendirildiğinde false değerine yol açar .
typeof history != 'undefined'
aslında her iki sistemde de çalışır.
Bunu okurken, bunu görmediğime şaşırdım. Bunun için işe yarayacak birden fazla algoritma buldum.
Bir nesnenin değeri hiçbir zaman tanımlanmadıysa, veya true
olarak tanımlanırsa bu nesnenin geri dönmesini engeller . Değer olarak ayarlanmış değerler için true değerinin döndürülmesini istiyorsanız bu yararlıdırnull
undefined
undefined
if(obj.prop === void 0) console.log("The value has never been defined");
Bunun true
değeriyle tanımlanan undefined
veya hiç tanımlanmayan değerler için sonuçlanmasını istiyorsanız,=== undefined
if(obj.prop === undefined) console.log("The value is defined as undefined, or never defined");
Genellikle, insanlar bir değer ya falsy olup, olmadığını anlamaya bir algoritma için beni istedi undefined
ya null
. Aşağıdaki işler.
if(obj.prop == false || obj.prop === null || obj.prop === undefined) {
console.log("The value is falsy, null, or undefined");
}
if (!obj.prop)
var obj = {foo: undefined}; obj.foo === void 0
-> true
. Bu nasıl "asla tanımlanmadı undefined
"? Bu yanlış.
void 0
Kıvam için, ile karşılaştırın .
if (foo !== void 0)
Bu kadar ayrıntılı değil if (typeof foo !== 'undefined')
foo
bildirilmezse bir ReferenceError hatası verir.
Çözüm yanlış. JavaScript'te,
null == undefined
true döndürür, çünkü ikisi de bir boole'ye "dökülür" ve yanlıştır. Doğru yol kontrol etmektir
if (something === undefined)
kimlik operatörü olan ...
===
ilkel nesnelerin dizeleri içerdiği tip eşitlik + (ilkel eşitlik | nesne kimliği). Bence çoğu kişi kimlik operatörü olarak düşünürse 'abab'.slice(0,2) === 'abab'.slice(2)
sezgisel değildir ===
.
Aşağıdaki kodu kullanarak, yolla tanımsız bir dizi alabilirsiniz.
function getAllUndefined(object) {
function convertPath(arr, key) {
var path = "";
for (var i = 1; i < arr.length; i++) {
path += arr[i] + "->";
}
path += key;
return path;
}
var stack = [];
var saveUndefined= [];
function getUndefiend(obj, key) {
var t = typeof obj;
switch (t) {
case "object":
if (t === null) {
return false;
}
break;
case "string":
case "number":
case "boolean":
case "null":
return false;
default:
return true;
}
stack.push(key);
for (k in obj) {
if (obj.hasOwnProperty(k)) {
v = getUndefiend(obj[k], k);
if (v) {
saveUndefined.push(convertPath(stack, k));
}
}
}
stack.pop();
}
getUndefiend({
"": object
}, "");
return saveUndefined;
}
jsFiddle bağlantısı
getUndefiend
olması gerekir getUndefined
.
İşte benim durumum:
Bir REST çağrısının sonucunu kullanıyorum. Sonuç JSON'dan bir JavaScript nesnesine ayrıştırılmalıdır.
Savunmam gereken bir hata var. Geri kalan çağrının bağımsız değişkenleri, kullanıcının yanlışları belirlediği ölçüde yanlışsa, geri kalan çağrı temelde boş olur.
Buna karşı savunmama yardım etmek için bu yazıyı kullanırken bunu denedim.
if( typeof restResult.data[0] === "undefined" ) { throw "Some error"; }
Benim durumum için, eğer restResult.data [0] === "nesne", o zaman güvenli bir şekilde diğer üyelerin teftiş başlayabilirsiniz. Tanımsızsa hatayı yukarıdaki gibi atın.
Söylediğim, durumum için, bu yazıda yukarıdaki tüm önerilerin işe yaramadığı. Haklı olduğumu ve herkesin yanlış olduğunu söylemiyorum. Ben bir JavaScript ustası değilim, ama umarım bu birine yardımcı olur.
typeof
koruma aslında doğrudan bir karşılaştırma başedemeyeceğibir şeye karşı korunmak etmez. Eğer restResult
tanımsız ya bildirilmeyen edilir, yine de atacağım.
if(!restResult.data.length) { throw "Some error"; }
Tanımlı bir özelliği, tanımlanmışsa yeni bir değişkene atamanın veya tanımlanmamışsa varsayılan değer olarak yedek olarak atamanın güzel ve zarif bir yolu vardır.
var a = obj.prop || defaultValue;
Ek bir yapılandırma özelliği alan bir işleviniz varsa uygundur:
var yourFunction = function(config){
this.config = config || {};
this.yourConfigValue = config.yourConfigValue || 1;
console.log(this.yourConfigValue);
}
Şimdi yürütülüyor
yourFunction({yourConfigValue:2});
//=> 2
yourFunction();
//=> 1
yourFunction({otherProperty:5});
//=> 1
Bütün cevaplar eksik. 'Undefined olarak tanımlanmış' bir özellik olduğunu bilmenin doğru yolu budur:
var hasUndefinedProperty = function hasUndefinedProperty(obj, prop){
return ((prop in obj) && (typeof obj[prop] == 'undefined')) ;
} ;
Misal:
var a = { b : 1, e : null } ;
a.c = a.d ;
hasUndefinedProperty(a, 'b') ; // false : b is defined as 1
hasUndefinedProperty(a, 'c') ; // true : c is defined as undefined
hasUndefinedProperty(a, 'd') ; // false : d is undefined
hasUndefinedProperty(a, 'e') ; // false : e is defined as null
// And now...
delete a.c ;
hasUndefinedProperty(a, 'c') ; // false : c is undefined
Bunun doğru cevap olması çok kötü yanlış cevaplara gömüldü> _ <
Yani, geçen herkes için, size ücretsiz olarak tanımsızları vereceğim !!
var undefined ; undefined ; // undefined
({}).a ; // undefined
[].a ; // undefined
''.a ; // undefined
(function(){}()) ; // undefined
void(0) ; // undefined
eval() ; // undefined
1..a ; // undefined
/a/.a ; // undefined
(true).a ; // undefined
Yorumları gözden geçirmek, her ikisini de kontrol etmek isteyenler için tanımsız mı yoksa değeri boş mu:
//Just in JavaScript
var s; // Undefined
if (typeof s == "undefined" || s === null){
alert('either it is undefined or value is null')
}
JQuery Library kullanıyorsanız jQuery.isEmptyObject()
her iki durumda da yeterli olacaktır,
var s; // Undefined
jQuery.isEmptyObject(s); // Will return true;
s = null; // Defined as null
jQuery.isEmptyObject(s); // Will return true;
//Usage
if (jQuery.isEmptyObject(s)) {
alert('Either variable:s is undefined or its value is null');
} else {
alert('variable:s has value ' + s);
}
s = 'something'; // Defined with some value
jQuery.isEmptyObject(s); // Will return false;
Açısal kullanıyorsanız:
angular.isUndefined(obj)
angular.isUndefined(obj.prop)
Underscore.js:
_.isUndefined(obj)
_.isUndefined(obj.prop)
1
Değişkene nasıl eklerim x
? Alt Çizgi veya jQuery'ye ihtiyacım var mı? (insanların typeof
çek gibi en temel işlemler için bile kütüphaneleri kullanması şaşırtıcı )
if (this.variable)
Tanımlanıp tanımlanmadığını test etmek için kullanıyorum . Basit if (variable)
, yukarıda tavsiye , benim için başarısız. Söz konusu değişkenin obj.someField
sözlükte tanımlanıp tanımlanmadığını kontrol etmek için yalnızca değişken bir nesnenin alanı olduğunda işe yarar. Ama anladığım gibi herhangi bir değişken geçerli pencerede bir alan olduğundan this
veya window
sözlük nesnesi olarak kullanabiliriz . Bu yüzden işte bir test
if (this.abc) alert("defined"); else alert("undefined");
abc = "abc";
if (this.abc) alert("defined"); else alert("undefined");
Önce değişkenin abc
tanımsız olduğunu algılar ve başlatmadan sonra tanımlanır.
Burada garip cevaplar bekleyenler için üç yol sağlıyorum:
function isUndefined1(val) {
try {
val.a;
} catch (e) {
return /undefined/.test(e.message);
}
return false;
}
function isUndefined2(val) {
return !val && val+'' === 'undefined';
}
function isUndefined3(val) {
const defaultVal={};
return ((input=defaultVal)=>input===defaultVal)(val);
}
function test(func){
console.group(`test start :`+func.name);
console.log(func(undefined));
console.log(func(null));
console.log(func(1));
console.log(func("1"));
console.log(func(0));
console.log(func({}));
console.log(func(function () { }));
console.groupEnd();
}
test(isUndefined1);
test(isUndefined2);
test(isUndefined3);
Giriş değerinin bir özelliğini almaya çalışın, varsa hata mesajını kontrol edin. Giriş değeri tanımsızsa, hata iletisi Yakalanmadı olur TypeError: undefined'in 'b' özelliği okunamıyor
Giriş değerini karşılaştırmak "undefined"
ve dizenin negatif değerinden emin olmak için dizeye dönüştürün .
Js'de, isteğe bağlı parametre giriş değeri tam olarak olduğunda çalışır undefined
.
function isUnset(inp) {
return (typeof inp === 'undefined')
}
Değişken ayarlanmışsa false değerini ve tanımsızsa true değerini döndürür.
Sonra kullan:
if (isUnset(var)) {
// initialize variable here
}
typeof
test gerektirir. 4 kişinin bunu düzeltmesi şaşırtıcı. -1.
undefined
Değişkeni korumak için kullandığım bir şeyi size göstermek istiyorum :
Object.defineProperty(window, 'undefined', {});
Bu, herhangi birinin window.undefined
değeri değiştirmesini yasaklar, bu nedenle bu değişkene dayalı olarak kodu yok eder. Kullanılırsa "use strict"
, değerini değiştirmeye çalışan herhangi bir şey yanlışlıkla sona erer, aksi takdirde sessizce göz ardı edilir.
Proxy'yi de kullanabilirsiniz, iç içe aramalarla çalışır, ancak bir ek kontrol gerektirir:
function resolveUnknownProps(obj, resolveKey) {
const handler = {
get(target, key) {
if (
target[key] !== null &&
typeof target[key] === 'object'
) {
return resolveUnknownProps(target[key], resolveKey);
} else if (!target[key]) {
return resolveUnknownProps({ [resolveKey]: true }, resolveKey);
}
return target[key];
},
};
return new Proxy(obj, handler);
}
const user = {}
console.log(resolveUnknownProps(user, 'isUndefined').personalInfo.name.something.else); // { isUndefined: true }
böylece onu kullanacaksınız:
const { isUndefined } = resolveUnknownProps(user, 'isUndefined').personalInfo.name.something.else;
if (!isUndefined) {
// do someting
}
Lodash.js dosyasından.
var undefined;
function isUndefined(value) {
return value === undefined;
}
undefined
Varsayılan değerle başlatılan adlı bir LOCAL değişkeni yaratır - real undefined
, daha sonra value
değişkenle karşılaştırır undefined
.
9/9/2019 Güncellemesi
Lodash'ın uygulanmasını güncellediğini gördüm. Bkz sorunumu ve kod .
Kurşun geçirmez olmak için şunları kullanın:
function isUndefined(value) {
return value === void 0;
}