Undefined neden JavaScript ile yazılamıyor?


59

MDN'nin aşağıdaki belgelereundefined göre :

Modern tarayıcılarda (JavaScript 1.8.5 / Firefox 4+), undefined, ECMAScript 5 spesifikasyonu uyarınca yapılandırılamaz, yazılamaz bir özelliktir. Durum böyle olmasa bile, geçersiz kılmaktan kaçının.

Undefined öğesinin özellik özelliklerinden biri yazılabilir değil.

Ama eğer yaparsam:

var undefined = 'hello';
var test = undefined;
console.log(typeof test);
//string

Bu, değerinin üzerine yazabileceğim anlamına mı geliyor undefined? Birisi bunu yaparsa ne olur? JavaScript bu konuda uyarmalı mı?


5
hangi tarayıcıyı kullandığınızı söyleyebilir misiniz? (Linux'ta Firefox 72.0b10 (64 bit) amaçlandığı gibi çalışır typeof test === "undefined")
jonatjano

3
@DmitryReutov normal şartlar altında typeof undefinedgeri döner "undefined".
Amy

3
@DmitryReutov Elbette "undefined"bir dize. Soru neyin typeof (typeof undefined)değerlendirildiğini sormak değildir . Neyi typeof undefineddeğerlendirdiğini soruyor . Bu döner "undefined", değil"string"
Amy

2
@DmitryReutov typeof ______, türünü içeren bir dize olarak değerlendirilen bir ifadedir ______. Soruyu yanlış anlıyorsunuz.
Amy

3
@Amy biliyorum, ama Edge dönüş "string" ve Chrome "undefined"
Alon Eitan

Yanıtlar:


50

Amy'nin kaldırdığı bir yorum çözümü verir. Adlı bir değişken oluşturuyorsunuz undefinedve snippet'lerinizi global kapsamda yaparsanız çalışmaz:

var undefined = 'hello';
var test = undefined;
console.log(typeof test);

Ancak, tanımsızın artık global değişkene başvurmadığı yerel bir kapsamda yaparsanız etkili bir şekilde çalışır :

(()=>{
  var undefined = 'hello';
  var test = undefined;
  console.log(typeof test);
})()

Bu hatayı önlemek için, şu 'use strict';yönergeyi kullanabilirsiniz :

'use strict';
var undefined = 'hello';
var test = undefined;
console.log(typeof test);

Nerede yürütüleceğini kontrol edemediğiniz bir kod yazıyorsanız (örn. Kütüphane, gömme, vb.), Tanımsız olanın her zaman doğru / kullanılabilir olacağını garanti edebilmeniz için bunu yapan bir IIFE kullanmak iyi bir kalıptır. İşte bir örnek:

(function(undefined){
  // undefined will equal `undefined` because we didn't pass in an argument to the IIFE
  
  console.log(undefined); // always `undefined`, even if undefined !== `undefined`outside of the IIFE scope
})(); // No argument supplied


Tüm testlerim Ubuntu'daki Firefox 72.0b10 (64 bit) kullanılarak yapıldı ve ilk snippet'in sonucu daha eski bir tarayıcıda farklı olabilir.


3
@pmiranda benim değil, çok ilginç buldum
jonatjano

2
Tekrar teşekkürler. Tüm bu şüphe bunun bir kökenine sahiptir: burada yeni bir geliştirici bazı ispanyolca değişkenleri ingilizceye çeviriyordu. Kodumuzda, bu değişkenin let indefinido= dataArray( (a) => (anotherArray.includes(someName)));'tanımsız' ( findhiçbir eleman bulunamadığı sonucu) olup olmadığını kontrol ettiğimiz adlı bir değişkenimiz vardı . Sonra çevirmek indefinidoiçin undefinedbazı farkı görerek, Chrome ve Kenardan test ben testere. Bu yüzden geri kalanların fikrini sormaya geldim, çünkü ben de öğreniyorum.
pmiranda

@pmiranda Bu cevap "neden" kısmına kesin olarak cevap vermiyor. Ama bu iyi bir cevap.
Ismael Miguel

2
Eğer tanımlanmamış gerçek değere ihtiyacınız varsa, kullanınvoid 0
Kullanıcı olmayan kullanıcı Kullanıcı

2
@Jon bazı nedenlerden dolayı Ecmascript Consortium undefined'i ayrılmış bir anahtar kelime değil, global nesnenin bir özelliği
yapmayı seçti

17

Global kapsam dışındaki herhangi bir kapsamda tanımlayıcı (değişken adı) olarak kullanmak mümkün olsa da (tanımsız ayrılmış bir sözcük olmadığından) bunu yapmak, kodunuzun bakımını ve hata ayıklamasını zorlaştıracak çok kötü bir fikirdir.

Kaynak https://developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/Global_Objects/undefined

undefinedolduğu ayrılmamış dolayısıyla ona yeni bir değer atamak mümkündür.

Kullanmadığınız strict modezaman, esasen undefinedyerel kapsamda adlandırılan bir değişken yaratır ve bu değişkene bir stringdeğer atarsınız .

undefinedglobal nesnenin bir özelliğidir . Undefined değerinin başlangıç ​​değeri ilkel değerdirundefined.

use strict küresel kapsamda bu hatanın önlenmesine yardımcı olurken, yerel kapsamda hala üzerine yazılabilir.

Daha güvenli olmak istiyorsanız, her zaman geri dönen void 0yerine kullanmalısınız .undefinedundefined

'use stict'

const test = (() => {
  let undefined = "test"
  console.log(typeof undefined)
  console.log(typeof void 0)
})()


1
burada anahtar kelime listesi Daha fazla bilgi için
jonatjano

1
Böyle bir IIFE'de undefinedbir argüman olarak okuyarak da referans alınabileceğini belirtmek gerekir . IIFE hiçbir zaman burada herhangi bir argümandan geçmediği için burada olacaklar undefined. Örn.((undefined) => console.log(typeof undefined))()
SeinopSys
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.