অবজেক্ট.ফ্রিজে () বনাম কনস্টের


136

Object.freeze()constES6 এ ব্যবহারের দিকে অগ্রসর হওয়ার জন্য একটি স্থানান্তরিত সুবিধার পদ্ধতির মতো মনে হচ্ছে method

কোডগুলিতে উভয়ই তাদের স্থান নেয় বা অপরিবর্তনীয় ডেটা নিয়ে কাজ করার কোনও পছন্দনীয় উপায় আছে এমন ক্ষেত্রে কি এমন ঘটনা রয়েছে?

আমি Object.freeze()সমর্থনের সাথে কাজ করা সমস্ত ব্রাউজারগুলি constতার constপরিবর্তে ব্যবহারে স্যুইচ করার মুহুর্ত পর্যন্ত ব্যবহার করা উচিত?


2
আমি আমার বিল্ড প্রসেসে ব্যাবেলজগুলি ব্যবহার করেছি তাই আমি মূলত এইগুলির মতো সামঞ্জস্যতার সমস্যাগুলি উপেক্ষা করতে পারি।
খরচ করে

22
না - তারা বিভিন্ন জিনিস করে। কনট পুনর্নির্মাণকে বাধা দেয় (উদাহরণস্বরূপ আপনি x = 1; x = 2 গঠন করতে পারবেন না); হিম পরিবর্তনকে বাধা দেয় (যেমন আপনি Object.freeze (x); xa = 2);
joews

নিশ্চিত না যে এটি একটি নতুন প্রশ্ন করা বা এটি এখানে এটিকে মোকাবেলা করার জন্য বোধগম্য হয় তবে সিম্বলস এবং অবজেক্ট.ফ্রিজে কোন বড় পার্থক্য থাকলে আমি কি কৌতূহলী হতে পারি? আমি তারা সম্পর্কিত হয় (অর্থাত প্রতীকসমূহ থেকে হিমায়িত যেমন মূল্যায়ন করা হয় মনে Object.isFrozenকিন্তু তারা তাদের নিজস্ব আদিম ডাটা টাইপ ... হয়)
আগস্ট

রূপান্তরটি কেবল প্রথম স্তরের জন্য প্রতিরোধ করা হয় যাতে আপনি অবজেক্ট.ফ্রিজে (এক্স) করতে পারবেন না; xa = 2, তবে আপনি অবজেক্ট.ফ্রীজ (এক্স) করতে পারেন; xab = 2. jsfiddle.net/antimojv/op6ea91w/8 দেখুন । সম্পূর্ণ ফ্রিজের জন্য অ্যাডহক লাইব্রেরি ব্যবহার করুন
অ্যান্টিমো

উত্তর:


229

constএবং Object.freezeদুটি সম্পূর্ণ ভিন্ন জিনিস।

constবাইন্ডিংগুলিতে প্রয়োগ হয় ("ভেরিয়েবল")) এটি একটি অপরিবর্তনীয় বাঁধাই তৈরি করে, অর্থাত আপনি বাইন্ডিংয়ে কোনও নতুন মান নির্ধারণ করতে পারবেন না।

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


3
মূলত, constনতুন হয় var; এটি কেবল ব্লক-স্কোপড এবং পুনরায় নিযুক্তকরণ প্রতিরোধ করে। আপনি ব্যবহার করতে পারেন let, তবে সত্যিকারের কেবল তখনই প্রয়োজন যদি আপনি কোনও পরিবর্তনশীলকে নির্দেশ করে এমন মান পরিবর্তন করতে যাচ্ছেন যা লুপ নিয়ন্ত্রণ / পুনরুক্তি ভেরিয়েবল এবং সংখ্যা এবং স্ট্রিংয়ের মতো সাধারণ প্রকারের জন্য অর্থবোধ করে তবে বেশিরভাগ অবজেক্টের ব্যবহারের জন্য নয় (অন্তর্ভুক্ত) অ্যারে)। আপনি যদি এমন কোনও বস্তু / অ্যারে চান যার বিষয়বস্তু পরিবর্তন করা যায় না, তবে constআপনার সাথে এটি ঘোষণার পাশাপাশি এটিতেও কল Object.freeze()করা উচিত ।
মার্ক রিড

1
constনতুন নয় var, letনতুনvar
ফ্যাকুন্ডো কলম্বিয়ার

84

ইএস 5 এ আদিমগুলিতে Object.freezeকাজ করে না, যা সম্ভবত constঅবজেক্টের চেয়ে বেশি সাধারণভাবে ঘোষণা করা হবে। আপনি ES6 এ আদিমগুলি হিমশীতল করতে পারেন, তবে তারপরে আপনার পক্ষে সমর্থনও রয়েছে const

অন্যদিকে constঅবজেক্টগুলি ঘোষিত করার জন্য তাদের "হিমায়িত" করে না, আপনি কেবল পুরো বস্তুটি পুনরায় ঘোষনা করতে পারবেন না, তবে আপনি এর কীগুলি অবাধে সংশোধন করতে পারেন। অন্যদিকে আপনি হিমায়িত অবজেক্টগুলিকে পুনরায় ঘোষণা করতে পারেন।

Object.freeze এছাড়াও অগভীর, যাতে আপনার এটি রক্ষা করতে পুনরাবৃত্তভাবে নেস্টেড জিনিসগুলিতে প্রয়োগ করতে হবে।

var ob1 = {
   foo : 1,
    bar : {
        value : 2   
    }
};
Object.freeze( ob1 );

const ob2 = {
   foo : 1,
    bar : {
        value : 2   
    }
}

ob1.foo = 4;  // (frozen) ob1.foo not modified
ob2.foo = 4;  // (const) ob2.foo modified

ob1.bar.value = 4;  // (frozen) modified, because ob1.bar is nested
ob2.bar.value = 4;  // (const) modified

ob1.bar = 4;  // (frozen) not modified, bar is a key of obj1
ob2.bar = 4;  // (const) modified

ob1 = {};  // (frozen) ob1 redeclared
ob2 = {}; // (const) ob2 not redeclared

এই ব্যাখ্যাটি এক ঝাড়ুতে আমার অনেক প্রশ্ন সাফ করেছে! সম্পর্কিত ob1.bar.value = 4; // (frozen) modified, because ob1.bar is nested: এটি কি পদ্ধতির সুযোগের কারণে?
ওয়াইকোড

14

সারসংক্ষেপ:

constএবং Object.freeze()সম্পূর্ণ ভিন্ন উদ্দেশ্যে পরিবেশন।

  • constএমন একটি ভেরিয়েবল ঘোষণার জন্য রয়েছে যা এখনই স্বীকৃত হতে হবে এবং পুনরায় নিয়োগ দেওয়া যাবে না। ঘোষিত ভেরিয়েবলগুলি constহ'ল ব্লক স্কোপড এবং ভেরিয়েবলগুলির মতো ঘোষিত ফাংশন নয়var
  • Object.freeze()এমন একটি পদ্ধতি যা কোনও বস্তুকে গ্রহণ করে এবং একই বস্তুকে প্রত্যাবর্তন করে। এখন অবজেক্টটির কোনও বৈশিষ্ট্য মুছে ফেলা বা কোনও নতুন বৈশিষ্ট্য যুক্ত করা যাবে না।

উদাহরণ const:

উদাহরণ 1: পুনরায় নিয়োগ দেওয়া যাবে না const

const foo = 5;

foo = 6;

নিম্নলিখিত কোডটি একটি ত্রুটি ছুঁড়েছে কারণ আমরা constকীওয়ার্ড দিয়ে ঘোষিত ভেরিয়েবল ফুকে পুনরায় নিয়োগের চেষ্টা করছি , আমরা এটিকে পুনরায় নিয়োগ দিতে পারি না।

উদাহরণ 2: নির্ধারিত ডেটা স্ট্রাকচারগুলি constপরিবর্তন করা যেতে পারে

const object = {
  prop1: 1,
  prop2: 2 
}

object.prop1 = 5;   // object is still mutable!
object.prop3 = 3;   // object is still mutable!

console.log(object);  // object is mutated

এই উদাহরণে আমরা constকীওয়ার্ডটি ব্যবহার করে একটি ভেরিয়েবল ঘোষণা করি এবং এটিতে একটি বিষয় বরাদ্দ করি। যদিও আমরা এই পরিবর্তনশীল নামক বস্তুকে পুনরায় সাইন করতে পারি না, আমরা বস্তুকে নিজেই পরিবর্তন করতে পারি। যদি আমরা বিদ্যমান বৈশিষ্ট্যগুলি পরিবর্তন করি বা নতুন বৈশিষ্ট্য যুক্ত করি তবে এটির কার্যকর হবে। আমাদের প্রয়োজন অবজেক্টে কোনও পরিবর্তন অক্ষম করতে Object.freeze()

উদাহরণ Object.freeze():

উদাহরণ 1: কোনও হিমায়িত বস্তুকে রূপান্তর করতে পারে না

object1 = {
  prop1: 1,
  prop2: 2
}

object2 = Object.freeze(object1);

console.log(object1 === object2); // both objects are refer to the same instance

object2.prop3 = 3; // no new property can be added, won't work

delete object2.prop1; // no property can be deleted, won't work

console.log(object2); // object unchanged

এই উদাহরণে যখন আমরা কল করি Object.freeze()এবং object1একটি আর্গুমেন্ট হিসাবে দেব তখন ফাংশনটি সেই বস্তুকে প্রত্যাবর্তন করে যা এখন 'হিমায়িত'। ===অপারেটরটি ব্যবহার করে আমরা যদি নতুন অবজেক্টের রেফারেন্সটি পুরানো অবজেক্টের সাথে তুলনা করি তবে আমরা লক্ষ্য করতে পারি যে তারা একই বস্তুকে বোঝায়। এছাড়াও আমরা যখন কোনও বৈশিষ্ট্য যুক্ত বা সরিয়ে দেওয়ার চেষ্টা করি তখন আমরা দেখতে পাই এটির কোনও প্রভাব নেই (কঠোর মোডে ত্রুটি নিক্ষেপ করবে)।

উদাহরণ 2: রেফারেন্স সহ অবজেক্টগুলি সম্পূর্ণ হিমায়িত নয়

const object = {
  prop1: 1,
  nestedObj: {
    nestedProp1: 1,
    nestedProp2: 2,
  } 
}


const frozen = Object.freeze(object);

frozen.prop1 = 5; // won't have any effect
frozen.nestedObj.nestedProp1 = 5; //will update because the nestedObject isn't frozen

console.log(frozen);

এই উদাহরণটি দেখায় যে নেস্টেড বস্তুর বৈশিষ্ট্যগুলি (এবং রেফারেন্স ডেটা স্ট্রাকচারের সাহায্যে অন্যান্য) এখনও পরিবর্তনযোগ্য । সুতরাং Object.freeze()রেফারেন্স (যেমন অ্যারে, অবজেক্টস) হিসাবে বৈশিষ্ট্যগুলি উপস্থিত থাকলে বস্তুটি পুরোপুরি 'হিমায়িত' করে না।


12
var obj = {
  a: 1,
  b: 2
};
Object.freeze(obj);
obj.newField = 3; // You can't assign new field , or change current fields

উপরের উদাহরণটি এটি সম্পূর্ণরূপে আপনার অবজেক্টকে অপরিবর্তনীয় করে তোলে।

নীচের উদাহরণটি দেখতে দিন।

const obj = {
  a: 1,
  b: 2
};
obj.a = 13; // You can change a field
obj.newField = 3; // You can assign new field.

এটি কোনও ত্রুটি দেয় না।

তবে আপনি যদি এরকম চেষ্টা করেন

const obj = {
      a: 1,
      b: 2
    };
obj = {
 t:4
};

এটি "আপত্তি কেবলমাত্র পঠনযোগ্য" এর মতো একটি ত্রুটি ফেলে দেবে।

আরেকটি ব্যবহারের কেস

const obj = {a:1};
var obj = 3;

এটা ফেলে দেবে Duplicate declaration "obj"

মোজিলা ডক্স কনস্টের ব্যাখ্যা অনুসারে

কনস্টের ঘোষণাটি একটি মানকে কেবল পঠনযোগ্য রেফারেন্স তৈরি করে। এর অর্থ এই নয় যে এটির মানটি অপরিবর্তনীয় , কেবলমাত্র ভেরিয়েবল আইডেন্টিফায়ারকে পুনরায় সাইন করা যায় না।

এই উদাহরণগুলি ব্যাবেলজ ইএস 6 বৈশিষ্ট্য অনুসারে তৈরি হয়েছে।


4

সরল হতে দিন।

তারা ভিন্ন ধরনের. কোডের মন্তব্যগুলি দেখুন, যা প্রতিটি ক্ষেত্রে ব্যাখ্যা করবে।

Const- এটি হ'ল ব্লক স্কোপ ভেরিয়েবলের মতো let, কোন মানটি পুনরায় ঘোষণা করতে পারে না, পুনরায় ঘোষিত হয়।

এর মানে

{
 const val = 10;  // you can not access it outside this block, block scope variable

}

console.log(val); // undefined because it is block scope 

const constvalue = 1;
constvalue = 2; // will give error as we are re-assigning the value;
const obj = { a:1 , b:2};

obj.a = 3;
obj.c = 4;
console.log(obj); // obj = {a:3,b:2,c:4} we are not assigning the value of identifier we can 
                  // change the object properties, const applied only on value, not with properties
obj = {x:1};     // error you are re-assigning the value of constant obj 
obj.a = 2 ;     // you can add, delete element of object

সম্পূর্ণ বোঝাপড়াটি হ'ল কনস্টটি ব্লক স্কোপ এবং এর মানটি পুনরায় বরাদ্দ করা হয় না।

Object.freeze: অবজেক্টের মূলের বৈশিষ্ট্যগুলি অপরিবর্তনীয়, এছাড়াও আমরা আরও বেশি বৈশিষ্ট্য যুক্ত করতে এবং মুছতে পারি না তবে আমরা পুরো বস্তুকে আবার সাইন করতে পারি।

var x = Object.freeze({data:1,
    name:{
    firstname:"hero", lastname:"nolast"
    }
});

x.data = 12;  // the object properties can not be change but in const you can do
x.firstname ="adasd"; // you can not add new properties to object but in const you can do

x.name.firstname = "dashdjkha"; // The nested value are changeable 

//The thing you can do in Object.freeze but not in const

x = { a: 1};  // you can reassign the object when it is Object.freeze but const its not allowed

// একটি জিনিস যা উভয়ের মধ্যে একই রকম, নেস্টেড অবজেক্টটি পরিবর্তনযোগ্য

const obj1 = {nested :{a:10}};
var obj2 =  Object.freeze({nested :{a:10}});

obj1.nested.a = 20; // both statement works
obj2.nested.a = 20;

ধন্যবাদ।

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