2010-08-03 12 views
10

किसी कारण के लिए (मैथ में var i) {console.log (i)} जावास्क्रिप्ट में अपेक्षित तन, कॉस, एटान 2, ई, पीआई नहीं दिखाता है।क्यों (मैथ में var i) मैथ के माध्यम से पुनरावृत्ति नहीं करता है। * जावास्क्रिप्ट में?

उत्तर

14

क्योंकि Math एक ऐसी वस्तु में निर्मित है जिसका गुण ध्वजांकित किया गया है गैर-गणना योग्य। ऑब्जेक्ट्स में निर्मित कई लोगों में यह व्यवहार होता है, यही कारण है कि for..in के साथ एक सरणी पर लूपिंग आपको Array.prototype उपयोगकर्ता फ़ंक्शंस के साथ विस्तारित नहीं किया जाता है, जो डिफ़ॉल्ट रूप से हमेशा गणना योग्य होते हैं।

हाल ही में गैर-गणना योग्य एक आंतरिक संपत्ति नियमित जावास्क्रिप्ट कोड द्वारा उपलब्ध नहीं थी। हालांकि ईएमसीएस्क्रिप्ट 5 Object.defineProperty() के माध्यम से किसी भी ऑब्जेक्ट प्रॉपर्टी की गणना और लिखने योग्यता (Math.PI के मान को बदलने का प्रयास करने की क्षमता निर्दिष्ट करता है।

यह Object.getOwnPropertyNames() भी प्रदान करता है ताकि किसी वस्तु के सभी गुणों की सूची प्राप्त करने के लिए उनकी गणना की जा सके।

Object.getOwnPropertyNames(Math); 

//returns 
["LN10", "PI", "E", "LOG10E", "SQRT2", "LOG2E", "SQRT1_2", "LN2", "cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"] 

सुदूर के रूप में मैं जानता हूँ कि केवल ब्राउज़र वर्तमान में इन कार्यों का समर्थन करने वाले क्रोम और सफारी कर रहे हैं। फ़ायरफ़ॉक्स को संस्करण 4 पर इसका समर्थन करना चाहिए। आईई 9 मुझे यकीन नहीं है, लेकिन माइक्रोसॉफ्ट ने कहा है कि वे अंततः ईएमसीएस्क्रिप्ट 5 मानक का समर्थन करना चाहते हैं।

मुझे विश्वास नहीं है कि स्पष्ट कार्यक्षमता के बिना जावास्क्रिप्ट दुभाषियों में इस कार्यक्षमता को अनुकरण करने का कोई तरीका है।

5

के रूप में सबसे अधिक निर्मित जावास्क्रिप्ट में वस्तुओं, गुण और Math वस्तु के तरीकों ECMAScript कल्पना (खंड 15.8.1) (स्क्रिप्ट के लिए दुर्गम) DontEnum विशेषता के माध्यम से गणनीय नहीं होने के रूप में परिभाषित किया गया है। ECMAScript 5 में, आप गैर गणनीय भी होने के रूप में गुण और अपने खुद के वस्तुओं के तरीकों चिह्नित कर सकते हैं:

var o = {}; 

Object.defineProperty(o, "p", { 
    enumerable: false, 
    value: 1 
}); 

Object.defineProperty(o, "q", { 
    enumerable: true, 
    value: 2 
}); 

for (var i in o) { 
    console.log(i + "=>" + o[i]); 
} 
// q=>2 
+1

मुझे आश्चर्य है कि क्यों ... – You

2

उन गुणों को गैर गणनीय हैं।

the MDC documentation on for..in से

:

एक के लिए ... पाश में गुण में निर्मित से अधिक पुनरावृति नहीं है।

नए जावास्क्रिप्ट कार्यान्वयन में आप अपनी गैर-गणना योग्य गुण बना सकते हैं। propertyIsEnumerable() और Object.defineProperty() देखें।

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