জাভাস্ক্রিপ্টে অবজেক্টগুলি মুছে ফেলা হচ্ছে


359

আমি জাভাস্ক্রিপ্ট deleteঅপারেটর সাথে কিছুটা বিভ্রান্ত । নিম্নলিখিত কোডের টুকরা নিন:

var obj = {
    helloText: "Hello World!"
};

var foo = obj;

delete obj;

এই কোডের টুকরাটি কার্যকর হওয়ার পরে, objহ'ল null, তবে fooএখনও ঠিক একটি বস্তুকে বোঝায় obj। আমি অনুমান করছি যে এই অবজেক্টটি একই জিনিসটি fooনির্দেশ করেছে।

এটি আমাকে বিভ্রান্ত করে, কারণ আমি প্রত্যাশা করেছি যে লেখাটি delete objমেমরিটির objদিকে নির্দেশ করে এমন জিনিসটি মুছে ফেলেছিল - কেবল পরিবর্তনশীল নয় obj

এই কারণে জাভাস্ক্রিপ্ট এর গার্বেজ কালেকটর, একটি বজায় রাখা / মুক্তির ভিত্তিতে কাজ করছে যাতে আমি যদি বস্তু ইশারা অন্য কোন ভেরিয়েবল ছিল না, এটা হবে স্মৃতি থেকে মুছে ফেলা হতে?

(যাইহোক, আমার পরীক্ষাটি সাফারি ৪ এ করা হয়েছিল))



ডিলিট শব্দ উপর সম্পূর্ণ নিবন্ধ webcache.googleusercontent.com/...
Vitim.us

2
উপরের লিঙ্কটি হওয়া উচিত: perfectionkills.com/understanding-delete
johnmdonahue

1
@ স্টিভ হ্যারিসন মুছে ফেলা জাভাস্ক্রিপ্ট মুছে ফেলা কোনও অবজেক্ট মুছে ফেলার জন্য আপনার আইটেমের কোনও অবজেক্ট কী var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;মুছে objফেলার জন্য ব্যবহারটি মুছে ফেলা হয়নি : delete obj.helloTextএবং তারপরে চেক করুনfoo now foo is an empty object
উমির আহমেদ

2
@ উমাইআম্মেড, নিখরচায় অনুবাদ: "" " deleteজাভাস্ক্রিপ্টে অবজেক্ট মুছে ফেলার জন্য নয়। deleteএকটি অবজেক্ট কী অপসারণ করার জন্য ব্যবহৃত হয়। আপনার ক্ষেত্রে var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;অবজেক্টটি মুছে ফেলা হয়নি। চেক করে দেখুন obj, এরপরে রান করুন delete obj.helloTextএবং আপনি দেখতে পাচ্ছেন যে fooএখন খালি দিকে নির্দেশ করা হয়েছে অবজেক্ট। "" "
পেসারিয়ার

উত্তর:


448

মুছে ফেলা অপারেটর কেবল একটি রেফারেন্স মুছে দেয়, কোনও বস্তু নিজেই নয়। যদি এটি অবজেক্টটি নিজেই মুছে ফেলা হয়, অন্য বাকী রেফারেন্সগুলি সি ++ মুছার মতো ঝুঁকির মতো হবে। (এবং এগুলির মধ্যে একটিতে অ্যাক্সেস ক্রাশের কারণ হতে পারে them এগুলি সকলকে বাতিল করে দেওয়ার অর্থ হ'ল মুছে ফেলার সময় অতিরিক্ত কাজ করা বা প্রতিটি বস্তুর অতিরিক্ত মেমরি।

যেহেতু জাভাস্ক্রিপ্টটি আবর্জনা সংগ্রহ করা হয়েছে, তাই আপনাকে নিজেরাই বস্তুগুলি মুছতে হবে না - যখন তাদের আর উল্লেখ করার উপায় নেই তখন এগুলি সরানো হবে।

কোনও বস্তুর সাথে রেফারেন্সগুলি মুছে ফেলার জন্য এটি দরকারী হতে পারে, কারণ এটি আবর্জনা সংগ্রহকারীকে কী পুনরায় দাবি করতে সক্ষম হবে সে সম্পর্কে আরও তথ্য দেয়। যদি উল্লেখগুলি কোনও বৃহত অবজেক্টের কাছে থেকে যায়, এটির কারণে এটি অননয়নযোগ্য হতে পারে - এমনকি যদি আপনার প্রোগ্রামের বাকী অংশটি আসলে সেই অবজেক্টটি ব্যবহার না করে।


23
deleteশব্দ শুধুমাত্র একটি বস্তুর বৈশিষ্ট্যাবলী নয় ভেরিয়েবল জন্য কাজ করে। পারফেকশনকিলস
বোঝাপড়া- মুছে ফেলা

1
@ অ্যালেক্স জেএম হ্যাঁ, গুফার পরবর্তী উত্তর (এবং তার মন্তব্যগুলি) এটিকে কিছু বিশদে আলোচনা করেছে।
জেসি রুশাক

1
কোনও সামগ্রীর সম্পত্তি অন্য একটি বস্তু হতে পারে। উদাহরণ স্বরূপ; var obj = {a: {}}; delete obj.a;
অ্যালেক্স মুন্ড

2
কিন্তু ... ভেরিয়েবলগুলি আসলে এর বৈশিষ্ট্য নয় window?
রেডক্লুভার

3
@ সোয়াকু স্থানীয় ভেরিয়েবল নয়। (যেমন এর সাথে ঘোষিত var)
জেসি রুসাক

162

deleteকমান্ড নিয়মিত ভেরিয়েবল, শুধুমাত্র বৈশিষ্ট্য উপর কোনো প্রভাব নেই। deleteকমান্ডের পরে সম্পত্তিটির কোনও মূল্য nullথাকে না, এটি একেবারেই বিদ্যমান না।

সম্পত্তিটি যদি কোনও অবজেক্ট রেফারেন্স হয় তবে deleteকমান্ডটি সম্পত্তিটিকে মুছে ফেলে তবে বস্তুটি নয়। আবর্জনা সংগ্রাহক এর সাথে অন্য কোনও উল্লেখ না থাকলে সেটির যত্ন নেবে।

উদাহরণ:

var x = new Object();
x.y = 42;

alert(x.y); // shows '42'

delete x; // no effect
alert(x.y); // still shows '42'

delete x.y; // deletes the property
alert(x.y); // shows 'undefined'

(ফায়ারফক্সে পরীক্ষিত।)


39
এটি যদি বিশ্বব্যাপী সুযোগে কার্যকর করা হয়, তবে আপনার xপরিবর্তনশীল বৈশ্বিক windowবস্তুতে কেবল একটি সম্পত্তি হয়ে যায় এবং delete x;সত্যই xপরিবর্তনশীলটিকে পুরোপুরি সরিয়ে দেয়।
ক্রিসেন্ট টাটকা

18
@ ক্রিসেন্টফ্রেশ: এটি কেবলমাত্র একটি সম্পত্তি যদি এটি সুস্পষ্টভাবে ঘোষণা করা হয়। যদি উদাহরণ হিসাবে এটি স্পষ্টভাবে ঘোষণা করা হয় তবে এটি বিশ্বব্যাপী পরিবর্তনশীল এবং মোছা যাবে না।
গুফা 15

4
@ ট্যারি্ন: আমি দেখছি, সেখানেই সমস্যা। আপনি যদি কনসোলে এটি করেন তবে কোনও কারণে xকিছু ব্রাউজারগুলিতে সঠিক পরিবর্তনশীল হবে না তবে windowঅবজেক্টের সম্পত্তি হবে । এটি অবশ্যই কনসোলের ক্ষেত্রে একটি সমস্যা এবং কীভাবে কোডটি সাধারণত কার্যকর করা হয় তা প্রতিফলিত করে না।
গুফা

2
@ গুফা আমাকে একাধিক গবেষণার পরে স্বীকার করতে হবে এটি সম্ভবত আমার পক্ষে ভোট নেওয়ার পক্ষে যথেষ্ট পরিমাণে সমালোচনা ছিল না। : আমার আন্তরিক ক্ষমাপ্রার্থী এবং সময় গ্রহণ আমাকে কি happeneing ছিল দেখানোর জন্য জন্য ধন্যবাদ ... এখানে একটি indepth explination হয় perfectionkills.com/understanding-delete/#firebug_confusion
Tarynn

2
@ চাও: দেখছি। ট্যারিনের মতো একই সমস্যা আপনারাও পেয়েছেন (আগের মন্তব্য দেখুন)। আপনি যখন কনসোলে এটি করেন এটি রিয়েল কোডের মতো কাজ করে না।
গুফা

56

"পরিস্কারভাবে ঘোষিত ভেরিয়েবলগুলি" বিশ্বব্যাপী অবজেক্টের বৈশিষ্ট্য, সুতরাং এটি কোনও কাজ করে যেমন এটি কাজ করে তাদের উপর কাজ করে মুছুন। ভেরিয়েবলের সাথে ঘোষিত ভেরিয়েবলগুলি অবিনাশযোগ্য।


53
আমি বুঝতে পারি না ভার এত খারাপ ছিল।
গ্যাভিন

1
এটি একটি দুর্দান্ত পয়েন্ট এবং একটি জেএস গেটচা। লোকেরা উইন্ডো ভারগুলি মুছতে অভ্যস্ত হয়ে যায় এবং তারপরে তারা স্থানীয় ভেরিয়েবলগুলি দিয়ে কেন একই কাজ করতে পারে না তা অবাক করে।
ওয়েলবোর্নিও

2
একই জন্য যায় let
পেসারিয়ার 0

23

মজিলা ডকুমেন্টেশন থেকে আগত, "আপনি মুছে ফেলা অপারেটরটি স্পষ্টভাবে ঘোষিত ভেরিয়েবলগুলি মুছতে ব্যবহার করতে পারেন তবে ভেরী স্টেটমেন্টের সাথে ঘোষিত নয়।"

এখানে লিঙ্কটি দেওয়া হয়েছে: https://developer.mozilla.org/En/Core_JavaScript_1.5_ উল্লেখ : অপারেটর : স্পেশাল_অপারেটর : ডিলেট_ অপারেটর


4

delete জাভা স্ক্রিপ্টে কোনও বস্তু মুছতে ব্যবহৃত হয় না।

deleteobject keyআপনার ক্ষেত্রে একটি অপসারণ জন্য ব্যবহৃত

var obj = { helloText: "Hello World!" }; 
var foo = obj;
delete obj;

অবজেক্ট মুছে ফেলা হয় না চেক আপত্তি এখনও একই মান গ্রহণ ব্যবহার মুছে দেয়:

delete obj.helloText

এবং তারপরে চেক করুন obj, foo, উভয়ই খালি অবজেক্ট।


2

এই বিষয়টির আলোকে আপনি কেবল আকর্ষণীয় বিবেচনা করতে পারেন এমন একটি জাসস্পিফ পেয়েছেন । (ছবিটি সম্পূর্ণ করার জন্য এটি চারপাশে রাখা সহজ হতে পারে)

এটি মুছুন , নাল সেট এবং অপরিজ্ঞাত সেট করার সাথে তুলনা করে ।

তবে মনে রাখবেন যে আপনি যখন অনেকবার সম্পত্তি মুছবেন / সেট করবেন তখন এটি কেসটি পরীক্ষা করে।


2

জিসি প্রশ্নগুলি বাদ দিয়ে, পারফরম্যান্সের জন্য ব্রাউজারটি যে পটভূমিতে -> করতে পারে সেগুলি অপ্টিমাইজেশন বিবেচনা করা উচিত

http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/

মনে হচ্ছে রেফারেন্সটি মুছে ফেলার চেয়ে তা বাতিল করা ভাল কারণ এটি পর্দার আড়ালে থাকা 'শ্রেণি' Chrome ব্যবহার করে change


1

IE 5 থেকে 8 এর মধ্যে একটি ত্রুটি রয়েছে যেখানে কোনও হোস্ট অবজেক্টের বৈশিষ্ট্যগুলিতে মুছে ফেলা (উইন্ডো, গ্লোবাল, ডোম ইত্যাদি) টাইপ এয়ারার "বস্তু এই ক্রিয়াকে সমর্থন করে না" ছুঁড়ে ফেলেছে using

var el=document.getElementById("anElementId");
el.foo = {bar:"baz"};
try{
    delete el.foo;
}catch(){
    //alert("Curses, drats and double double damn!");
    el.foo=undefined; // a work around
}

পরে আপনার যদি সম্পত্তিটির পুরো অর্থ ব্যবহারের কোনও অর্থ আছে কিনা তা খতিয়ে দেখার প্রয়োজন el.foo !== undefinedকারণ "foo" in el আইই তে সর্বদা সত্য ফিরে আসবে।

আপনার যদি সত্যিই সম্পত্তিটি নিখরচায় প্রয়োজন হয় ...

function hostProxy(host){
    if(host===null || host===undefined) return host;
    if(!"_hostProxy" in host){
       host._hostproxy={_host:host,prototype:host};
    }
    return host._hostproxy;
}
var el=hostProxy(document.getElementById("anElementId"));
el.foo = {bar:"baz"};

delete el.foo; // removing property if a non-host object

হোস্ট এপিআই সহ হোস্ট অবজেক্টটি আপনার যদি প্রয়োজন হয় ...

el.parent.removeChild(el._host);

1

আমি এই একই উত্তরের জন্য অনুসন্ধানে এই নিবন্ধটি জুড়ে গিয়েছি। আমি যা করতে পেরেছি তা হ'ল obj.pop()আমার অবজেক্টের সমস্ত সঞ্চিত মান / অবজেক্টগুলি পপআপ করা যাতে আমি বস্তুটির পুনরায় ব্যবহার করতে পারি। এটি খারাপ অভ্যাস কিনা তা নিশ্চিত নয়। এই কৌশলটি Chrome কোড সরঞ্জাম বা ফায়ারফক্স ওয়েব কনসোলে আমার কোডটি পরীক্ষা করার জন্য কার্যকর হয়েছিল।


1

এটি আমার পক্ষে কাজ, যদিও এটি একটি ভাল অনুশীলন নয়। এটি কেবলমাত্র সম্পর্কিত সমস্ত উপাদান মুছে দেয় যার সাথে অবজেক্টটি অন্তর্ভুক্ত।

 for (element in homeService) {
          delete homeService[element];
  }

সেরা অনুশীলন কি? আমার মনে পড়ে যে মুছে ফেলা অপারেটর অবজেক্টের বৈশিষ্ট্য মুছে ফেলার জন্য সবচেয়ে ভাল ছিল না। আমি বিশ্বাস করি আমি এটি ক্রকফোর্ডের জাভাস্ক্রিপ্ট বইটিতে পড়েছি, তবে এই মুহুর্তে এটি খনন করতে পারি না।
শূন্য_কুল

0

একটি ভেরিয়েবল সেট nullকরে ডিওএম উপাদান এবং জাভাস্ক্রিপ্ট স্কোপগুলির মধ্যে বিজ্ঞপ্তিযুক্ত রেফারেন্স সহ সমস্ত ব্রাউজারগুলিতে অবজেক্টগুলির কোনও রেফারেন্স ভাঙার বিষয়টি নিশ্চিত করে। deleteকমান্ডটি ব্যবহার করে আমরা আবর্জনা সংগ্রহের পরবর্তী রানটিতে সাফ করার জন্য অবজেক্টগুলিকে চিহ্নিত করছি, তবে যদি একই বস্তুর উল্লেখ করে একাধিক ভেরিয়েবল উপস্থিত থাকে তবে একটি একক ভেরিয়েবল মুছে ফেললে বস্তুটি মুক্ত হবে না, এটি কেবল সেই পরিবর্তনশীল এবং এর মধ্যে যোগসূত্রটি সরিয়ে দেবে it বস্তু এবং আবর্জনা সংগ্রহের পরবর্তী সময়ে, কেবল পরিবর্তনশীল পরিষ্কার করা হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.