এর মধ্যে দুটি করার ক্ষেত্রে কি যথেষ্ট পার্থক্য রয়েছে?
delete a.x;
বনাম
a.x = undefined;
কোথায়
a = {
x: 'boo'
};
এগুলি কি সমতুল্য বলা যায়?
(আমি "ভি 8 deleteআরও ভাল ব্যবহার না করা পছন্দ করি" এর মতো অ্যাকাউন্টগুলিতে নিচ্ছি না )
এর মধ্যে দুটি করার ক্ষেত্রে কি যথেষ্ট পার্থক্য রয়েছে?
delete a.x;
বনাম
a.x = undefined;
কোথায়
a = {
x: 'boo'
};
এগুলি কি সমতুল্য বলা যায়?
(আমি "ভি 8 deleteআরও ভাল ব্যবহার না করা পছন্দ করি" এর মতো অ্যাকাউন্টগুলিতে নিচ্ছি না )
উত্তর:
তারা সমতুল্য নয়। মূল পার্থক্যটি সেটিংস
a.x = undefined
এর অর্থ এটি a.hasOwnProperty("x")এখনও সত্য ফিরে আসবে এবং তাই এটি এখনও একটি for inলুপে এবং এর মধ্যে প্রদর্শিত হবেObject.keys()
delete a.x
মানে যে a.hasOwnProperty("x")মিথ্যা ফিরে আসবে
সেগুলি যেভাবে হয় সেভাবে আপনি পরীক্ষা করে কোনও সম্পত্তি বিদ্যমান কিনা তা আপনি বলতে পারবেন না
if (a.x === undefined)
আপনি যদি কোনও সম্পত্তি বিদ্যমান কিনা তা নির্ধারণ করার চেষ্টা করছেন যা আপনার করা উচিত নয়, আপনার সর্বদা ব্যবহার করা উচিত
// If you want inherited properties
if ('x' in a)
// If you don't want inherited properties
if (a.hasOwnProperty('x'))
প্রোটোটাইপ চেইন অনুসরণ করা ( zzzzBov দ্বারা উল্লিখিত ) কলিং deleteএটিকে প্রোটোটাইপ চেইনটিতে যেতে অনুমতি দেবে, অন্যদিকে নির্ধারিততে মান নির্ধারণ করা শৃঙ্খলযুক্ত প্রোটোটাইপগুলিতে সম্পত্তিটির সন্ধান করবে না http://jsfiddle.net/NEEw4/1/
var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
extended.x = "overriding";
console.log(extended.x); // overriding
extended.x = undefined;
console.log(extended.x); // undefined
delete extended.x;
console.log(extended.x); // fromPrototype
উত্তরাধিকারী সম্পত্তি মুছে ফেলা আপনি যে সম্পত্তিটি মুছে ফেলার চেষ্টা করছেন তা যদি উত্তরাধিকার সূত্রে হয়, deleteতবে এটি প্রভাব ফেলবে না। এটি হ'ল deleteকেবলমাত্র বস্তু থেকে বৈশিষ্ট্য মুছে ফেলা হবে, উত্তরাধিকারসূত্রে প্রাপ্ত বৈশিষ্ট্য নয়।
var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
delete extended.x;
console.log(extended.x); // Still fromPrototype
অতএব, আপনার যদি নিশ্চিত হওয়া দরকার যে কোনও জিনিসের মূল্য অপরিবর্তিত হবে, deleteসম্পত্তি উত্তরাধিকার সূত্রে প্রাপ্ত হয়ে কাজ করবে না, আপনাকে সে ক্ষেত্রে সেট (ওভাররাইড) করতে হবে undefined। এটির জন্য যাচাই করা জায়গাটি ব্যবহার hasOwnPropertyনা করা হলে তবে এটি ধরে নেওয়া নিরাপদ হবে না যে এটি যে কোনও জায়গায় পরীক্ষা করে এটি ব্যবহার করবেhasOwnProperty
"x" in atrueপ্রাক্তন এবং falseশেষের সাথে ফিরে আসবে। এর আউটপুটও Object.keysআলাদা হবে।
undefined, আপনি কেবলমাত্র পরীক্ষা করতে পারেন if (a.x), যদি না এটি সংখ্যা এবং 0
প্রশ্নটি উত্তোলন করতে:
হয়
delete a.xএবংa.x = undefinedসমতুল্য?
প্রাক্তনটি ভেরিয়েবল থেকে কীটি সরিয়ে দেয়, পরে মানটি দিয়ে কীটি সেট করে undefined। বস্তুর বৈশিষ্ট্যগুলির উপরে পুনরাবৃত্তি করার সময় এবং কখন hasOwnPropertyব্যবহৃত হয় এটি একটি তাত্পর্য তৈরি করে।
a = {
x: true
};
a.x = undefined;
a.hasOwnProperty('x'); //true
delete a.x;
a.hasOwnProperty('x'); //false
প্রোটোটাইপ চেইন জড়িত থাকাকালীন, এটি একটি গুরুত্বপূর্ণ পার্থক্য আনবে।
function Foo() {
this.x = 'instance';
}
Foo.prototype = {
x: 'prototype'
};
a = new Foo();
console.log(a.x); //'instance'
a.x = undefined;
console.log(a.x); //undefined
delete a.x;
console.log(a.x); //'prototype'
deleteপ্রোটোটাইপ চেইনটিতে যাওয়ার অনুমতি দেওয়ার বিষয়ে +1 দুর্দান্ত বক্তব্য
হ্যাঁ একটি পার্থক্য আছে। আপনি যদি delete a.xএক্স ব্যবহার করেন a.x=undefinedতবে এটি কোনও এর সম্পত্তি নয়, আপনি যদি এটি ব্যবহার করেন তবে এটি একটি সম্পত্তি তবে এর মান অপরিবর্তিত।
নামগুলি কিছুটা বিভ্রান্তিকর। a.x = undefinedসম্পত্তিটি কেবল এতে সেট করে undefinedতবে সম্পত্তি এখনও আছে:
> var a = {x: 3};
> a.x = undefined;
> a.constructor.keys(a)
["x"]
delete আসলে এটি মুছে দেয়:
> var a = {x: 3};
> delete a.x;
> a.constructor.keys(a)
[]
আমি নিশ্চিত আপনি var o1 = {p:undefined};এবং এর মধ্যে পার্থক্য দেখতে পাবেন var o2 = {};।
উভয় ক্ষেত্রেই o.pহবে undefinedতবে প্রথম ক্ষেত্রে, এটি কারণ এটির মান এবং দ্বিতীয় ক্ষেত্রে কোনও মান নেই কারণ ।
deleteঅপারেটর আপনি থেকে পাওয়া দেয় o1(অথবা অন্য বস্তুর একটি মান তার নির্ধারিত আছে যা pসম্পত্তি) এর o2যে ভাবে: delete o1.p;।
বিপরীত অপারেশনটি সম্পত্তিটিতে কেবল একটি মান নির্দিষ্ট করে ( undefinedএই উদাহরণে তবে এটি অন্য কিছু হতে পারে) তৈরি করে o1.p = undefined;।
সুতরাং না , তারা সমতুল্য নয়।
delete o.p; ইচ্ছাশক্তি
pবস্তুটি থেকে সম্পত্তিটি সরিয়ে ফেলুন
অন্যথায় কিছুই করবেন না
o.p = undefined; ইচ্ছাশক্তি
pবস্তুটিতে একটি সম্পত্তি যুক্ত করুন যদি এটির এখনও একটি না থাকে এবং এর মান সেট করেundefined
কেবলমাত্র সম্পত্তির মানটি পরিবর্তন করুন যদি বস্তুর এটি ইতিমধ্যে থাকে
পারফরম্যান্সের দৃষ্টিকোণ থেকে, deleteএটি খারাপ কারণ এটি অবজেক্টের কাঠামো পরিবর্তন করে (ঠিক যেমন একটি নতুন সম্পত্তি যুক্ত করা যেমন আপনি এটি নির্মাণকারীর মধ্যে আরম্ভ না করেছেন)।
undefinedউপাদান নির্ধারণ করতে বাধ্য না করে পাশাপাশি কন্টেন্টটি প্রকাশের ক্ষেত্রে মান নির্ধারণ করা হয় ।
অবজেক্টটি কেবল একটি গাছের উপস্থাপনা, যার অর্থ মেমোরিতে মূল মেমোরির বিভিন্ন মেমোরি অবস্থানগুলিতে নির্দেশ করা হয় যেখানে সেই বস্তুর কীগুলি সংরক্ষণ করা হয়। এবং সেই অবস্থানটি অন্য কোনও স্থানে নির্দেশ করে যেখানে key কীটির আসল মান সংরক্ষণ করা হয় বা যেখানে শিশু কীগুলি সংরক্ষণ করা হয় বা সেই স্থানে যেখানে অ্যারের মানগুলি সঞ্চয় থাকে।
আপনি যখন মুছে ফেলা ব্যবহার করে কোনও কী মুছে ফেলেন, আসলে এটি সেই কী এবং এর প্যারেন্ট অবজেক্টের মধ্যে লিঙ্কটি মুছে দেয় এবং কী এবং এর মানটির মেমরি অবস্থানগুলি অন্য তথ্য সংরক্ষণের জন্য মুক্ত করা হয়।
আপনি যখন কোনও কীটিকে এর মান হিসাবে নির্ধারিত সেট করে মুছে ফেলার চেষ্টা করেন, তখন আপনি কেবল তার মানটি সেট করছেন, সেই কীটি মোছা নয়। এর অর্থ হ'ল কীগুলি মেমরির অবস্থানটি এখনও তার প্যারেন্ট অবজেক্টের সাথে এবং কীটি অপরিজ্ঞাত থাকলে মানটির সাথে যুক্ত is
মুছে ফেলা কীওয়ার্ড ব্যবহার করার পরিবর্তে অপরিজ্ঞাত ব্যবহার করা একটি খারাপ অভ্যাস, কারণ এটি কীটির মেমরির অবস্থান প্রকাশ করে না।
এমনকি যদি কীটি উপস্থিত না থাকে এবং আপনি এটিকে অপরিবর্তিত হিসাবে সেট করেন তবে সেই কীটি মান দিয়ে তৈরি হবে undefined।
যেমন
var a = {};
a.d = undefined;
console.log(a); // this will print { d: undefined }
উত্তরাধিকার সূত্রে প্রাপ্ত সম্পত্তিগুলির সাথে মুছুন কাজ করা যাবে না কারণ সেই সম্পত্তি সেই শিশু বস্তুর অংশ নয়।
as a general rule of thumb, using 'delete' makes thing slower.এবং ডেভেলপারস google.com/v8/designTo reduce the time required to access JavaScript properties, V8 does not use dynamic lookup to access properties. Instead, V8 dynamically creates hidden classes behind the scenes. In V8, an object changes its hidden class when a new property is added. , এবং অবশেষে smashingmagazine.com/2012/11/…
কোনও বস্তুর পরিবর্তে একটি অ্যারে ব্যবহার করে, আমি প্রদর্শন করতে পারি যে মুছুন অনির্ধারিত চেয়ে কম হিপ মেমরি ব্যবহার করে।
উদাহরণস্বরূপ, এই কোডটি শেষ করবে না:
let y = 1;
let ary = [];
console.log("Fatal Error Coming Soon");
while (y < 4294967295)
{
ary.push(y);
ary[y] = undefined;
y += 1;
}
console(ary.length);
এটি এই ত্রুটি তৈরি করে:
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory.
সুতরাং, আপনি দেখতে পাচ্ছেন যে undefinedআসলে হিপ মেমরি লাগে।
তবে, আপনি যদি deleteঅ্যারি-আইটেমটিও (কেবল এটি সেট করার পরিবর্তে undefined) করেন তবে কোডটি আস্তে আস্তে শেষ হবে:
let x = 1;
let ary = [];
console.log("This will take a while, but it will eventually finish successfully.");
while (x < 4294967295)
{
ary.push(x);
ary[x] = undefined;
delete ary[x];
x += 1;
}
console.log(`Success, array-length: ${ary.length}.`);
এগুলি চরম উদাহরণ, তবে তারা এ সম্পর্কে একটি বক্তব্য রাখে deleteযে আমি কোথাও কাউকে উল্লেখ করতে দেখিনি।