2015-10-14 5 views
41

Object.freeze() ईएस 6 में const का उपयोग करने की दिशा में स्थानांतरित करने के लिए एक संक्रमणकालीन सुविधा विधि की तरह लगता है।ऑब्जेक्ट.फ्रीज़() बनाम कॉन्स

क्या ऐसे मामले हैं जहां दोनों कोड में अपना स्थान लेते हैं या अपरिवर्तनीय डेटा के साथ काम करने का कोई पसंदीदा तरीका है?

क्या मुझे Object.freeze() का उपयोग करना चाहिए जब तक कि सभी ब्राउज़र मैं समर्थन const के साथ काम करता हूं, फिर इसके बजाय const का उपयोग करने के लिए स्विच करें?

+1

मैंने अपनी बिल्ड प्रक्रिया में [babeljs] (https://babeljs.io/docs/learn-es2015/) का उपयोग करने के लिए लिया है, इसलिए मैं मुख्य रूप से इन जैसे संगतता मुद्दों को अनदेखा कर सकता हूं। – spender

+8

नहीं - वे अलग-अलग चीजें करते हैं। कॉन्स पुन: असाइनमेंट रोकता है (उदाहरण के लिए आप x = 1 नहीं कर सकते; x = 2); फ्रीज उत्परिवर्तन रोकता है (उदाहरण के लिए आप ऑब्जेक्ट नहीं कर सकते हैं। फ्रीज़ (एक्स); x.a = 2); – joews

उत्तर

83

const और Object.freeze दो पूरी तरह से अलग चीज़ें हैं।

constबाइंडिंग ("चर") पर लागू होता है। यह एक अपरिवर्तनीय बाध्यकारी बनाता है, यानी आप बाध्यकारी को एक नया मान असाइन नहीं कर सकते हैं।मूल्यों पर

Object.freeze काम करता है, और अधिक विशेष रूप से, वस्तु महत्व देता है। यह एक वस्तु अपरिवर्तनीय बनाता है, यानी आप इसकी गुणों को बदल नहीं सकते हैं।

+1

मूल रूप से, 'const' नया' var' है; यह सिर्फ ब्लॉक-स्कॉप्ड है और पुन: असाइनमेंट रोकता है। आप 'let' का उपयोग कर सकते हैं, लेकिन वास्तव में केवल तभी आवश्यकता है जब आप एक वैरिएबल पॉइंट्स को उस मान को बदलने जा रहे हैं, जो लूप कंट्रोल/इटरेटर वैरिएबल और सरल प्रकारों जैसे संख्याओं और तारों के लिए समझ में आता है, लेकिन अधिकांश उपयोगों के लिए नहीं वस्तुओं (सरणी सहित)। यदि आप एक ऑब्जेक्ट/सरणी चाहते हैं, जिसकी सामग्री को बदला नहीं जा सकता है, तो उसे 'कॉन्स्ट' के साथ घोषित करने के अलावा आपको 'ऑब्जेक्ट.फ्रीज़()' पर भी कॉल करना चाहिए। –

33

ईएस 5 Object.freeze प्राइमेटिव्स पर काम नहीं करता है, जो शायद ऑब्जेक्ट्स की तुलना में const का उपयोग करके अधिक सामान्य रूप से घोषित किया जाएगा। आप ईएस 6 में प्राइमेटिव को फ्रीज कर सकते हैं, लेकिन फिर आपके पास 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 
4
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 
}; 

तरह का प्रयास करें ऐसा एक त्रुटि "obj केवल पढ़ने के लिए" फेंक देते हैं।

एक और उपयोग के मामले

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

यह Duplicate declaration "obj"

फेंक होगा इसके अलावा mozilla डॉक्स const स्पष्टीकरण

स्थिरांक घोषणा एक मूल्य के केवल पढ़ने के लिए संदर्भ बनाता है के अनुसार। यह का मतलब यह नहीं है कि यह मान अपरिवर्तनीय है, केवल परिवर्तनीय पहचानकर्ता को फिर से असाइन नहीं किया जा सकता है।

यह उदाहरण babeljs ES6 सुविधाओं के अनुसार बनाए गए हैं।

संबंधित मुद्दे