Bir JavaScript nesnesinden bir özelliği nasıl kaldırabilirim?
Diyelim ki aşağıdaki gibi bir nesne oluşturdum:
var myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
Aşağıdaki gibi yeni myObject
ile sonuçlanmak için regex
özelliğini kaldırmanın en iyi yolu nedir?
var myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
5780
3
Bunun gibi:
Demo
Bu konuda daha fazla bilgi edinmek isteyenler için Stack Overflow kullanıcısı kangax, Understanding delete adlı blogunda
delete
deyimi hakkında inanılmaz derecede derinlemesine bir blog yazısı yazmıştır. Şiddetle tavsiye edilir.Bu Firefox ve Internet Explorer'da çalışıyor ve sanırım diğerlerinde de çalışıyor.
Güncelleme 2018-07-21: Uzun zamandır bu cevaptan utanıyordum, bu yüzden biraz rötuş yapmanın zamanı geldi diye düşünüyorum. Bu cevabın gereksiz yere uzun ve karmaşık kısımlarının okunmasını hızlandırmaya yardımcı olmak için sadece küçük bir yorum, açıklama ve biçimlendirme.
#KISA VERSIYON # Sorunun gerçek cevabı Diğerlerinin de söylediği gibi, `delete` kullanabilirsiniz.
Dizi eşdeğeri
Bir diziden
silme
yapmayın. Bunun yerineArray.prototype.splice
kullanın.# UZUN VERSIYON JavaScript bir OOP dilidir, bu nedenle *diziler* de dahil olmak üzere her şey bir nesnedir. Bu nedenle, belirli bir uyarıya dikkat çekmenin gerekli olduğunu hissediyorum. Dizilerde, eski nesnelerden farklı olarak, `delete` kullanmak `null` şeklinde çöp bırakır ve dizide bir "hole" oluşturur.
Gördüğünüz gibi,
delete
her zaman beklenildiği gibi çalışmaz. Değerin üzerine yazılır, ancak bellek yeniden tahsis edilmez. Yani,dizi[4]
değeridizi[3]
değerine taşınmaz. Bu, dizinin başına bir eleman ekleyen ve her şeyi yukarı kaydıranArray.prototype.unshift
ile tezat oluşturur (array[0]
,array[1]
olur, vb.) Dürüst olmak gerekirse,undefined
yerinenull
olarak ayarlanması dışında - ki bu yasal olarak gariptir - bu davranış şaşırtıcı olmamalıdır, çünküdelete
,typeof
gibi, dilde zor kaynatılan ve üzerinde kullanıldığı nesnenin türünü önemsememesi gereken tek değişkenli bir operatördür, oysaArray
, dizilerle çalışmak için özel olarak tasarlanmış yöntemlere sahip birObject
alt sınıfıdır. Bu yüzdendelete
metodunun diziyi yeniden kaydırmak için özel bir duruma sahip olması için iyi bir neden yoktur, çünkü bu sadece gereksiz işlerle işleri yavaşlatacaktır. Geriye dönüp baktığımda, beklentilerimin gerçekçi olmadığını görüyorum. Tabii ki, bu beni şaşırttı. Çünkü bunu "null garbage"'a karşı haçlı seferimi haklı çıkarmak için yazdım:Ve böylece Bay PDP-11'i memnun etmiş oldunuz. Yaşasın! (Ben yine de onu azarlardım...)
Array.prototype.splice vs Array.prototype.slice
Bu iki benzer isimli fonksiyon arasındaki farkı belirtmenin önemli olduğunu düşünüyorum, çünkü her ikisi de çok kullanışlıdır.
Array.prototype.splice(start, n)
.splice()
diziyi değiştirir ve kaldırılan indisleri döndürür. Dizi
startindisinden başlayarak dilimlenir ve
neleman dilimlenir. Eğer n belirtilmemişse,
startdizisinden sonraki tüm dizi dilimlenir (
n = array.length - start`).Array.prototype.slice(start, end)
.slice()
yıkıcı değildir ve
startile
endarasında belirtilen indisleri içeren yeni bir dizi döndürür. Eğer
endbelirtilmemişse, davranış
.splice()ile aynıdır (
end = array.length). Davranış biraz karmaşıktır, çünkü bazı nedenlerden dolayı
end0 yerine 1
den indis alır. Bunu neden yaptığını bilmiyorum, ama böyle. Ayrıca, eğer `end