Bir ├Âzelli─či bir JavaScript nesnesinden nas─▒l kald─▒r─▒r─▒m?


Al─▒nan cevaba git


A┼ča─č─▒daki gibi bir nesne yaratt─▒─č─▒m─▒ s├Âyleyin:

 var myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI",
    "regex": "^http://.*"
};
 

M├╝lkiyetten regex vazge├žmenin en iyi yolu myObject , a┼ča─č─▒daki gibi yeni sonu├ž ├ž─▒kmas─▒ m─▒?

 var myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI"
};
 

5749









Cevap say─▒s─▒n─▒ say: 30






Bunun gibi:

 delete myObject.regex;
// or,
delete myObject['regex'];
// or,
var prop = "regex";
delete myObject[prop];
 

g├Âsteri

 var myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI",
    "regex": "^http://.*"
};
delete myObject.regex;

console.log(myObject); 

Daha bu konuda okuma ilgilenen herkes i├žin, y─▒─č─▒n ta┼čmas─▒ kullan─▒c─▒ kangax hakk─▒nda inan─▒lmaz derinlemesine blog yaz─▒s─▒ yazm─▒┼č delete , kendi blogunda a├ž─▒klamada silme anlama . ┼×iddetle tavsiye edilir.


7845







Operat├Âr delete beklenmedik ┼čekilde yava┼č!

Kriterlere bak .

Sil, nesnenin ├Âzelliklerini art─▒k b─▒rakmadan kald─▒rman─▒n tek ger├žek yoludur, ancak ÔÇťalternatifÔÇŁ ayar─▒na k─▒yasla ~ 100 kat daha yava┼č ├žal─▒┼č─▒r object[key] = undefined .

Bu alternatif, bu sorunun do─čru cevab─▒ de─čil! Ancak, dikkatli kullan─▒rsan─▒z, baz─▒ algoritmalar─▒ ├Ânemli ├Âl├ž├╝de h─▒zland─▒rabilirsiniz. delete D├Âng├╝lerde kullan─▒yorsan─▒z ve performansla ilgili sorunlar─▒n─▒z varsa ayr─▒nt─▒l─▒ a├ž─▒klamay─▒ okuyun.

Ki┼či delete ne zaman kullanmal─▒ ve ne zaman de─čeri olarak ayarlanmal─▒d─▒r undefined ?

Bir nesne, bir anahtar-de─čer ├žiftleri k├╝mesi olarak g├Âr├╝lebilir. 'De─čer' dedi─čim ┼čey, o 'tu┼ča' ba─čl─▒ olan ilkel veya ba┼čka bir nesneye referanst─▒r.

Kullan─▒m delete , sen kontrol yok hangi koduna sonu├ž nesnesini ge├žiyoruz zaman (ya da ekip veya kendiniz hakk─▒nda emin de─čilken).

Bu HashMap anahtar─▒ siler .

  var obj = {
     field: 1     
 };
 delete obj.field;
 

undefined Performans─▒ ├Ânemserken , ayar─▒n─▒ kullan─▒n . Kodunuzu ciddi bir ┼čekilde art─▒rabilir.

HashMap yerine anahtar kal─▒nt─▒lar , sadece de─čer ile de─či┼čtirilir undefined . Anlay─▒n, bu for..in d├Âng├╝ hala bu anahtar ├╝zerinde yinelenecek.

  var obj = {
     field: 1     
 };
 obj.field = undefined;
 

Bu y├Ântemi kullanarak, m├╝lk├╝n varl─▒─č─▒n─▒ belirlemenin t├╝m yollar─▒ beklendi─či gibi ├žal─▒┼čmayacakt─▒r.

Ancak bu kod:

object.field === undefined

Her iki y├Ântem i├žin de ayn─▒ ┼čekilde davranacakt─▒r.

Testler

├ľzetlemek gerekirse, farkl─▒l─▒klar─▒n t├╝m├╝ m├╝lk varl─▒─č─▒n─▒ belirleme yollar─▒ ve for..in d├Âng├╝ hakk─▒ndad─▒r.

  console.log('* -> "Takes prototype inheritance into consideration, that means it lookups all over prototype chain too."');

 console.log(obj.field === undefined, 'obj.field === undefined', 'You get "undefined" value when querying for "field" in object-hashmap. *');

 console.log(obj["field"] === undefined, 'obj["field"] === undefined', 'Just another way to query (equivalent). *');

 console.log(typeof obj.field === "undefined", 'typeof obj.field === "undefined"', 'Get the value attached to "field" key, and check it\'s type is "undefined". *');

 console.log("field" in obj, '"field" in obj', 'This statement returns true if "field" key exists in the hashmap. False otherwise. *');

 console.log(obj.hasOwnProperty("field"), 'obj.hasOwnProperty("field")', 'This statement returns true if \'field\' key exists in the hashmap. The ONLY way NOT to lookup for property in the prototype chain!');
 //Object.keys().indexOf() is an overkill that runs much slower :)

 var counter = 0,
     key;
 for (key in obj) {
     counter++;
 }
 console.assert(counter === 0, 'counter === 0', '"field" is not iterated using "for .. in" loop. *');
 

Bellek Ka├žaklar─▒na Dikkat!

Kullan─▒m obj[prop] = undefined yapmaktan daha h─▒zl─▒ olsa da delete obj[prop] , bir di─čer ├Ânemli husus obj[prop] = undefined her zaman uygun olmayabilir. delete obj[prop] kald─▒r─▒r prop gelen obj ve oysa bellekten onu siler obj[prop] = undefined basit├že de─čerini ayarlar prop i├žin undefined hangi yapraklar prop hala bellekte. Bu nedenle, bir├žok anahtar─▒n olu┼čturuldu─ču ve silindi─či durumlarda, kullan─▒m─▒ obj[prop] = undefined pahal─▒ bellek uzla┼čmas─▒n─▒ zorlayabilir (sayfan─▒n donmas─▒na neden olabilir) ve potansiyel olarak yetersiz bellek hatas─▒ olabilir. A┼ča─č─▒daki kodu inceleyin.

 "use strict";
var theNodeList=[], i, current, numberOfNodes=65536, body=document.body, nodeRecords=[];
for (i = 0; i !== numberOfNodes; i++) {
    nodeRecords[i] = [];
    current = theNodeList[i] = document.createElement("div");
    current.textContent = i;
    document.body.appendChild( current );
}
var lastTime = -1;
requestAnimationFrame(function recordUpdates(){
    var currentTime = Math.round( performance.now()*1000 )
    for (i = 0; i !== numberOfNodes; i++) {
        if (lastTime !== -1) {
            // the previously collected data is no longer in use
            /*************************************************/
            /****/ nodeRecords[i][lastTime] = undefined; /****/
            /*************************************************/
        }
        nodeRecords[i][currentTime] = theNodeList[i].outerHTML;
    }
    lastTime = currentTime;
    requestAnimationFrame( recordUpdates );
});
 

Yukar─▒daki kodda, basit├že yapmak nodeRecords[i][lastTime] = undefined; , her animasyon karesi nedeniyle b├╝y├╝k bir haf─▒za s─▒z─▒nt─▒s─▒na neden olacakt─▒r. Her bir ├žer├ževe, t├╝m 65536 DOM elemanlar─▒ bir ba┼čka 65536 ayr─▒ yuva alacakt─▒r, ancak ├Ânceki 65536 yuvalar─▒ sadece tan─▒ms─▒z olarak ayarlanacak ve bu da onlar─▒ bellekte as─▒l─▒ b─▒rakacakt─▒r. Devam edin, yukar─▒daki kodu konsolda ├žal─▒┼čt─▒rmay─▒ deneyin ve kendiniz g├Âr├╝n. Bellek yetersiz bir hatay─▒ zorlad─▒ktan sonra, delete operat├Âr├╝ kullanan kodun a┼ča─č─▒daki s├╝r├╝m├╝ d─▒┼č─▒nda tekrar ├žal─▒┼čt─▒rmay─▒ deneyin.

 "use strict";
var theNodeList=[], i, current, numberOfNodes=65536, body=document.body, nodeRecords=[];
for (i = 0; i !== numberOfNodes; i++) {
    nodeRecords[i] = [];
    current = theNodeList[i] = document.createElement("div");
    current.textContent = i;
    document.body.appendChild( current );
}
var lastTime = -1;
requestAnimationFrame(function recordUpdates(){
    var currentTime = Math.round( performance.now()*1000 )
    for (i = 0; i !== numberOfNodes; i++) {
        if (lastTime !== -1) {
            // the previously collected data is no longer in use
            /********************************************/
            /****/ delete nodeRecords[i][lastTime]; /****/
            /********************************************/
        }
        nodeRecords[i][currentTime] = theNodeList[i].outerHTML;
    }
    lastTime = currentTime;
    requestAnimationFrame( recordUpdates );
});
 

Yukar─▒daki kod par├žas─▒nda g├Âr├╝ld├╝─č├╝ gibi, delete operat├Âr i├žin baz─▒ nadir uygun kullan─▒m durumlar─▒ vard─▒r . Ancak, bu sorun hakk─▒nda ├žok fazla endi┼čelenmeyin. Bu sadece onlara s├╝rekli yeni anahtarlar ekleyen uzun ├Âm├╝rl├╝ nesnelerde sorun yaratacakt─▒r. Ba┼čka bir durumda (ger├žek d├╝nya programlamas─▒nda hemen hemen her durumda olan), kullan─▒m─▒ en uygun olan─▒d─▒r obj[prop] = undefined . Bu b├Âl├╝m├╝n as─▒l amac─▒, bu konuyu dikkatinize sadece getirmektir, b├Âylece nadiren bu durumun kodunuzda bir sorun haline gelmesi ihtimalini ortadan kald─▒rabilir, o zaman sorunu daha kolay anlayabilirsiniz ve b├Âylece kodunuzu bulmak i├žin kodlar─▒ ay─▒rarak saat harcamak zorunda kalmazs─▒n─▒z. ve bu sorunu anlay─▒n.

Her Zaman Ayarlama undefined

Javascript'in dikkate al─▒nmas─▒ gereken bir y├Ân├╝, polimorfizmdir. Polimorfizm, a┼ča─č─▒da g├Âr├╝ld├╝─č├╝ gibi ayn─▒ de─či┼čken / nesnede bir yuvaya farkl─▒ t├╝rlerin atanmas─▒d─▒r.

 var foo = "str";
foo = 100;          // variable foo is now labeled polymorphic by the browser
var bar = ["Some", "example"];
bar[2] = "text";    // bar is a monomorphic array here because all its entries have the
                    // same type: string primitive
bar[1] = undefined; // bar is now a polymorphic array
 

Bununla birlikte, polimorfik dizilerde d├╝zeltilemeyen iki ana problem vard─▒r:

  1. Yava┼č ve haf─▒zas─▒zlar. Belirli bir dizine eri┼čirken, dizinin genel t├╝r├╝n├╝ almak yerine, taray─▒c─▒n─▒n t├╝r├╝ her bir dizinin kendi t├╝r├╝ndeki ek meta verilerini depolad─▒─č─▒ dizin ba┼č─▒na esas─▒na g├Âre almas─▒ gerekir.
  2. Bir kez polimorfik, her zaman polimorfik. Bir dizi polimorfik yap─▒ld─▒─č─▒nda, polimorfizm Webkit taray─▒c─▒lar─▒nda geri al─▒namaz. Dolay─▒s─▒yla, bir polimorfik diziyi polimorfik olmayan bir hale getirseniz bile, taray─▒c─▒ taraf─▒ndan polimorfik bir dizi olarak saklanacakt─▒r.

Polimorfizmi uyu┼čturucu ba─č─▒ml─▒l─▒─č─▒na benzetebiliriz. ─░lk bak─▒┼čta, ├žok kazan├žl─▒ g├Âr├╝n├╝yor: g├╝zel olduk├ža kabar─▒k kod. Daha sonra, kodlay─▒c─▒ dizilerini polimorfizm ilac─▒na sokar. An─▒nda, polimorfik dizi daha az verimli hale gelir ve uyu┼čturuldu─čundan beri eskisi kadar verimli olamaz. B├Âyle bir durumu ger├žek hayatla ili┼čkilendirmek i├žin, kokain kullanan biri basit bir kap─▒ kolunu bile kullanamayabilir, PI'nin rakamlar─▒n─▒ daha az hesaplayabilir. Ayn─▒ ┼čekilde, polimorfizm ilac─▒ ├╝zerindeki bir dizi, bir monomorfik dizi kadar verimli olamaz.

Ancak, bir ila├ž gezisi analojisinin delete operasyonla ilgisi nedir? Cevap, yukar─▒daki kod par├žac─▒─č─▒ndaki son kod sat─▒r─▒n─▒ devral─▒r. B├Âylece, bu kez bir b├╝k├╝lme ile yeniden incelenmesine izin verin.

 var bar = ["Some", "example"];
bar[2] = "text";    // bar is not a polymorphic array here because all its entries have the
                    // same type: string primitive
bar[1] = "";        // bar is still a monomorphic array
bar[1] = undefined; // bar is now a polymorphic array
 

G├Âzlemek. bar[1] = "" Oysa polimorfizmi bar[1] = undefined zorlamaz. Bu nedenle, ki┼či daima m├╝mk├╝n oldu─čunda polimorfizme neden olmayacak ┼čekilde kendi nesnelerinde kar┼č─▒l─▒k gelen t├╝r├╝ kullanmal─▒d─▒r. Bu ki┼čilerden biri a┼ča─č─▒daki listeyi genel bir referans olarak kullanabilir ve bunlar─▒ devam ettirebilir. Ancak, l├╝tfen a┼ča─č─▒daki fikirleri a├ž─▒k├ža kullanmay─▒n. Bunun yerine, kodunuz i├žin en iyi olan─▒ kullan─▒n.

  • Boole ilkeline yaz─▒lan bir dizi / de─či┼čken kullan─▒rken , bo┼č de─čeri kullan─▒n ya false da kullan─▒n undefined . Gereksiz polimorfizmden ka├ž─▒nmak iyidir, ancak t├╝m kodunuzu a├ž─▒k├ža yasaklamak i├žin yeniden yazmak muhtemelen performansta bir d├╝┼č├╝┼če yol a├žacakt─▒r. Yayg─▒n yarg─▒ kullan─▒n!
  • ─░lkel say─▒ya yaz─▒lan bir dizi / de─či┼čken kullan─▒rken 0 , bo┼č de─čer olarak kullan─▒n . H─▒zl─▒ tamsay─▒lar (2147483647 dahil -2147483648 kadar) ve yava┼č kayan nokta ├žiftler (dahil oldu─ču ba┼čka bir ┼čey: i├žten, say─▒lar─▒n iki t├╝r Not oldu─čunu NaN ve Infinity ). Bir tamsay─▒ ikiye ayr─▒ld─▒─č─▒nda, bir tamsay─▒ya geri y├╝kseltilemez.
  • ─░lkel dizgesine yaz─▒lan bir dizi / de─či┼čken kullan─▒rken "" , bo┼č de─čer olarak kullan─▒n .
  • Bir Sembol kullan─▒rken bekleyin, neden bir Sembol kullan─▒yorsunuz?!?! Semboller performans i├žin k├Ât├╝ juju'lard─▒r. Sembolleri kullanmak i├žin programlanan her ┼čey, Sembolleri kullanmadan daha h─▒zl─▒ bir kod elde etmek i├žin Sembolleri kullanmamak ├╝zere yeniden programlanabilir. Semboller ger├žekten sadece s├╝per verimsiz meta-┼čeker.
  • Ba┼čka bir ┼čey kullan─▒rken, kullan─▒n null .

Ancak, dikkatli olun! Bunu, ├Ânceden varolan t├╝m kodunuzla aniden ba┼člatmaya ├žal─▒┼čmay─▒n, ├ž├╝nk├╝ bu ├Ânceden varolan kodu bozabilir ve / veya garip hatalar ortaya ├ž─▒karabilir. Aksine, b├Âyle verimli bir uygulaman─▒n ba┼čtan itibaren uygulanmas─▒ gerekir ve ├Ânceden var olan kodu d├Ân├╝┼čt├╝r├╝rken, eski kodu bu yeni uygulamaya y├╝kseltmeye ├žal─▒┼č─▒rken oldu─ču gibi ilgili t├╝m sat─▒rlar─▒ ikiye, ├╝├že, d├Ârtl├╝ olarak kontrol etmeniz ├Ânerilir. ├Âd├╝llendirici oldu─ču gibi riskli.


865


2014-02-12





 var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
    
delete myObject.regex;

console.log ( myObject.regex); // logs: undefined 

Bu Firefox ve Internet ExplorerÔÇÖda ├žal─▒┼č─▒yor ve bence di─čerlerinde de ├žal─▒┼č─▒yor.


228







2018-07-21 G├╝ncellemesi: Uzun zamand─▒r bu cevaptan utanm─▒┼čt─▒m, bu y├╝zden biraz dokunmam─▒n zaman─▒ geldi─čini d├╝┼č├╝n├╝yorum. Bu cevab─▒n gereksiz yere uzun ve k─▒vr─▒ml─▒ k─▒s─▒mlar─▒n─▒n okunmas─▒n─▒ h─▒zland─▒rmaya yard─▒mc─▒ olmak i├žin sadece biraz yorum, a├ž─▒klama ve bi├žimlendirme.


KISA S├ťR├ťM

Sorunun as─▒l cevab─▒

Di─čerlerinin dedi─či gibi kullanabilirsiniz delete .

 obj // {"foo": "bar"}
delete obj["foo"]
obj // {}
obj["foo"] // undefined
 

Dizi e┼čde─čeri

Diziden delete gelme. Yerine Array.prototype.splice kullan─▒n.

 arr // [1,2,3,4,5]
arr.splice(3,1); // 4
arr // [1,2,3,5]
 

UZUN S├ťR├ťM

JavaScript bir OOP Dilidir, yani diziler dahil her ┼čey bir nesnedir . Bu nedenle, belirli bir uyar─▒ya i┼čaret etmenin gerekli oldu─čunu hissediyorum.

Dizilerde, d├╝z eski nesnelerden farkl─▒ olarak, delete ├ž├Âp bi├žiminde ├ž├Âp yapraklar─▒ kullanarak null , dizide bir "delik" olu┼čturur.

 var array = [1, 2, 3, 4];
delete array[2];
/* Expected result --> [1, 2, 4]
 * Actual result   --> [1, 2, null, 4]
 */
 

G├Ârd├╝─č├╝n├╝z gibi, delete her zaman bekledi─činiz gibi ├žal─▒┼čmaz. De─čerin ├╝zerine yaz─▒l─▒r, ancak bellek yeniden tahsis edilmez. Yani, yer array[4] de─či┼čtirmedi array[3] . Bunun aksine Array.prototype.unshift , dizinin ba┼č─▒nda bir ├Â─če ekler ve her ┼čeyi yukar─▒ kayd─▒r─▒r ( array[0] olur array[1] , vb.)

Do─črusu, bir kenara ayar─▒n─▒ dan null ziyade undefined me┼čru garip --which - Bu davran─▒┼č olmamal─▒ , ├ž├╝nk├╝ ┼ča┼č─▒rt─▒c─▒ delete bir i┼člem i┼čleci gibidir typeof ha┼članm─▒┼č dile olup dikkat etmem gerekiyordu de─čildir, tip aras─▒nda ├╝zerinde kullan─▒ld─▒─č─▒ nesne, ├Âzellikle dizilerle ├žal─▒┼čmak i├žin tasarlanm─▒┼č y├Ântemlerin Array bir alt s─▒n─▒f─▒d─▒r . Bu y├╝zden , diziyi yeniden de─či┼čtirmek i├žin ├Âzel bir kasan─▒n pi┼čirilmesinin iyi bir nedeni yoktur , ├ž├╝nk├╝ bu gereksiz i┼čleri yava┼člat─▒r. Ge├žmi┼če bak─▒ld─▒─č─▒nda, beklentilerim ger├žek├ži de─čildi. Object delete

Tabii ki, bu vermedi bana s├╝rpriz. ├ç├╝nk├╝ bunu "bo┼č ├ž├Âp" a kar┼č─▒ ha├žl─▒ seferimi hakl─▒ ├ž─▒karmak i├žin yazd─▒m:

Tehlikeleri ve do─čal olan null ve bo┼ča harcanan sorunlar─▒ g├Ârmezden gelmek, dizinin kesin olmas─▒ gerekirse bu sorunlu olabilir.

Bu, null s'den kurtulman─▒n korkun├ž bir gerek├žesidir - null ancak yanl─▒┼č kullan─▒lmas─▒ halinde tehlikelidir ve "hassasiyet" ile ilgisi yoktur. delete Bir diziden ├ž─▒kmaman─▒n as─▒l nedeni , etrafta ├ž├Âp dolu ve da─č─▒n─▒k veri yap─▒lar─▒n─▒ b─▒rakman─▒n ├Âzensiz ve b├Âcek e─čilimli olmas─▒d─▒r.

Ard─▒ndan uzun solukla┼čan bir senaryo var, bu nedenle isterseniz ├ç├Âz├╝m b├Âl├╝m├╝ne ge├žebilirsiniz . Bu b├Âl├╝mden ayr─▒lmam─▒n tek nedeni, baz─▒ insanlar─▒n muhtemelen komik oldu─čunu d├╝┼č├╝nd├╝─č├╝m├╝ ve "komik" bir cevap g├Ânderen ve daha sonra t├╝m "komik" olanlar─▒ silen "o adam" olmak istemiyorum. .

... aptalca biliyorum.

Kararl─▒ ve uzun soluklu PDP-11 senaryosu

├ľrne─čin, 'sekmeler' i├žin kullan─▒lan bir diziyi bir dizede saklamak i├žin JSON serile┼čtirmesini kullanan bir webapp olu┼čturdu─čunuzu varsayal─▒m (bu durumda, localStorage ). Diyelim ki kod, dizinin ├╝yelerinin say─▒sal dizinlerini, ekrana ├žizerken bunlar─▒ "ba┼čl─▒kland─▒rmak" i├žin kullan─▒yor. Bunu neden sadece "├╝nvan─▒" saklamak yerine yap─▒yorsun? ├ç├╝nk├╝ ... sebepler .

Tamam, sadece bu iste─či ├╝zerine haf─▒zay─▒ kurtarmaya ├žal─▒┼č─▒yoruz diyelim bir UNIX ├žal─▒┼čt─▒ran 1960 den PDP-11 mini bilgisayar─▒ ├žal─▒┼čt─▒ran kullan─▒c─▒ ve kendi Elink tabanl─▒ JavaScript uyumlu, sat─▒r yaz─▒c─▒ dostu taray─▒c─▒ yazd─▒ ├ž├╝nk├╝ X11 s├Âz konusu de─čil .

Giderek aptal kenar senaryosu, bir kenara, delete s├Âz konusu diziyi kullanmak , diziyi null kirletmek ve daha sonra uygulamada hatalara neden olmakla sonu├žlanacakt─▒r . Ve null denetlerseniz, sekmelere benzer ┼čekilde sonu├žlanan say─▒lar─▒ do─črudan atlars─▒n─▒z [1] [2] [4] [5] ... .

 if (array[index] == null)
    continue;
else
    title = (index + 1).toString();
/* 0 -> "1"
 * 1 -> "2"
 * 2 -> (nothing)
 * 3 -> "4"
 */
 

Evet, kesinlikle istedi─čin bu de─čildi.

┼×imdi, ikinci bir yineleyiciyi, ├Ârne─čin yaln─▒zca ge├žerli de─čerler diziden okundu─čunda artmaya devam edecek ┼čekilde tutabilirsiniz j . Fakat bu null sorunu tam olarak ├ž├Âzmez ve yine de bu trol PDP-11 kullan─▒c─▒s─▒n─▒ memnun etmek zorunda kal─▒rs─▒n─▒z . Ne yaz─▒k ki, onun bilgisayar sadece gelmez ge├žen tamsay─▒ oldu─ču beklemeye i├žin yeterli belle─če sahip (... o bir de─či┼čken geni┼člikli dizi i┼člemek i├žin y├Ânetir nas─▒l sormay─▒n) .

Bu y├╝zden size ├Âfkeyle bir e-posta g├Ânderir:

 Hey, your webapp broke my browser! I checked my localStorage database after your stupid code made my browser segfault, and this is what I found:

>"tabs:['Hello World', 'foo bar baz', null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, ... ]"

After clearing my precious data, it segfaulted again, and I did a backtrace, and what do I find? WHAT DO I FIND!? YOU USE TOO MANY VARIABLES!

>var i = index;
>var j = 1;

Grr, I am angry now.
-Troll Davidson
 

┼×u an i├žin, karar─▒n bitiyor. Bu adam uygulaman─▒z hakk─▒nda hi├ž durmadan ┼čikayet ediyor ve siz de ona susmas─▒n─▒ ve daha iyi bir bilgisayar bulmas─▒n─▒ s├Âylemelisiniz.

├ç├Âz├╝m: Array.prototype.splice

Neyse ki, diziler do indeksleri silme ve Bellek yeniden bir uzman y├Ântemi vard─▒r: Array.prototype.splice() . B├Âyle bir ┼čey yazabilirsiniz:

 Array.prototype.remove = function(index){
  this.splice(index,1);
}
...
array = [1, 2, 3, 4];
array.remove(2);
// Result -> [1, 2, 4]
 

Ve aynen b├Âyle, Bay PDP-11ÔÇÖi memnun ettiniz. Ya┼čas─▒n! (Yine de ona hala s├Âylerdim ...)

Array.prototype.splice vs Array.prototype.slice

Her ikisi de ├žok faydal─▒ oldu─ču i├žin, benzer adland─▒r─▒lm─▒┼č iki i┼člev aras─▒ndaki fark─▒ g├Âstermenin ├Ânemli oldu─čunu d├╝┼č├╝n├╝yorum.

Dizi.prototype.splice (ba┼člang─▒├ž, n)

.splice() diziyi de─či┼čtirir ve kald─▒r─▒lan dizinleri d├Ând├╝r├╝r. Dizi dizinden ba┼člayarak dilimlenir start , ve n ├Â─čeler kesilir. N belirtilmemi┼čse, sonraki dizinin tamam─▒ start dilimlenir ( n = array.length - start ).

 let a = [5,4,3,2,1];
let chunk = a.splice(2,2);

// a     [5,4,3,2,1]
// start  0 1 2 - -
// n      - - 1 2 -

chunk; // [3,2]
a;     // [5,4,1]
 

Array.prototype.slice (ba┼člang─▒├ž, biti┼č)

.slice() tahribats─▒zd─▒r ve belirtilen dizinleri start ila aras─▒nda olan yeni bir dizi d├Ând├╝r├╝r end . E─čer end is belirtilmemi┼č sol davran─▒┼č ayn─▒d─▒r .splice() ( end = array.length ). Davran─▒┼č, bir nedenden ├Ât├╝r├╝, end 0 yerine 1'den dizin olu┼čturdu─čundan biraz zor. Neden b├Âyle yapt─▒─č─▒n─▒ bilmiyorum, ama i┼čte b├Âyle. Ayr─▒ca, end <= start sonu├ž bo┼č bir dizidir.

 let a = [5,4,3,2,1];
let chunks = [
    a.slice(2,0),
    a.slice(2,2),
    a.slice(2,3),
    a.slice(2,5) ];

// a             [5,4,3,2,1]
// start          0 1 2 - -
// end, for...    - - - - -
//   chunks[0]  0 - - - - -   
//   chunks[1]    1 2 - - -
//   chunks[2]    1 2 3 - -
//   chunks[3]    1 2 3 4 5

chunks; // [ [], [], [3], [3,2,1] ]
a;      // [5,4,3,2,1]
 

Asl─▒nda olan bu de─čil, ancak bu ┼čekilde d├╝┼č├╝nmek daha kolay. MDN'ye g├Âre, ger├žekte olan ┼čey ┼ču:

 // a             [5,4,3,2,1]
// start          0 1 2 - - -
// end, for...    - - - - - -
//   chunks[0]    0 - - - - -
//   chunks[1]    0 1 2 - - -
//   chunks[2]    0 1(2)3 - -
//   chunks[3]    0 1(2 3 4)5
 

─░le belirtilen dizin end basit├že dilimden hari├ž tutulur. Parantez i├žindeki indeksler neyin dilimlenece─čini g├Âsterir. Her iki durumda da, davran─▒┼člar sezgisel de─čildir ve tek tek hatalar─▒n adil pay─▒na neden olma zorunlulu─čudur; bu nedenle, davran─▒┼č─▒n─▒ daha yak─▒ndan taklit etmek i├žin bir sarmalay─▒c─▒ i┼člevi yapmay─▒ yararl─▒ bulabilirsiniz .splice() :

 function ez_slice(array, start = 0, n = null){
    if(!Array.isArray(array) || !is_number(start))
        return null;

    if(is_number(n))
        return array.slice(start, start + n);

    if(n === null)
        return array.slice(start);

    return null;
}

ez_slice([5,4,3,2,1], 2, 1) // [3]
ez_slice([5,4,3,2,1], 2)    // [3,2,1]

/* Fun fact: isNaN is unreliable.
 * [NaN, [], {}, 0, 1, Infinity, undefined, null, "Hi"].filter(isNaN)
 * [NaN, {}, undefined, "Hi"]
 *
 * What we want is...
 *
 * [NaN, [], {}, 0, 1, Infinity, undefined, null, "Hi"].filter(is_nan)
 * [NaN]
 */
function is_nan(num){
    return typeof num === "number"
        && num !== num;
}

function is_number(num){
    return !is_nan(num)
        && typeof num === "number"
        && isFinite(num);
}
 

Sar─▒c─▒ i┼člevinin t├╝rler hakk─▒nda ├žok kat─▒ olacak ┼čekilde tasarland─▒─č─▒n─▒ ve bir null ┼čey kapal─▒ysa geri d├Ânece─čini unutmay─▒n . Bu gibi bir dize koyarak i├žerir "3" . ├çe┼čitleri hakk─▒nda gayretli olmak programc─▒ya b─▒rak─▒lm─▒┼čt─▒r. Bu, iyi programlama prati─čini te┼čvik etmektir.

─░le ilgili g├╝ncelleme is_array()

Bu, (┼čimdi kald─▒r─▒lm─▒┼č) snippet'iyle ilgilidir:

 function is_array(array){
    return array !== null
        && typeof array === "object"
        && typeof array.length !== "undefined"
        && array.__proto__ === Array.prototype;
}
 

G├Âr├╝nen o ki, asl─▒nda bir dizinin ger├žekten bir dizi olup olmad─▒─č─▒n─▒ ve bunun Array.isArray() ECMAScript 5 (Aral─▒k 2009) 'da tan─▒t─▒ld─▒─č─▒n─▒ s├Âylemenin yerle┼čik bir yolu var . Bunu, nesnelerden dizileri anlatmakla ilgili bir soru olup olmad─▒─č─▒n─▒, benimkinden daha iyi bir ├ž├Âz├╝m olup olmad─▒─č─▒n─▒ veya hi├žbiri yoksa benimkini eklemekle ilgili bir soru olup olmad─▒─č─▒n─▒ sorurken buldum. Yani, ECMA 5'den ├Ânceki bir JavaScript s├╝r├╝m├╝ kullan─▒yorsan─▒z, ├žoklu dolgunuz var. Ancak, is_array() JavaScript'in eski s├╝r├╝mlerini desteklemeye devam etmek, bunlar─▒ uygulayan eski taray─▒c─▒lar─▒ desteklemeye devam etmek anlam─▒na geldi─činden, g├╝vensiz yaz─▒l─▒m kullan─▒m─▒n─▒ te┼čvik etmek ve kullan─▒c─▒lar─▒ k├Ât├╝ ama├žl─▒ yaz─▒l─▒mlar i├žin risk alt─▒na sokmak anlam─▒na gelir. ├ľyleyse l├╝tfen kullan Array.isArray() . Kullan─▒m let ve const . Dile eklenen yeni ├Âzellikleri kullan─▒n. Etmeyin sat─▒c─▒ ├Ânekleri kullan─▒n. Bu IE polyfill sa├žmal─▒─č─▒n─▒ web sitenizden silin . Bu XHTML <!CDATA[[... sa├žmal─▒─č─▒n─▒ da sil - 2014'te HTML5'e geri d├Ând├╝k. Herkes eski / ezoterik taray─▒c─▒lar─▒n deste─čini ne kadar erken geri ├žekerse, taray─▒c─▒ sa─člay─▒c─▒lar─▒ o kadar erken web standard─▒n─▒ izler ve yeni teknolojiyi benimser daha g├╝venli bir a─ča ge├žin.


195







Eski soru, modern cevap. Bir ECMAScript 6 ├Âzelli─či olan nesne imha ├Âzelli─čini kullanarak, ┼ču kadar basit:

 const { a, ...rest } = { a: 1, b: 2, c: 3 };
 

Veya soru ├Ârne─či ile:

 const myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
const { regex, ...newObject } = myObject;
console.log(newObject);
 

Bunu Babil deneme edit├Âr├╝nde ├žal─▒┼č─▒rken g├Ârebilirsiniz.


D├╝zenle:

Ayn─▒ de─či┼čkene atamak i├žin a kullan─▒n let :

 let myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
({ regex, ...myObject } = myObject);
console.log(myObject);
 

163







Bir di─čer alternatif Underscore.js k├╝t├╝phanesini kullanmakt─▒r .

Not _.pick() ve _.omit() do─črudan orijinal nesneyi de─či┼čiklik yapmay─▒n de d├Ân├╝p nesnenin bir kopyas─▒n─▒ ve. Sonucu orijinal nesneye atamak hile yapmal─▒ (g├Âsterilmemi┼čtir).

Referans: link _.pick (nesne, * tu┼člar─▒)

Yaln─▒zca beyaz listedeki tu┼člar (veya ge├žerli tu┼č dizisi) i├žin de─čerlere sahip olmak ├╝zere filtrelenen nesnenin bir kopyas─▒n─▒ d├Ând├╝r├╝n.

 var myJSONObject = 
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

_.pick(myJSONObject, "ircEvent", "method");
=> {"ircEvent": "PRIVMSG", "method": "newURI"};
 

Referans: link _.omit (nesne, * tu┼člar─▒)

Kara listedeki tu┼člar─▒ (veya tu┼č dizisini) atlamak i├žin filtrelenen nesnenin bir kopyas─▒n─▒ d├Ând├╝r├╝n.

 var myJSONObject = 
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

_.omit(myJSONObject, "regex");
=> {"ircEvent": "PRIVMSG", "method": "newURI"};
 

Diziler i├žin, _.filter() ve _.reject() benzer bir ┼čekilde kullan─▒labilir.


89







Yay─▒l─▒ S├Âzdizimi (ES6)

─░htiyac─▒ olanlara ...

Bu konudaki @Koen cevab─▒n─▒ tamamlamak i├žin, yay─▒lma s├Âzdizimini kullanarak dinamik bir de─či┼čkeni kald─▒rmak istedi─činizde, ┼č├Âyle yapabilirsiniz:

 const key = 'a';

const { [key]: foo, ...rest } = { a: 1, b: 2, c: 3 };

console.log(rest); // { b: 2, c: 3 }
 

* foo de─čeri a (1 olan) yeni bir de─či┼čken olacakt─▒r .


G├ťNCELLEME :
Bir ├Âzelli─či bir nesneden kald─▒rman─▒n birka├ž yayg─▒n yolu vard─▒r.
Her birinin kendine g├Âre avantajlar─▒ ve dezavantajlar─▒ vard─▒r ( bu performans kar┼č─▒la┼čt─▒rmas─▒n─▒ kontrol edin ):

Operat├Âr├╝ Sil
Okunabilir ve k─▒sa, ancak performans─▒ optimize edilmedi─činden ├žok say─▒da nesne ├╝zerinde ├žal─▒┼č─▒yorsan─▒z en iyi se├ženek olmayabilir.

 delete obj[key];
 


Yeniden Atama
daha h─▒zl─▒ 2X daha fazla delete ancak m├╝lkiyet edilirde─čilsilinir ve iterated.

 obj[key] = null;
obj[key] = false;
obj[key] = undefined;
 


Spread Operator
Bu ES6 operat├Âr, herhangi bir ├Âzellik hari├ž, mevcut nesneyi mutasyona u─čratmadan yepyeni bir nesne d├Ând├╝rmemize izin verir. Olumsuz taraf─▒, yukar─▒dan daha k├Ât├╝ bir performansa sahip olmas─▒ ve ayn─▒ anda bir├žok ├Âzelli─či kald─▒rman─▒z gerekti─činde kullan─▒lmas─▒ ├Ânerilmemesidir.

 { [key]: val, ...rest } = obj;
 

67







Soru ba┼čl─▒─č─▒n─▒zda kulland─▒─č─▒n─▒z terim Remove a property from a JavaScript object , farkl─▒ ┼čekillerde yorumlanabilir. Bunlardan biri b├╝t├╝n haf─▒zay─▒ ├ž─▒karmak ve nesne tu┼člar─▒n─▒n ya da di─čerlerinin listesini ├ž─▒karmak sadece nesnenizden ├ž─▒karmakt─▒r. Di─čer baz─▒ cevaplarda da belirtildi─či gibi, delete anahtar kelime ana k─▒s─▒md─▒r. Diyelim ki nesneniz ┼č├Âyle:

 myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
 

Yaparsan:

 console.log(Object.keys(myJSONObject));
 

sonu├ž ┼č├Âyle olurdu:

 ["ircEvent", "method", "regex"]
 

Bu belirli anahtar─▒, nesne anahtarlar─▒n─▒zdan a┼ča─č─▒daki gibi silebilirsiniz:

 delete myJSONObject["regex"];
 

Sonra nesneleri anahtar kullanarak kullanmak Object.keys(myJSONObject) olacakt─▒r:

 ["ircEvent", "method"]
 

Ancak mesele, haf─▒zay─▒ ├Ânemsiyorsan─▒z ve nesnenin haf─▒zadan kald─▒r─▒lmas─▒n─▒ tamamen istiyorsan─▒z, tu┼ču silmeden ├Ânce bo┼č b─▒rakman─▒z ├Ânerilir:

 myJSONObject["regex"] = null;
delete myJSONObject["regex"];
 

Buradaki di─čer ├Ânemli nokta ayn─▒ nesneye yapt─▒─č─▒n─▒z di─čer referanslara dikkat etmektir. ├ľrne─čin, ┼č├Âyle bir de─či┼čken olu┼čturursan─▒z:

 var regex = myJSONObject["regex"];
 

Veya bunu, ba┼čka bir nesneye yeni bir i┼čaret├ži olarak ekleyin:

 var myOtherObject = {};
myOtherObject["regex"] = myJSONObject["regex"];
 

Daha sonra nesnesinden ├ž─▒karsan─▒z bile myJSONObject , s├Âz konusu nesne bellekten silinmez, ├ž├╝nk├╝ regex de─či┼čken ve myOtherObject["regex"] de─čerleri hala vard─▒r. O zaman nesneyi bellekten nas─▒l kald─▒rabiliriz?

Bunun cevab─▒ , kodunuzdaki t├╝m referanslar─▒ silmek, o nesneye i┼čaret etmek ve ayn─▒ zamanda o nesneye yeni referanslar olu┼čturmak i├žin var ifadeler kullanmamak olacakt─▒r . var ─░fadelere ili┼čkin bu son nokta , genellikle kar┼č─▒la┼čt─▒─č─▒m─▒z en ├Ânemli konulardan biridir, ├ž├╝nk├╝ var ifadelerin kullan─▒lmas─▒ yarat─▒lan nesnenin kald─▒r─▒lmas─▒n─▒ ├Ânleyecektir.

Bu, bu durumda, nesneyi kald─▒ramayaca─č─▒n─▒z anlam─▒na gelir; ├ž├╝nk├╝ regex de─či┼čkeni bir var ifade arac─▒l─▒─č─▒yla olu┼čturdunuz ve e─čer yaparsan─▒z:

 delete regex; //False
 

Sonu├ž false , silme ifadenizin bekledi─činiz gibi y├╝r├╝t├╝lmedi─či anlam─▒na gelir. Ancak, bu de─či┼čkeni daha ├Ânce yaratmam─▒┼č olsayd─▒n─▒z ve sadece myOtherObject["regex"] mevcut son referans─▒n─▒z gibi yapm─▒┼č olsayd─▒n─▒z, bunu sadece ┼ču ┼čekilde kald─▒rarak yapabilirdiniz:

 myOtherObject["regex"] = null;
delete myOtherObject["regex"];
 

Ba┼čka bir deyi┼čle, bir JavaScript nesnesi kodunuzda bu nesneye i┼čaret eden hi├žbir referans kalmaz kalmaz ├Âld├╝r├╝l├╝r.


G├╝ncelleme: @AgentME sayesinde:

Bir ├Âzelli─či silmeden ├Ânce null de─čerine ayarlamak hi├žbir ┼čey yapmaz (nesne Object.seal taraf─▒ndan m├╝h├╝rlenmemi┼čse ve silme ba┼čar─▒s─▒z olursa. Bu, ├Âzellikle denemeden genellikle b├Âyle olmaz).

Daha fazla bilgi almak i├žin Object.seal : Object.seal ()


45







ECMAScript 2015 (veya ES6) yerle┼čik Reflect nesnesiyle geldi . Object ├Âzelli─čini , hedef nesne ve ├Âzellik anahtar─▒ olan Reflect.deleteProperty () i┼člevini parametre olarak ├ža─č─▒rarak silmek m├╝mk├╝nd├╝r :

 Reflect.deleteProperty(myJSONObject, 'regex');
 

hangi e┼čde─čerdir:

 delete myJSONObject['regex'];
 

Ancak, nesnenin ├Âzelli─či yap─▒land─▒r─▒lamazsa, ne deleteProperty i┼čleviyle, ne de silme operat├Âr├╝yle silinemez:

 let obj = Object.freeze({ prop: "value" });
let success = Reflect.deleteProperty(obj, "prop");
console.log(success); // false
console.log(obj.prop); // value
 

Object.freeze () , nesnenin t├╝m ├Âzelliklerini yap─▒land─▒r─▒lamaz (di─čer ┼čeylerin yan─▒ s─▒ra ) yapar. deleteProperty i┼člev ( silme operat├Âr├╝n├╝n yan─▒ s─▒ra ), false ├Âzelliklerinden herhangi birini silmeye ├žal─▒┼čt─▒─č─▒nda d├Âner . E─čer ├Âzellik yap─▒land─▒r─▒labilir true ise, ├Âzellik bulunmasa bile d├Ând├╝r├╝r .

Kat─▒ mod kullan─▒l─▒rken delete ve aras─▒ndaki fark deleteProperty :

 "use strict";

let obj = Object.freeze({ prop: "value" });
Reflect.deleteProperty(obj, "prop"); // false
delete obj["prop"];
// TypeError: property "prop" is non-configurable and can't be deleted
 

38







Buna benzeyen bir nesneniz oldu─čunu varsayal─▒m:

 var Hogwarts = {
    staff : [
        'Argus Filch',
        'Filius Flitwick',
        'Gilderoy Lockhart',
        'Minerva McGonagall',
        'Poppy Pomfrey',
        ...
    ],
    students : [
        'Hannah Abbott',
        'Katie Bell',
        'Susan Bones',
        'Terry Boot',
        'Lavender Brown',
        ...
    ]
};
 

Bir nesne ├Âzelli─čini silme

T├╝m staff diziyi kullanmak istiyorsan─▒z , bunu yapman─▒n do─čru yolu, ┼čunu yapmak olacakt─▒r:

 delete Hogwarts.staff;
 

Alternatif olarak, bunu da yapabilirsiniz:

 delete Hogwarts['staff'];
 

Benzer ┼čekilde, t├╝m ├Â─črenci s─▒ras─▒n─▒ kald─▒rmak delete Hogwarts.students; veya ├ža─č─▒rmakla yap─▒labilir delete Hogwarts['students']; .

Dizi dizini silme

┼×imdi, tek bir personel veya ├Â─črenciyi kald─▒rmak istiyorsan─▒z, prosed├╝r biraz farkl─▒d─▒r, ├ž├╝nk├╝ her iki ├Âzellik de dizilerdir.

Personel ├╝yelerinizin indeksini biliyorsan─▒z, bunu basit├že yapabilirsiniz:

 Hogwarts.staff.splice(3, 1);
 

Dizini bilmiyorsan─▒z, dizin aramas─▒ yapman─▒z da gerekir:

 Hogwarts.staff.splice(Hogwarts.staff.indexOf('Minerva McGonnagall') - 1, 1);
 

Not

Teknik delete olarak bir dizi i├žin kullanabilirsiniz , ancak bunu kullanmak, ├Ârne─čin Hogwarts.staff.length daha sonra ├ža─č─▒r─▒rken yanl─▒┼č sonu├žlara neden olur . Ba┼čka bir deyi┼čle, delete ├Â─čeyi kald─▒r─▒r, ancak length m├╝lk├╝n de─čerini g├╝ncellemez . Kullan─▒m─▒ delete , indekslemenizi de bozar.

Bu nedenle, bir nesnedeki de─čerleri silerken, her zaman ├Ânce nesne ├Âzellikleriyle ilgilenip ilgilenmedi─činizi veya dizi de─čerleriyle ilgilenip ilgilenmedi─činizi d├╝┼č├╝n├╝n ve buna g├Âre uygun stratejiyi se├žin.

Bunu denemek istiyorsan─▒z, bu Fiddle'─▒ ba┼člang─▒├ž ÔÇőÔÇőnoktas─▒ olarak kullanabilirsiniz .


37







ES6'y─▒ kullanarak:

(Y─▒kma + Yay─▒lma operat├Âr├╝)

 const myObject = {
    regex: "^http://.*",
    b: 2,
    c: 3
};
const { regex, ...noRegex } = myObject;
console.log(noRegex); // => { b: 2, c: 3 }
 

30







Delete operat├Âr├╝ bunu yapmak i├žin en iyi yoldur.

G├Âsterilecek canl─▒ bir ├Ârnek:

 var foo = {bar: 'bar'};
delete foo.bar;
console.log('bar' in foo); // Logs false, because bar was deleted from foo.
 

27







┼×ahsen nesne ve dizi manip├╝lasyonu i├žin Underscore.js veya Lodash kullan─▒yorum :

 myObject = _.omit(myObject, 'regex');
 

27


2016-01-22





Kullan─▒lmas─▒ silme y├Ântemi MDN a├ž─▒klamas─▒ uyar─▒nca, delete operat├Âr├╝ bir nesnenin ├Âzelli─či kald─▒r─▒r, bunu yapmak i├žin en iyi yoldur. B├Âylece sadece yazabilirsiniz:

 delete myObject.regex;
// OR
delete myObject['regex'];
 

Silme i┼čleci, belirli bir ├Âzelli─či bir nesneden kald─▒r─▒r. Ba┼čar─▒l─▒ bir silme i┼čleminde, do─čru d├Ând├╝r├╝l├╝r, aksi takdirde yanl─▒┼č d├Ând├╝r├╝l├╝r. Ancak, a┼ča─č─▒daki senaryolar─▒ dikkate almak ├Ânemlidir:

  • Silmeye ├žal─▒┼čt─▒─č─▒n─▒z ├Âzellik mevcut de─čilse, silme herhangi bir etkiye sahip olmayacak ve do─čru

  • Nesnenin prototip zincirinde ayn─▒ ada sahip bir ├Âzellik varsa, silme i┼čleminden sonra nesne, prototip zincirindeki ├Âzelli─či kullan─▒r (ba┼čka bir deyi┼čle, silme yaln─▒zca kendi ├Âzellikleri ├╝zerinde etkilidir).

  • Var olarak bildirilen hi├žbir ├Âzellik genel kapsamdan veya bir fonksiyonun kapsam─▒ndan silinemez.

  • Bu nedenle, silme global kapsamdaki hi├žbir i┼člevi silemez (bunun bir i┼člev tan─▒m─▒ndan veya bir i┼člevden (ifade) bir par├žas─▒ olup olmad─▒─č─▒).

  • Bir nesnenin par├žas─▒ olan i┼člevler (
    genel kapsam d─▒┼č─▒nda ) silme ile silinebilir.

  • ─░zin veya const ile ilan edilen hi├žbir m├╝lk tan─▒mland─▒─č─▒ kapsamdan silinemez. Yap─▒land─▒r─▒lamayan ├Âzellikler kald─▒r─▒lamaz. Bu, Math, Array, Object gibi yerle┼čik nesnelerin ├Âzelliklerini ve Object.defineProperty () gibi y├Ântemlerle yap─▒land─▒r─▒lamaz olarak olu┼čturulan ├Âzellikleri i├žerir.

A┼ča─č─▒daki kod par├žas─▒ ba┼čka basit bir ├Ârnek verir:

 var Employee = {
      age: 28,
      name: 'Alireza',
      designation: 'developer'
    }
    
    console.log(delete Employee.name);   // returns true
    console.log(delete Employee.age);    // returns true
    
    // When trying to delete a property that does 
    // not exist, true is returned 
    console.log(delete Employee.salary); // returns true 

Daha fazla bilgi edinmek ve daha fazla ├Ârnek g├Ârmek i├žin a┼ča─č─▒daki ba─člant─▒y─▒ ziyaret edin:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete


22







Ba┼čka bir ├ž├Âz├╝m kullanarak Array#reduce .

 var myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};

myObject = Object.keys(myObject).reduce(function(obj, key) {
  if (key != "regex") {           //key you want to remove
    obj[key] = myObject[key];
  }
  return obj;
}, {});

console.log(myObject); 

Ancak, olacak mutasyona orijinal nesneyi. Belirtilen anahtar olmadan yeni bir nesne olu┼čturmak istiyorsan─▒z , azaltma i┼člevini yeni bir de─či┼čkene ataman─▒z yeterlidir, ├Ârne─čin:

(ES6)

 const myObject = {
  ircEvent: 'PRIVMSG',
  method: 'newURI',
  regex: '^http://.*',
};

const myNewObject = Object.keys(myObject).reduce((obj, key) => {
  key !== 'regex' ? obj[key] = myObject[key] : null;
  return obj;
}, {});

console.log(myNewObject); 


20







├ľzelli─či olmayan nesneyi klonlamak i├žin:

├ľrne─čin:

 let object = { a: 1, b: 2, c: 3 };   
 

Ve 'a' silmemiz gerekiyor.

1. a├ž─▒k prop anahtar ile:

 const { a, ...rest } = object;
object = rest;
 

2. De─či┼čken prop tu┼ču ile:

 const propKey = 'a';
const { [propKey]: propValue, ...rest } = object;
object = rest;
 

3. Cool ok i┼člevi ?:

 const removePropery = (propKey, { [propKey]: propValue, ...rest }) => rest;

object = removePropery('a', object);
 

4. Birden fazla ├Âzellik i├žin

 const removeProperties = (object, ...keys) => Object.entries(object).reduce((prev, [key, value]) => ({...prev, ...(!keys.includes(key) && { [key]: value }) }), {})
 

kullan─▒m

 object = removeProperties(object, 'a', 'b') // result => { c: 3 }
 

Veya

     const propsToRemove = ['a', 'b']
    object = removeProperties(object, ...propsToRemove) // result => { c: 3 }
 

20







Bu yaz─▒ ├žok eski ve onu ├žok yararl─▒ buluyorum, bu y├╝zden ba┼čkas─▒n─▒n bu yaz─▒y─▒ g├Ârmesi ve neden PHP unset i┼člevinde bu kadar basit olmad─▒─č─▒n─▒ d├╝┼č├╝nmeme ra─čmen yazd─▒─č─▒m unset i┼člevini payla┼čmaya karar verdim.

Bu yeni unset i┼člevi yazman─▒n nedeni , bu hash_map i├žindeki di─čer t├╝m de─či┼čkenlerin dizinini tutmakt─▒r. A┼ča─č─▒daki ├Ârne─če bak─▒n ve bir de─čeri "hash_map" den ├ž─▒kard─▒ktan sonra "test2" dizininin nas─▒l de─či┼čmedi─čini g├Âr├╝n.

 function unset(unsetKey, unsetArr, resort){
  var tempArr = unsetArr;
  var unsetArr = {};
  delete tempArr[unsetKey];
  if(resort){
    j = -1;
  }
  for(i in tempArr){
    if(typeof(tempArr[i]) !== 'undefined'){
      if(resort){
        j++;
      }else{
        j = i;
      }
      unsetArr[j] = tempArr[i];
    }
  }
  return unsetArr;
}

var unsetArr = ['test','deletedString','test2'];

console.log(unset('1',unsetArr,true)); // output Object {0: "test", 1: "test2"}
console.log(unset('1',unsetArr,false)); // output Object {0: "test", 2: "test2"}
 

19







Burada ├žok iyi cevaplar var ama sadece, bir ├Âzelli─či JavaScript'te kald─▒rmak i├žin delete komutunu kullan─▒rken, hatalar─▒ ├Ânlemek i├žin bu ├Âzelli─čin bulunup bulunmad─▒─č─▒n─▒ kontrol etmek ak─▒ll─▒ca olacakt─▒r.

├ľrne─čin

 var obj = {"property":"value", "property2":"value"};

if (obj && obj.hasOwnProperty("property2")) {
  delete obj.property2;
} else {
  //error handling
}
 

JavaScript'in dinamik yap─▒s─▒ nedeniyle, m├╝lk├╝n var olup olmad─▒─č─▒n─▒ hen├╝z bilmedi─činiz durumlar vard─▒r. &&'Den ├Ânce obj olup olmad─▒─č─▒n─▒ kontrol etmek, ayr─▒ca tan─▒mlanmam─▒┼č bir nesneye hasOwnProperty () i┼člevini ├ža─č─▒rmaktan dolay─▒ hata atmaman─▒z─▒ da sa─člar.

├ťzg├╝n├╝z, bu durum sizin ├Âzel kullan─▒m durumunuza eklenmediyse de, bunun nesneleri ve ├Âzelliklerini y├Ânetirken adapte olmak i├žin iyi bir tasar─▒m oldu─čuna inan─▒yorum.


18







Ramda # dissoc kullanarak ├Âzniteli─či olmayan yeni bir nesne elde edersiniz regex :

 const newObject = R.dissoc('regex', myObject);
// newObject !== myObject
 

Ayn─▒ efekti elde etmek i├žin di─čer i┼člevleri de kullanabilirsiniz - ihmal, se├žim, ...


14







A┼ča─č─▒daki y├Ântemi deneyin. Object ├ľzellik de─čerini atay─▒n undefined . Sonra stringify nesne ve parse .

  var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

myObject.regex = undefined;
myObject = JSON.parse(JSON.stringify(myObject));

console.log(myObject); 


13







Nesnenin derinliklerine yerle┼čtirilmi┼č bir ├Âzelli─či silmek istiyorsan─▒z, a┼ča─č─▒daki ├Âzyinelemeyi ├Âzelli─čin yolu ile ikinci arg├╝man olarak kullanabilirsiniz:

 var deepObjectRemove = function(obj, path_to_key){
    if(path_to_key.length === 1){
        delete obj[path_to_key[0]];
        return true;
    }else{
        if(obj[path_to_key[0]])
            return deepObjectRemove(obj[path_to_key[0]], path_to_key.slice(1));
        else
            return false;
    }
};
 

├ľrnek:

 var a = {
    level1:{
        level2:{
            level3: {
                level4: "yolo"
            }
        }
    }
};

deepObjectRemove(a, ["level1", "level2", "level3"]);
console.log(a);

//Prints {level1: {level2: {}}}
 

11







delete Anahtar kelimeyi kullanarak bir nesnenin herhangi bir ├Âzelli─čini kolayca silebilirsiniz .

├ľrne─čin:

 var obj = {key1:"val1",key2:"val2",key3:"val3"}
 

Herhangi bir m├╝lk├╝ kald─▒rmak i├žin, ┼č├Âyle bir anahtar kelimeyi key1 kullan─▒n delete :

 delete obj.key1
 

Veya dizi benzeri g├Âsterimi de kullanabilirsiniz:

 delete obj[key1]
 

Referans: MDN .


7







Dan'in ÔÇťsilmeÔÇŁ nin ├žok yava┼č oldu─ču iddias─▒ ve g├Ânderdi─či kriter ┼č├╝phe edildi. Bu y├╝zden kendimi Chrome 59'da test ettim. G├Âr├╝nen o ki 'delete' yakla┼č─▒k 30 kat daha yava┼č g├Âr├╝n├╝yor:

 var iterationsTotal = 10000000;  // 10 million
var o;
var t1 = Date.now(),t2;
for (let i=0; i<iterationsTotal; i++) {
   o = {a:1,b:2,c:3,d:4,e:5};
   delete o.a; delete o.b; delete o.c; delete o.d; delete o.e;
}
console.log ((t2=Date.now())-t1);  // 6135
for (let i=0; i<iterationsTotal; i++) {
   o = {a:1,b:2,c:3,d:4,e:5};
   o.a = o.b = o.c = o.d = o.e = undefined;
}
console.log (Date.now()-t2);  // 205
 

Di─čer i┼člemlerin neden oldu─ču etkiyi en aza indirmek i├žin bilerek bir d├Âng├╝ d├Âng├╝s├╝nde birden fazla ÔÇťsilmeÔÇŁ i┼člemi ger├žekle┼čtirdi─čimi unutmay─▒n.


6







"regex" ├ľzellik olmadan yeni bir nesne olu┼čturmay─▒ d├╝┼č├╝n├╝n ├ž├╝nk├╝ orijinal nesneye her zaman program─▒n─▒z─▒n di─čer b├Âl├╝mleri taraf─▒ndan ba┼čvuruda bulunabilir. B├Âylece manip├╝le etmekten ka├ž─▒nmal─▒s─▒n─▒z.

 const myObject = {
    "ircEvent": "PRIVMSG",
    "method": "newURI",
    "regex": "^http://.*"
};

const { regex, ...newMyObject } = myObject;

console.log(newMyObject); 


6







Object.assign () & Object.keys () & Array.map ()

 const obj = {
    "Filters":[
        {
            "FilterType":"between",
            "Field":"BasicInformationRow.A0",
            "MaxValue":"2017-10-01",
            "MinValue":"2017-09-01",
            "Value":"Filters value"
        }
    ]
};

let new_obj1 = Object.assign({}, obj.Filters[0]);
let new_obj2 = Object.assign({}, obj.Filters[0]);

/*

// old version

let shaped_obj1 = Object.keys(new_obj1).map(
    (key, index) => {
        switch (key) {
            case "MaxValue":
                delete new_obj1["MaxValue"];
                break;
            case "MinValue":
                delete new_obj1["MinValue"];
                break;
        }
        return new_obj1;
    }
)[0];


let shaped_obj2 = Object.keys(new_obj2).map(
    (key, index) => {
        if(key === "Value"){
            delete new_obj2["Value"];
        }
        return new_obj2;
    }
)[0];


*/


// new version!

let shaped_obj1 = Object.keys(new_obj1).forEach(
    (key, index) => {
        switch (key) {
            case "MaxValue":
                delete new_obj1["MaxValue"];
                break;
            case "MinValue":
                delete new_obj1["MinValue"];
                break;
            default:
                break;
        }
    }
);

let shaped_obj2 = Object.keys(new_obj2).forEach(
    (key, index) => {
        if(key === "Value"){
            delete new_obj2["Value"];
        }
    }
); 


6







 const myObject = {
        "ircEvent": "PRIVMSG",
        "method": "newURI",
        "regex": "^http://.*"
    };

const { regex, ...other } = myObject;

console.log(myObject)
console.log(regex)
console.log(other) 


6







ES6 yok etmeyi rest operat├Âr├╝ ile kullanabilirsiniz.

├ľzellikler , geri kalan operat├Ârle birlikte y─▒k─▒m kullan─▒larak ├ž─▒kar─▒labilir . ├ľrne─činizde regex yok edilir (yok say─▒l─▒r) ve ├Âzelliklerin geri kalan─▒ dinlenme olarak d├Ând├╝r├╝l├╝r.

 const noRegex = ({ regex, ...rest }) => rest;
const myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};

console.log(noRegex(myObjext)) //=> {  "ircEvent": "PRIVMSG","method": "newURI" }
 

Veya bunun gibi ├Âzellikleri dinamik olarak hari├ž tutabilirsiniz,

 const myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};
const removeProperty = prop => ({ [prop]: _, ...rest }) => rest

const removeRegex = removeProperty('regex') //=> {  "ircEvent": "PRIVMSG","method":"newURI" }
const removeMethod = removeProperty('method') //=> {  "ircEvent": "PRIVMSG", "regex":"^http://.*" }
 

6







Bunu dene

 delete myObject['key'];
 

5







Merhaba Bu basit bir s─▒ralama deneyebilirsiniz

 var obj = [];

obj.key1 = {name: "John", room: 1234};
obj.key2 = {name: "Jim", room: 1234};

delete(obj.key1);
 

5







JavaScriptÔÇÖte ├ľzellik Kald─▒rma

Bu sayfada sunulan bir├žok se├ženek vard─▒r, se├ženeklerin ├žo─ču yanl─▒┼č oldu─ču i├žin (ya da cevaplar─▒n kopyalar─▒ oldu─ču i├žin de─čil) ancak uygun teknik, i├žinde bulundu─čunuz duruma ve sizin ve / veya sizinki g├Ârevlerin hedeflerine ba─čl─▒ oldu─ču i├žin tak─▒m yerine getirmeye ├žal─▒┼č─▒yor. Kesin olarak sorunuzu yan─▒tlamak i├žin, bir bilmek gerekir:

  1. Hedefledi─činiz ECMAScript s├╝r├╝m├╝
  2. ├ľzelliklerini kald─▒rmak istedi─činiz nesne t├╝rlerinin aral─▒─č─▒ ve ihmal etmeniz gereken ├Âzellik adlar─▒n─▒n t├╝r├╝ (yaln─▒zca Dizeler? Semboller? ─░ste─če ba─čl─▒ nesnelerden e┼členen zay─▒f referanslar? Bunlar─▒n hepsi y─▒llard─▒r JavaScript'te ├Âzellik i┼čaret├žisi t├╝rleri olmu┼čtur. )
  3. Sizin ve ekibinizin kulland─▒─č─▒ programlama kurallar─▒ / kal─▒plar─▒. ─░┼člevsel yakla┼č─▒mlar─▒ destekliyor musunuz ve mutasyon ekibinizde verboten mi yoksa vah┼či bat─▒ mutasyonlu nesne y├Ânelimli teknikler kullan─▒yor musunuz?
  4. Bunu saf JavaScript'te mi elde etmek istiyorsun, yoksa 3. taraf bir k├╝t├╝phaneyi mi kullanmak istiyorsun?

Bu d├Ârt sorgu bir kez yan─▒tland─▒ktan sonra, hedeflerinize ula┼čmak i├žin, aralar─▒ndan se├žim yapabilece─činiz, JavaScript'te temel olarak d├Ârt "m├╝lk kald─▒rma" kategorisi vard─▒r. Onlar:

De─či┼čken nesne ├Âzelli─či silme, g├╝vensiz

Bu kategori, orijinal referans─▒ kullanmak / devam ettirmek ve kodunuzda vatans─▒z fonksiyon ilkeleri kullanmamak istedi─činizde, de─či┼čmezler veya nesne ├Ârnekleri ├╝zerinde ├žal─▒┼čmak i├žindir. Bu kategorideki ├Ârnek bir s├Âzdizimi par├žas─▒:

 'use strict'
const iLikeMutatingStuffDontI = { myNameIs: 'KIDDDDD!', [Symbol.for('amICool')]: true }
delete iLikeMutatingStuffDontI[Symbol.for('amICool')] // true
Object.defineProperty({ myNameIs: 'KIDDDDD!', 'amICool', { value: true, configurable: false })
delete iLikeMutatingStuffDontI['amICool'] // throws
 

Bu kategori, m├╝lk├╝n kald─▒r─▒lmas─▒ i├žin en eski, en basit ve en ├žok desteklenen kategoridir. Symbol Dizelere ek olarak & dizi dizinleri destekler ve ilk s├╝r├╝m hari├ž her JavaScript s├╝r├╝m├╝nde ├žal─▒┼č─▒r. Bununla birlikte, baz─▒ programlama prensiplerini ihlal eden ve performans etkileri olan mutasyonludur. Ayr─▒ca kat─▒ modda yap─▒land─▒r─▒lamayan ├Âzelliklerde kullan─▒ld─▒─č─▒nda yakalanmam─▒┼č istisnalara neden olabilir .

Dinlenme tabanl─▒ dize ├Âzellik ihmali

Bu kategori, de─či┼čken olmayan bir yakla┼č─▒m istendi─činde ve Symbol tu┼člar─▒n─▒ hesaba katman─▒z gerekmedi─činde, yeni ECMAScript tatlar─▒ndaki d├╝z nesne veya dizi ├Ârnekleri ├╝zerinde ├žal─▒┼čmak i├žindir.

 const foo = { name: 'KIDDDDD!', [Symbol.for('isCool')]: true }
const { name, ...coolio } = foo // coolio doesn't have "name"
const { isCool, ...coolio2 } = foo // coolio2 has everything from `foo` because `isCool` doesn't account for Symbols :(
 

De─či┼čken nesne ├Âzellik silme, g├╝venli

Bu kategori, yap─▒land─▒r─▒lamayan ├Âzelliklere at─▒lan istisnalara kar┼č─▒ korunurken orijinal referans─▒ kullanmak / devam ettirmek istedi─činizde nesne de─či┼čmezleri veya nesne ├Ârnekleri ├╝zerinde ├žal─▒┼čmak i├žindir:

 'use strict'
const iLikeMutatingStuffDontI = { myNameIs: 'KIDDDDD!', [Symbol.for('amICool')]: true }
Reflect.deleteProperty(iLikeMutatingStuffDontI, Symbol.for('amICool')) // true
Object.defineProperty({ myNameIs: 'KIDDDDD!', 'amICool', { value: true, configurable: false })
Reflect.deleteProperty(iLikeMutatingStuffDontI, 'amICool') // false
 

Buna ek olarak, yerinde nesneleri mutasyon yapmak vatans─▒z olmasa da, Reflect.deleteProperty k─▒smi uygulama ve delete ifadelerle m├╝mk├╝n olmayan di─čer fonksiyonel teknikleri yapmak i├žin i┼člevsel do─čas─▒n─▒ kullanabilirsiniz .

S├Âzdizimi tabanl─▒ dize ├Âzellik ihmali

Bu kategori, de─či┼čken olmayan bir yakla┼č─▒m istendi─činde ve Symbol tu┼člar─▒n─▒ hesaba katman─▒z gerekmedi─činde, yeni ECMAScript tatlar─▒ndaki d├╝z nesne veya dizi ├Ârnekleri ├╝zerinde ├žal─▒┼čmak i├žindir.

 const foo = { name: 'KIDDDDD!', [Symbol.for('isCool')]: true }
const { name, ...coolio } = foo // coolio doesn't have "name"
const { isCool, ...coolio2 } = foo // coolio2 has everything from `foo` because `isCool` doesn't account for Symbols :(
 

K├╝t├╝phane tabanl─▒ m├╝lk ihmali

Bu kategori genellikle, Semboller i├žin muhasebe ve bir ifadede birden fazla ├Âzellik bulunmamas─▒ dahil olmak ├╝zere daha fazla i┼člevsel esnekli─če izin verir:

 const o = require("lodash.omit")
const foo = { [Symbol.for('a')]: 'abc', b: 'b', c: 'c' }
const bar = o(foo, 'a') // "'a' undefined"
const baz = o(foo, [ Symbol.for('a'), 'b' ]) // Symbol supported, more than one prop at a time, "Symbol.for('a') undefined"
 

5



─░lgili yay─▒nlar


Bir nesnenin JavaScript'te belirli bir ├Âzelli─či olup olmad─▒─č─▒n─▒ nas─▒l kontrol ederim?

JavaScript nesnesine dinamik olarak adland─▒r─▒lm─▒┼č ├Âzellikler eklemek m├╝mk├╝n m├╝d├╝r?

JavaScript kullanarak bir dize bo┼čluklar─▒ nas─▒l kald─▒r─▒l─▒r?

Bir JavaScript nesnesinden ├Â─če nas─▒l kald─▒r─▒l─▒r [duplicate]

JavaScript'te bir diziden eleman nas─▒l kald─▒r─▒l─▒r?

Bir JavaScript nesnesinin ├Âzelliklerini nas─▒l sayabilirim? [├žift]

─░ki javascript nesnesini ES6 + 'da nas─▒l birle┼čtiririm?

JavaScript nesnesindeki ├Âzellikleri Lodash ile dola┼čt─▒r─▒n

ConcurrentBag <> 'dan tek, belirli bir nesne nas─▒l kald─▒r─▒l─▒r?

Bir javascript nesnesi ├Âzelli─čine i├žinde k─▒sa ├žizgi ile nas─▒l ba┼čvurabilirim?

Etiketle ilgili di─čer sorular [javascript]


Sakl─▒ yordam─▒n sonu├žlar─▒n─▒ ge├žici bir tabloya ekleyin.

AngularJS'de ng-repeat ile tu┼člar ve de─čerler ├╝zerinde yineleme nas─▒l yap─▒l─▒r?

Git'te silinmi┼č bir dosyay─▒ ay─▒rma

Liste <T> S─▒rayla Alfabetik S─▒rayla

Belirli alanlardaki kopyalar─▒ bulmak i├žin ifadeyi se├žin

Swift'deki bir diziye ├Â─če ekleme

Bir GUID'i, ├Âzellikle performans a├ž─▒s─▒ndan birincil anahtar olarak kullanmak i├žin en iyi y├Ântemler nelerdir?

Haskell / GHC `de` forall` anahtar kelimesi ne i┼če yarar?

Python'da y├╝r├╝t├╝lebilir olup olmad─▒─č─▒n─▒ test edin?

Klas├Ârleri Eclipse aramas─▒ndan hari├ž tut