Javascript dəyişənini necə aradan qaldırmaq olar?

Mən əvvəlki script ilə dolu olan javascript (bu, həqiqətən, bir window mülkiyyətidir, amma bunun mühüm olduğunu düşünmürəm) bir qlobal dəyişən var, lakin daha sonra başqa bir ssenari istəmirəm, onun dəyərini görmək və ya hətta müəyyən.

some_var = undefined qoydu və typeof some_var == "undefined" test məqsədi ilə işləyir, amma həqiqətən bunun doğru yol olduğunu düşünmürəm.

Sizcə nədir?

454
20 окт. Guss 20 oktyabrda qurdu . 2009-10-20 22:23 '09 da 10:23 AM 2009-10-20 22:23
@ 10 cavab

Bilirəm ki, bu köhnə bir axındır, amma seçilmiş cavab mənim üçün kifayət qədər aydın deyil.

Nöqtə silmək operatoru obyektdən obyekti rədd edir. Bir dəyişən silə bilməz. Beləliklə, bir sualın cavabı qlobal dəyişən və ya əmlakın necə müəyyənləşdirilməsindən asılıdır.

(1) Var ilə yaradılmışdırsa, silinemez.

Məsələn:

 var g_a = 1; //create with var, g_a is a variable delete g_a; //return false console.log(g_a); //g_a is still 1 

(2) Var olmadan yaradılıbsa, silinəcəkdir.

 g_b = 1; //create without var, g_b is a property delete g_b; //return true console.log(g_b); //error, g_b is not defined 

Texniki izahat

1. var istifadə

Bu halda, g_a istinad ECMAScript spesifikasiyasında cari sahəyə bağlı olan bir " VariableEnvironment " adlanır ki, bu funksiya daxilində var olduqda icra kontekstində funksiya ola bilər (baxmayaraq ki, bu, əgər hesab etsəniz bir az daha mürəkkəb ola bilər) və ya "qlobal" bir kod vəziyyətində, ətraf mühit dəyişənliyi bir qlobal obyektə (tez-tez bir window ) bağlıdır.

VariableEnvironment mühitində olan linklər adətən silinməyəcək - ECMAScript 10.5- də ətraflı şəkildə izah edilən proses ətraflı ətraflı şəkildə açıqlanır , lakin eval kontekstində (brauzerinizin əsasən inkişaf konsollarının istifadəsi) çalışan deyilsə, deməli, var istifadə edərək, silinemez.

2. var istifadə etmədən

var sözünü istifadə etmədən bir ad təyin etmək üçün Javascript, ECMAScript spesifikasiyası " LexicalEnvironment " adlandırır və əsas fərq LexicalEvironments içərisindədir - bu LexicalEnvironment bir valideynə malikdir (ECMAScript spesifikasiyası xarici ) və Javxcript LexicalEnvironment-də link tapmasa, orijinal LexicalEnvironment ( 10.3.110.2.2.1- də ətraflı təsvir olunduğu kimi) baxır . LexicalEnvironment ən üst səviyyədə qlobal mühitdir "və bu, onun obyektlərinin obyektlərinin qlobal xüsusiyyətləri olması ilə əlaqədar olaraq, qlobal obyektlə bağlıdır və buna görə də, mövcud var sözü ilə və ya hər hansı bir Xarici sahələrdə, Javascript, nəticədə bu link kimi xidmət etmək üçün window obyektinin mülkiyyətini alacaqdır. Daha əvvəl öyrənildiyimiz kimi, obyektlərin xüsusiyyətləri silinəcəkdir.

Qeydlər

  • var bəyannamələrinin "qaldırıldığını" xatırlamaq vacibdir, yəni onlar daima yerləşdiyi ərazinin başında meydana gəldiyi hesab olunurlar, baxmayaraq ki, orada icra edilə bilən bir dəyərin var - bu olduğu yer qalır. Beləliklə, aşağıdakı kodda a, dəyişənEnvironment mülkiyyətindən bir window , onun kodu kodun sonunda 10 çatacaqdır:

    function test() { a = 5; var a = 10; }

  • Yuxarıda müzakirələr "ciddi rejim" daxil edilmədikdədir. "Qətiyyətsiz rejimi" və "sərt rejim" olmadan bir pəncərənin xüsusiyyətlərinə imkan verən leksik istinadlar "qeyri-elan edilmiş dəyişən" in "ciddi rejimdə" səhvlərini artırdıqda axtarış qaydaları bir az fərqlidir. Bu göstərildiyi yerin tam başa düşmədim, ancaq brauzerlərin bu davranışı necədir.

284
18 сент. Cavab Dayong 18 Sentyabr verilir. 2014-09-18 21:33 '14 at 21:33 2014-09-18 21:33

@scunlife cavab işləyəcək, amma texniki olaraq olmalıdır

 delete window.some_var; 

hədəf obyektin mülkiyyəti olmadıqda, silinməməlidir. məsələn.

 (function() { var foo = 123; delete foo; // wont do anything, foo is still 123 var bar = { foo: 123 }; delete bar.foo; // foo is gone }()); 

Lakin qlobal dəyişənlər həqiqətən bir pəncərə obyektinin üzvlərindən olduğundan, işləyir.

border=0

Prototip zəncirləri cəlb olunduqda, silmək istifadə edərək daha obyektiv olur, çünki prototip deyil, hədəf obyektindən deyil. məsələn.

 function Foo() {} Foo.prototype = { bar: 123 }; var foo = new Foo(); // foo.bar is 123 foo.bar = 456; // foo.bar is now 456 delete foo.bar; // foo.bar is 123 again. 

Buna görə diqqətli olun.

EDIT: Cavabım bir az yanlışdır (sonunda "Yanlış Nümayişlər" bax). Bağlantı, qorumanın bütün detallarını açıqlayır, lakin xülasə, brauzerlər arasında və silmək istədiyiniz obyektə görə böyük fərqlər ola biləcəyidir. delete object.someProp normal halda təhlükəsiz olmalıdır object !== window delete object.someProp object !== window . Müvafiq şərtlər altında olmağınıza baxmayaraq hələ var ilə elan edilmiş dəyişənləri aradan qaldırmaq üçün istifadə etməyəcəyəm.

258
20 окт. Cavab 20 oktyabrda Noah verilir 2009-10-20 22:47 '09 at 10:47 PM 2009-10-20 22:47

Əgər bir şeysiz bir dəyişən bəyan etsəniz, doğru yolu delete foo istifadə etmək olardı.

Lakin, silməkdən sonra, bir əməliyyatda istifadə etməyə çalışarsanız, məsələn, bir ReferenceError əlavə edin, çünki qeyri-müəyyənləşdirilməmiş identifikatora simli əlavə edə bilməzsiniz. Məsələn:

 x = 5; delete x alert('foo' + x ) // ReferenceError: x is not defined 

Bəzi hallarda, bildirilmişdir və bu tip səhvlərə səbəb olmayacaq şəkildə, yalan, null və ya müəyyən edilməyən bir dəyər vermək təhlükəsiz ola bilər.

 foo = false 

ECMAScriptdə null , false , undefined , 0 , NaN və ya '' false qiymətləndiriləcək unutmayın. Yalnız != Operatorunu istifadə etməyinizə əmin olun, amma əvəzinə != , Boolean elementlər üçün növünü yoxladığınızda və şəxsiyyət yoxlamasını istəmirsinizsə (bu səbəbdən null == falsefalse == undefined ).

Həmçinin, delete linkləri "silmir" deyil, sadəcə obyektin üzərindəki xüsusiyyətləri, məsələn:

 bah = {}, foo = {}; bah.ref = foo; delete bah.ref; alert( [bah.ref, foo ] ) // ,[object Object] (it deleted the property but not the reference to the other object) 

var ilə dəyişən varsa, onu silə bilməzsiniz:

 (function() { var x = 5; alert(delete x) // false })(); 

Rinoda:

 js> var x js> delete x false 

Ayrıca əvvəlcədən təyin edilmiş bəzi xüsusiyyətləri silə bilərsiniz, məsələn Math.PI :

 js> delete Math.PI false 

delete üçün bir sıra istisnalar var, hər hansı bir dildən olduğu kimi, oxumaq üçün kifayət qədər diqqətli olursanız:

34
20 окт. Ömüralıyevə 20 aylıq cavab verildi . 2009-10-20 22:31 '09 at 10:31 pm 2009-10-20 22:31
 some_var = null; //or remove it.. delete some_var; 
28
20 окт. Scunliffe tərəfindən verilmiş cavab 20 oktyabr . 2009-10-20 22:24 '09 at 10:24 pm 2009-10-20 22:24

DR; sadə dəyişənlər ( var , let , const olmadan) delete . var istifadə edin, const , onlar delete və ya Reflect.deleteProperty ilə delete Reflect.deleteProperty .

Chrome 55:

 simpleVar = "1"; "1" delete simpleVar; true simpleVar; VM439:1 Uncaught ReferenceError: simpleVar is not defined at <anonymous>:1:1 (anonymous) @ VM439:1 var varVar = "1"; undefined delete varVar; false varVar; "1" let letVar = "1"; undefined delete letVar; true letVar; "1" const constVar="1"; undefined delete constVar; true constVar; "1" Reflect.deleteProperty (window, "constVar"); true constVar; "1" Reflect.deleteProperty (window, "varVar"); false varVar; "1" Reflect.deleteProperty (window, "letVar"); true letVar; "1" 

FF Nightly 53.0a1 eyni davranışı göstərir.

4
05 янв. Cavab Serj tərəfindən verilir. 05 yanvar 2017-01-05 18:13 '17 də 18:13 2017-01-05 18:13 'də

Hər şeyi yazmaqla yanaşı, silmənin booleanı qaytarır. Silmənin silinməyəcəyi və ya olmadığını sizə deyə bilər.

ƏLAVƏ OLUNUB:

Ən son Chrome-da sınaqdan keçmək hər şeyə təsirli idi. delete funksiyası aşağıdakı metodların hamısı üçün true və həqiqətən silinmişdir:

 implicit_global = 1; window.explicit_global = 1; function_set = function() {}; function function_dec() { }; var declared_variable = 1; delete delete implicit_global; // true, tested on Chrome 52 delete window.explicit_global; // true, tested on Chrome 52 delete function_set; // true, tested on Chrome 52 delete function_dec; // true, tested on Chrome 52 delete declared_variable; // true, tested on Chrome 52 
2
23 нояб. 23 noyabr tarixində oriadam tərəfindən verilən cavab . 2015-11-23 13:36 '15 'də saat 13:36' da

ECMAScript 2015 Reflect API təklif edir. Reflect.deleteProperty () istifadə edərək obyekt mülkünü silə bilərsiniz:

 Reflect.deleteProperty(myObject, 'myProp'); // it is equivalent to: delete myObject.myProp; delete myObject['myProp']; 

Bir window obyektinin qlobal xüsusiyyətini aradan qaldırmaq üçün:

 Reflect.deleteProperty(window, 'some_var'); 

Bəzi hallarda xüsusiyyətlər (əmlak konfiqurasiya edilmədikdə) aradan qaldırıla bilməz və bu funksiya false qaytarır (və həmçinin operatoru çıxar ). Digər hallarda, true qaytarır:

 Object.defineProperty(window, 'some_var', { configurable: false, writable: true, enumerable: true, value: 'some_val' }); var frozen = Object.freeze({ myProperty: 'myValue' }); var regular = { myProperty: 'myValue' }; var blank = {}; console.log(Reflect.deleteProperty(window, 'some_var')); // false console.log(window.some_var); // some_var console.log(Reflect.deleteProperty(frozen, 'myProperty')); // false console.log(frozen.myProperty); // myValue console.log(Reflect.deleteProperty(regular, 'myProperty')); // true console.log(regular.myProperty); // undefined console.log(Reflect.deleteProperty(blank, 'notExistingProperty')); // true console.log(blank.notExistingProperty); // undefined 

deleteProperty funksiyası və delete operatoru arasında ciddi rejimdə çalışan bir fərq var:

 'use strict' var frozen = Object.freeze({ myProperty: 'myValue' }); Reflect.deleteProperty(frozen, 'myProperty'); // false delete frozen.myProperty; // TypeError: property "myProperty" is non-configurable and can't be deleted 
2
25 янв. Cavab verilir madox2 25 yanvar. 2016-01-25 18:37 '16 'da 18:37' də 2016-01-25 18:37 'də

Sil operatoru bir obyektdən bir obyekti silməkdədir.

 delete object.property delete object['property'] 

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

Suala görə, aşağıdakılardan birinə ehtiyacınız var

 delete some_var; delete window.some_var; delete window['some_var']; 
1
15 дек. Cavab 15 dekabrda Swarnendu Paul tərəfindən verilir . 2015-12-15 00:11 '15 at 0:11 2015-12-15 00:11

İlk istifadə zamanı (xxxx ilə) elan etdikdə dəyişən silmək mümkün deyil. Bununla belə, əgər x dəyişən ilk bəyanatsız bir ssenaridə görünsəydi, silmək operatorunu (x; silmək) istifadə edə bilərsiniz və dəyişən bir sətrin elementini silmək və ya obyekt mülkünü silmək üçün çox asılı olaraq silinəcəkdir.

1
31 марта '16 в 20:48 2016-03-31 20:48 Cavab Satyapriya Mişra tərəfindən 31 Mart 'da 20:48 2016-03-31 20:48' də verilir

Sadə xüsusiyyətlərdən fərqli olan dəyişənlər, [[Yapılandırılabilir]] öznitəsinə malikdirlər, yəni silmək operatorundan istifadə edərək dəyişən silmək mümkün deyildir. Ancaq bu qayda təsir etməyən bir icra konteksti var. Bu qiymətləndirmə məzmunudur : [[Yapılandırılabilir]] özniteliği dəyişənlər üçün təyin olunmur.

1
25 янв. Eldiyar Talantbek cavab verdi 25 yanvar. 2017-01-25 07:46 '17 də 7:46 'də 2017-01-25 07:46' də

etiketləri ilə bağlı digər suallar və ya sual verin