javascript - Array prototype available in forEach -
मेरे पास Array.find () के लिए एक polyfill है P> मैं वर्तमान में परीक्षण कर रहा हूँ ब्राउज़र इसके लिए समर्थन नहीं है इसलिए polyfill चलता है और फ़ंक्शन के अनुसार हालांकि मेरे पास एक प्लगइन है जिस पर एक सरणी पर मैं
foreach पास करता हूं और उसमें अंतिम तत्व फ़ंक्शन है
ढूंढें ।
यह क्यों हो रहा है?
इसके अलावा, जब मैं क्रोम के डेवलपर्स में सरणी का निरीक्षण करता हूं तो मुझे निम्नलिखित मिलता है।
यदि (! Array.find) {$ ('& lt; h5 & gt; यह ब्राउज़र ऐरे का समर्थन नहीं करता है। & Lt; / h5 & gt;')। अनुलग्नक ('शरीर'); } If (! Array.prototype.find) {Array.prototype.find = function (predicate) {if (this == null) {new TypeError ('Array.prototype.find' को रिक्त या अपरिभाषित कहा जाता है); } अगर (प्रकार का वास्तविकता! == 'फ़ंक्शन') {नया प्रकार त्रुटि ('विधेय एक फ़ंक्शन होना चाहिए'); } Var list = ऑब्जेक्ट (यह); Var लंबाई = list.length & gt; & gt; & gt; 0; Var thisArg = तर्क [1]; Var मान; के लिए (var i = 0; i & lt; लंबाई; i ++) {value = सूची [i]; अगर (predicate.call (यह एआरआर, मान, आई, सूची)) {वापसी मूल्य; }} वापसी अनिर्धारित; }; } Var someArray = [{नाम: 'कुछ'}, {नाम: 'कुछ और'}]; SomeArray.forEach (फ़ंक्शन (आइटम, इंडेक्स) {$ ('& lt; h4 & gt;' + item.name + '& lt; / h4 & gt;')। अनुलग्नक ('शरीर');}); Var विस्तारित = $। विस्तार ({}, [], कुछ अर्रे); $ .ईईच (विस्तारित, कार्य (इंडेक्स, आइटम) {$ ('& lt; h4 & gt;' + item.name + '& lt; / h4 & gt;')। अनुलग्नक ('शरीर');}); If (expanded.find) {$ ("& lt; div & gt; ध्यान दें कि हमने अब फ़ंक्शन खोज को बढ़ा दिया है; div & gt;")। अपेंडटॉ ('बॉडी'); } & lt; script src = "https://ajax.googleapis.com/ajax/libs/ Jquery / 2.1.1 / jquery.min.js "& gt; & lt; / स्क्रिप्ट & gt;
ध्यान दें कि ढूंढें में __ प्रोटो __ एक गहरा छाया है अन्य proto के मुकाबले गुलाबी
कोई भी विचार?
आपका foreach एक्सटेंशन है कुंजियों की जांच करना, लेकिन जांच न करना कि वे वस्तु के खुद-गुण हैं। वह यह है, यह कोड:
Array.prototype.x = 3; Var परीक्षण = [1]; (परीक्षण में var कुंजी) {console.log (कुंजी); } ... दोनों 0 और x लॉग करेंगे क्योंकि x में एक महत्वपूर्ण कुंजी है < कोड> [] जो [] की अपनी संपत्ति नहीं है इसे ठीक करने के लिए आप या तो अपनी खुद की संपत्तियों की जांच के लिए foreach कोड को पैच कर सकते हैं:
Array.prototype.x = 3; Var परीक्षण = [1]; (परीक्षण में var कुंजी) {if (test.hasOwnProperty (key)) {console.log (कुंजी); }} या आप जिस तरह से प्रोटोटाइप पर कुंजी डालते हैं उसे बदल सकते हैं, ताकि प्रोटोटाइप पर अन्य चाबियों की तरह, यह गणनीय नहीं है। संशोधित पयॉफ़िल होगा:
(function () {// स्कोप ब्रैकेट; वैश्विक क्षेत्र से 'खोज' को छिपाता है। फ़ंक्शन मिलते हैं (विदग्ध) {यदि (यह == रिक्त) {नया TypeError ('Array.prototype.find को रिक्त या अपरिभाषित' पर कॉल किया गया है);} यदि (प्रकार का विधेय! == 'फ़ंक्शन') {नया प्रकार त्रुटि ('विधेय एक फ़ंक्शन होना चाहिए');} var list = Object (this) , लंबाई = list.length & gt; & gt; & gt; 0, thisArg = तर्क [1], मूल्य, i; के लिए (i = 0; i & lt; लंबाई; i ++) {मूल्य = सूची [i]; कॉल (यह एआरआर, वैल्यू, आई, लिस्ट)) {रिटर्न वैल्यू;}} रिटर्न अपरिभाषित;}; अगर (! ऐरे.प्रोटोटाइप.फंड) {if (ऑब्जेक्ट.डिफ़िनप्रॉपर्टी) {ऑब्जेक्ट.डिफ़िनप्रॉपर्टी (अर्रे.प्रोटोटाइप, 'ढूंढें' , {Value: find, enumerable: false});} else {Array.prototype.find = find}}}} ()); यदि आपका ब्राउज़र Array.prototype.find का समर्थन नहीं करता है, तो यह एक मौका है कि वह Object.defineProperty , पहले ही उसी स्थान पर वापस जाने से पहले। तो आपको उम्मीद करनी होगी कि यह इतना पुराना नहीं है कि इसमें .hasOwnProperty () परीक्षण नहीं है, और आपको foreach फ़ंक्शन को संशोधित करने की आवश्यकता होगी। ( Array.prototype.find () फ़ंक्शन ECMAScript 6 ड्राफ्ट का हिस्सा है; Object.defineProperty () को ECMAScript 5.1 में मानकीकृत किया गया था, जबकि Object.prototype .hasOwnProperty () ECMAScript 3. ES5.1 2011 में जारी किया गया था, जब तक कि आपका ब्राउज़र केवल एक दो साल पुराना है, ऊपर आपके लिए काम करना चाहिए - विशेष रूप से यदि आप वर्तमान ओपेरा का उपयोग कर रहे हैं या IE, उन में नया ES6 .find () नहीं है, लेकिन उनके पास Object.defineProperty है।
Comments
Post a Comment