गणना करने योग्य क्या है?


151

मुझे MDN के for..in पृष्ठ पर निर्देशित किया गया था जब उसने कहा था, "for..in किसी वस्तु के असंख्य गुणों के बारे में बताता है।"

फिर मैं संपत्तियों की संपत्तियों की संपुष्टि और स्वामित्व पर गया, जहाँ उन्होंने कहा था कि "अनुरक्त गुण वे हैं जिन्हें for..in लूप द्वारा पुनरावृत्त किया जा सकता है।"

शब्दकोश गणना के रूप में असंख्य को परिभाषित करता है, लेकिन मैं वास्तव में कल्पना नहीं कर सकता कि इसका क्या मतलब है। क्या मुझे किसी चीज़ की कल्पना की जा सकती है?


क्या आप समझते हैं कि क्या for-inकरता है?

मुझे मिले जवाब से for..in कथन के उपयोग के लिए किसी वस्तु के सभी प्राप्य गुणों को उपलब्ध कराने की अनुमति देता है
पैट्रिक

6
सबसे सरल अर्थ है: एक संपत्ति एक for inलूप द्वारा उत्पादित की जाएगी या नहीं (उन लोगों के लिए जो विवरण जानना नहीं चाहते हैं और बस परवाह नहीं करते हैं;))
टॉमस रेजिया

जवाबों:


158

एक प्राप्य संपत्ति वह है जिसे for..inलूप के दौरान शामिल किया जा सकता है (या गुणों का एक समान पुनरावृत्ति, जैसे Object.keys())।

यदि किसी संपत्ति की पहचान योग्य नहीं है, तो लूप इस बात को नजरअंदाज कर देगा कि यह वस्तु के भीतर है।

var obj = { key: 'val' };

console.log('toString' in obj); // true
console.log(typeof obj.toString); // "function"

for (var key in obj)
    console.log(key); // "key"

किसी गुण की पहचान उसके [[Enumerable]]गुण के आधार पर की जाती है या नहीं । आप इसे संपत्ति के विवरणक के भाग के रूप में देख सकते हैं :

var descriptor = Object.getOwnPropertyDescriptor({ bar: 1 }, 'bar');

console.log(descriptor.enumerable); // true
console.log(descriptor.value);      // 1

console.log(descriptor);
// { value: 1, writable: true, enumerable: true, configurable: true }

एक for..inलूप तब ऑब्जेक्ट के प्रॉपर्टी नामों के माध्यम से प्रसारित होता है।

var foo = { bar: 1, baz: 2};

for (var prop in foo)
    console.log(prop); // outputs 'bar' and 'baz'

लेकिन, केवल उसके बयान का मूल्यांकन करता है - console.log(prop);इस मामले में - उन गुणों के लिए जिनकी [[Enumerable]]विशेषता है true

यह स्थिति इसलिए है क्योंकि वस्तुओं में कई गुण हैं , विशेषकर विरासत से :

console.log(Object.getOwnPropertyNames(Object.prototype));
// ["constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", /* etc. */]

इनमें से प्रत्येक गुण अभी भी वस्तु पर मौजूद है :

console.log('constructor' in foo); // true
console.log('toString' in foo);    // true
// etc.

लेकिन, वे for..inलूप द्वारा छोड़े गए हैं क्योंकि वे असंख्य नहीं हैं।

var descriptor = Object.getOwnPropertyDescriptor(Object.prototype, 'constructor');

console.log(descriptor.enumerable); // false

इसलिए कंस्ट्रक्टर की संपत्ति गैर-गणना योग्य है क्योंकि यह for..in लूप में दिखाई नहीं देता है। हालांकि बार या बाज जैसी संपत्तियों के नाम नाममात्र हैं क्योंकि आप हर एक को ऑब्जेक्ट से सांत्वना देने में सक्षम थे?
पैट्रिक

5
यह पूरी तरह से सही नहीं है But, they are skipped (or not counted) by the for..in loop because they are not enumerable:। Object.prototypeवास्तव में गुणों को नजरअंदाज किया जाता है क्योंकि वे प्रोटोटाइप श्रृंखला में आगे हैं, इसलिए नहीं कि वे गणना करने योग्य नहीं हैं। न तो getOwnPropertyNames()या keys()गुण है कि खुद एक वस्तु की नहीं हैं दिखा। एक साइड नोट के रूप में, यह सच है कि कई अंतर्निहित संपत्तियां असंख्य नहीं हैं और इस प्रकार से नहीं दिखाई देंगी keys(), लेकिन यदि आप प्रोटोटाइप श्रृंखला को आगे बढ़ाना चाहते हैं तो आपको अतिरिक्त कोड लिखना होगा।
मैग्नस

शाब्दिक रूप से, गणना करने योग्य का अर्थ है
क्रिश्चियन मैथ्यू

49

यदि आप किसी वस्तु के माध्यम से myObj = {foo: 'bar'}या किसी चीज को बनाते हैं , तो सभी गुण उल्लेखनीय हैं। इतना आसान सवाल पूछना है, क्या नहीं है? कुछ वस्तुओं में कुछ गैर-गुणांक गुण होते हैं, उदाहरण के लिए यदि आप कॉल करते हैं Object.getOwnPropertyNames([])(जो कि सभी गुणों की श्रेणी देता है, गणना योग्य है या नहीं, [] पर), तो यह वापस आ जाएगा ['length'], जिसमें एक सरणी की गैर-असंख्य संपत्ति शामिल है, 'लंबाई' ।

आप कॉल करके अपनी खुद की नॉन-एन्युमरेबल प्रॉपर्टी बना सकते हैं Object.defineProperty:

var person = { age: 18 };
Object.defineProperty(person, 'name', { value: 'Joshua', enumerable: false });

person.name; // 'Joshua'
for (prop in person) {
  console.log(prop);
}; // 'age'

यह उदाहरण जावास्क्रिप्ट में गैर-विलुप्त होने वाली संपत्तियों से बहुत अधिक उधार लेता है , लेकिन एक वस्तु को खत्म होने पर दिखाया जाता है। गुण या तो लेखन योग्य हो सकते हैं या नहीं, कॉन्फ़िगर करने योग्य, या गणना करने योग्य। जॉन रेजिग ने ECMAScript 5 ऑब्जेक्ट्स और प्रॉपर्टीज के दायरे में इस पर चर्चा की ।

और, इस बारे में एक ढेर अतिप्रवाह सवाल है कि आप संपत्तियों को कभी गैर-योग्य क्यों बनाना चाहते हैं


हम्म, अपवोट और डाउनवोट दोनों। निश्चित रूप से, अगर इस उत्तर के बारे में कुछ भी है जो मूल्यहीन है, तो कृपया यहां एक टिप्पणी जोड़ें।
कारपेलीम

1
एक अन्य उत्तर ने यह लिखा: var o = {}; o ['फू'] = 0; // enumerable, normal Object.defineProperty (o, 'bar', {value: 1}); // nonenumerable, अजीब क्यों स्पष्ट रूप से enumerable जोड़ें: गलत?
पैट्रिक

5
@ पैट्रिक, मैंने इसे यहाँ आंशिक रूप से शामिल किया ताकि यह उदाहरण से स्पष्ट हो कि यह एक विकल्प है, लेकिन आपके दर्शकों के आधार पर, स्पष्ट होना एक ठोस निर्णय हो सकता है ताकि यह आपके कोड पढ़ने वाले किसी भी व्यक्ति के लिए स्पष्ट हो।
कार्पेलियम जू

@carpeliam इस संक्षिप्त और बहुत स्पष्ट स्पष्टीकरण के लिए धन्यवाद, जब तक मैं आपके माध्यम से नहीं चला गया, मुझे इसका जवाब नहीं मिला: D
sandeepKumar

37

यह किसी चीज़ की तुलना में बहुत अधिक उबाऊ है जिसकी कल्पना की जानी चाहिए।

शाब्दिक रूप से सभी गुणों पर एक विशेषता है, जिसे "गणना करने योग्य" कहा जाता है। जब यह झूठी for..inविधि के लिए सेट किया जाता है तो वह संपत्ति छोड़ देगा, दिखावा यह मौजूद नहीं है।

ऑब्जेक्ट पर बहुत सारी संपत्तियां हैं जिनके पास "गणना योग्य" झूठे हैं, जैसे "valueOf" और "hasOwnProperty," क्योंकि यह माना जाता है कि आप नहीं चाहते हैं कि जावास्क्रिप्ट इंजन उन पर पुनरावृत्ति करे।

आप Object.definePropertyविधि का उपयोग करके अपने स्वयं के गैर-गुण पैदा कर सकते हैं :

  var car = {
    make: 'Honda',
    model: 'Civic',
    year: '2008',
    condition: 'bad',
    mileage: 36000
  };

  Object.defineProperty(car, 'mySecretAboutTheCar', {
    value: 'cat pee in back seat',
    enumerable: false
  });

अब, तथ्य यह है कि कार के बारे में एक रहस्य भी छिपा हुआ है। बेशक वे अभी भी सीधे संपत्ति तक पहुंच सकते हैं और जवाब पा सकते हैं:

console.log(car.mySecretAboutTheCar); // prints 'cat pee in back seat'

लेकिन, उन्हें यह जानना होगा कि संपत्ति पहले मौजूद है, क्योंकि यदि वे इसके माध्यम से पहुंचने की कोशिश कर रहे हैं for..inया Object.keysयह पूरी तरह से गुप्त रहेगा:

console.log(Object.keys(car)); //prints ['make', 'model', 'year', 'condition', 'mileage']

उन्हें बस इसे कॉल करना चाहिए था, "forInAble।"


5
उस अंतिम पंक्ति के लिए अपवित्र - मुझे लगता है कि अगर इसे वास्तव में forInAble कहा जाता तो कोई भी इसके बारे में नहीं पूछ रहा होता। कौन सा मेरे सवाल को लाता है - क्यों हैं आप गणनीय नहीं होने के लिए एक गुण सेट (या तुम क्यों करना होगा)? किसी सरणी की लंबाई संपत्ति का उपयोग अक्सर गैर-संपत्ति के उदाहरण के रूप में किया जाता है, लेकिन आप इसे केवल गणना योग्य (जावास्क्रिप्ट प्रतिबंध नहीं है, मेरा मतलब है, क्यों यह जावास्क्रिप्ट में गणना करने योग्य नहीं करने के लिए सेट किया गया था प्रथम स्थान)?
क्रिस

मेरे सवाल को स्पष्ट करने के लिए, यह क्यों तय किया गया था कि निम्नलिखित एक विकल्प नहीं था: बनाओ: होंडा मॉडल: नागरिक रहस्य: बिल्ली पेशाब की लंबाई: 12
क्रिस

हम्मम ... मुझे अपने सवाल का जवाब मिल गया होगा। Google खोज के लिए "एन्यूमरेटेड डेटा प्रकारों से आपका क्या मतलब है?" प्रगणित डेटा में मूल्यों का एक सीमित सेट होता है। एक एन्यूमरेटेड डेटा प्रकार में वे मान होते हैं जो आप उस प्रकार, या प्रगणित मानों के लिए अनुमति देते हैं। पूर्णांक-आधारित एन्यूमरेटेड प्रकारों के लिए, प्रत्येक एन्यूमरेटेड वैल्यू में एक नाम और एक अंतर्निहित न्यूमेरिकल वैल्यू होती है। यदि मैं सही तरीके से समझूं, क्योंकि अनंत संख्या में संभावित लंबाई हैं, तो आपको अनंत संख्या में नाम, एक नाम असाइन करना होगा। प्रत्येक लंबाई के लिए। क्या वो सही है?
क्रिस

ठीक है, अपने पहले प्रश्न को संबोधित करते हुए, किसी वस्तु पर गैर-विलुप्त संपत्ति स्थापित करना थोड़ा हैकिती है, क्योंकि एकमात्र तरीका आपको यह पता लगाने में सक्षम होगा कि उस वस्तु को कोड को देखने के लिए कोड कोड के रूप में क्या होगा? इसे दफन किया जा सकता है। इसलिए, आम तौर पर, आप इसका उपयोग नहीं करना चाहेंगे। '.Length' के बारे में जो एक स्ट्रिंग में तत्वों या तत्वों की संख्या देता है, बस कुछ ऐसा है जो माना जाता है कि हम शामिल नहीं करना चाहते हैं यदि हम 'के लिए ...' का उपयोग कर रहे हैं। उत्तर नहीं दे सकते कि जेएस के देवताओं ने इसे आवश्यक रूप से क्यों बनाया। हमारी समझ से परे उनके कारण ( अहम ) राय हैं।
गेब्रियल कुंकेल

... और मुझे नहीं लगता कि मैं एन्युमरेट किए गए डेटा प्रकारों के बारे में आपके दूसरे प्रश्न का उत्तर दे सकता हूं, हालांकि ऐसा लगता है कि अगर मेरे पास समय था तो मैं कुछ समय के लिए इसे चबा सकता हूं। :-)
गैब्रियल कुंकेल

9

यदि आपको यह कल्पना करने में कठिनाई हो रही है कि "इसका क्या मतलब है? अपने आप से क्यों न पूछें, इसका क्या मतलब है कि असाध्य होना चाहिए ?

मुझे लगता है कि यह थोड़ा सा इस तरह है, एक nonenumerable संपत्ति मौजूद है लेकिन आंशिक रूप से छिपा हुआ है ; इसका मतलब यह है कि nonenumerable अजीब है। अब आप कल्पना कर सकते हैं कि क्या बचा है - जब से हमने वस्तुओं की खोज की है, तब से अधिक प्राकृतिक संपत्ति का उपयोग हम मुठभेड़ के लिए कर रहे हैं । विचार करें

var o = {};
o['foo'] =  0;                               // enumerable, normal
Object.defineProperty(o, 'bar', {value: 1}); // nonenumerable, weird

अब एक में for..in, यह pseudocode की तरह कल्पना करो

for property in o:
    if not property enumerable continue // skip non-enumerable, "bar"
    else do /* whatever */              // act upon enumerable, "foo"

आपके द्वारा जावास्क्रिप्ट में टाइप किए गए लूप का स्थान किस स्थान पर है/* whatever */


8

मैं ENUMERABLE की एक पंक्ति की परिभाषा लिखूंगा

Enumerable: निर्दिष्ट करता है कि संपत्ति को लूप में / के लिए वापस किया जा सकता है या नहीं।

var obj = {};
Object.defineProperties(obj, {
    set1: {enumerable: true},
    set2: {enumerable: false},
});
Object.keys(obj); // ["set1"]
Object.getOwnPropertyNames(obj); // ["set1", "set2"]

0

विधियाँ गणना करने योग्य नहीं हैं; या बल्कि तरीकों में बनाया यद्यपि क्या खोजने के बाद .. नहीं हैं गणनीय जावा स्क्रिप्ट का मतलब; यह सिर्फ एक संपत्ति विशेषता को संदर्भित करता है .. ecma3 में सभी बनाई गई वस्तुएँ असंख्य हैं, और ecma5 u अब इसे परिभाषित कर सकती हैं .... यही है ..: D lol मुझे उत्तर खोजने में थोड़ा सा लगा; लेकिन मुझे विश्वास है कि डेविड फ्लानगन की पुस्तक में इसके बारे में बात की गई है। इसलिए मुझे लगता है कि इसका मतलब "छिपा हुआ" है, या नहीं "छिपा हुआ" उस तरीकों में लूप के लिए नहीं दिखाया गया है, और इस प्रकार "छिपा हुआ" है


0

एनम डेटा प्रकार के बारे में सोचें, बस वस्तुओं की एक संरचना जो विभिन्न संख्याओं के अनुरूप है। किसी वस्तु को एक घोषित करने योग्य घोषित करने के लिए यह घोषित करना होगा कि वह एक विशिष्ट संख्या से मेल खाती है, जिससे उसे एक ऐसे शब्दकोश में जगह दी जा सके जो किसी वस्तु के गणना योग्य घटकों का प्रतिनिधित्व करता हो। बस इसे लगाने के लिए, किसी ऑब्जेक्ट को एन्यूमरेबल बनाना, कंपाइलर को बताने के समान है, "अरे, यह प्रॉपर्टी मायने रखती है, मैं इसे तब देखना चाहता हूं जब मैं इस ऑब्जेक्ट पर डेटा की जांच करूं।"


0

अंतर्निहित तरीके जो ऑब्जेक्ट्स को विरासत में मिलाते हैं, वे अनगिनत नहीं होते हैं, लेकिन आपके कोड ऑब्जेक्ट्स में जो गुण शामिल होते हैं, वे गणना योग्य होते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.