5

के लिए ब्राउज़र विशिष्ट या अंतर्निहित है, मैंने जेएस में थोड़ा range फ़ंक्शन जोड़ा है। मैंने क्रोम 1 9, एफएफ, और आईई (7-9) में इसका परीक्षण किया है और यह अच्छी तरह से काम कर रहा है। मुझे प्रश्न while कथन के साथ करना है।जावास्क्रिप्ट का नियंत्रण प्रवाह संरचना: जेएस

function range(from,to,step) 
{ 
    'use strict'; 
    var sCode,eCode,result; 
    result = []; 
    step = (!step || isNaN(step) || step === 0 ? 1 : step); 
    sCode = (''+from).charCodeAt(0); 
    eCode = (''+to).charCodeAt(0); 
    step *= (sCode > eCode && step > 0 ? -1 : 1); 
    do 
    { 
     if (String.fromCharCode(sCode)) 
     { 
      result.push(String.fromCharCode(sCode)); 
     } 
    }while((step > 0 && eCode >= (sCode+=step)) || (step < 0 && eCode <= (sCode+=step))); 
    return result; 
} 

मुझे कुछ समय पहले एक प्रश्न पढ़ना याद है कि जेएस नियंत्रण प्रवाह संरचनाओं और तार्किक ऑपरेटरों को कैसे नियंत्रित करता है। मुझे लगता है कि यह जांचने के साथ कुछ करना था कि किसी ऑब्जेक्ट की एक निश्चित विधि थी, और यदि ऐसा है, तो इसका रिटर्न वैल्यू (if (event.returnValue && e.returnValue === true) सामान) का उपयोग करना।
मुझे लगता है कि सवाल किसी भी अधिक जानकारी प्राप्त नहीं कर पा रहे हैं, यहाँ है कि मैं क्या जानना चाहता था है:

while((step > 0 && eCode >= (sCode+=step)) || (step < 0 && eCode <= (sCode+=step))); 

समारोह बर्ताव करता है के बाद से के रूप में मैं यह करना चाहता हूँ, मुझे लगता है कि मैं कर रहा हूँ सही कह रही है कि, step < 0 है अगर में झूठी, && eCode >= (sCode+=step) को अनदेखा किया जाएगा, sCode के मूल्य को अपरिवर्तित छोड़ दिया जाएगा।
जब step चेक सत्य है, sCode इन/कमी होगी। मैंने इस असाइनमेंट को ब्रैकेट में रखा है, यह सुनिश्चित करने के लिए कि sCode का नया असाइन किया गया मान eCode से तुलना की जाएगी। दोबारा, मुझे लगता है कि ब्रैकेट लॉजिकल ऑपरेटर पर असाइनमेंट को प्राथमिकता देंगे।

यह सभी ब्राउज़र के लिए यह सच है, या यह ब्राउज़र कुछ हद तक विशिष्ट है? क्या कोई मौका है कि यह फ़ंक्शन कुछ ब्राउज़र में sCode के मूल्य में वृद्धि (या कमी) करेगा?
इस मामले में, यह महत्वपूर्ण नहीं है (किसी भी मुद्दे को रोकने के लिए यह एक आसान फिक्स है)। लेकिन मैं जानना चाहता हूं कि यह व्यवहार जावास्क्रिप्ट के लिए या ब्राउज़र कार्यान्वयन के लिए निहित है या नहीं।


इसे दूर पढ़ने के लिए धन्यवाद। आप
अन्य चीजों के एक जोड़े को कोई आपत्ति नहीं है (महत्वपूर्ण नहीं है, लेकिन बस सोच):

  • जावास्क्रिप्ट में अधिकतम charCode क्या है? Google पर एक त्वरित रूप ने मुझे नहीं बताया, और जेएस कंसोल में परीक्षण करने के लिए मुझे विश्वास है कि यह 5999999999989759 था जो लगभग अविश्वसनीय लगता है, लेकिन फिर मुझे अपने चीनी पर ब्रश करने की आवश्यकता हो सकती है।
  • जब from अपरिभाषित है, (jslint अनुमोदित) दृष्टिकोण from.toString().charCodeAt(0); विफल रहता है, जाहिर है, undefined कोई toString विधि, क्यों करता है, (''+from).charCodeAt(0); वापसी U सभी एक ही था, क्योंकि? मैंने सोचा कि इसे पूरी तरह से toString विधि कहा जाता है?
+0

"कह रही है कि, अगर' चरण <0' गलत है में ... "मुझे लगता है कि आप का मतलब' चरण <0' संपादन मेरी टिप्पणी: शानदार सवाल। मैं इसके साथ मुद्दों/परेशानियों में भाग गया (शायद मैंने आपके द्वारा वर्णित मूल प्रश्न पोस्ट किया है)। मुझे परीक्षण का _lot_ करना याद है। मैं यह देखने जा रहा हूं कि क्या मैं जेएस स्पेक में यह जानकारी पा सकता हूं। – taz

+0

@taz, नहीं ... मैं माफी चाहता हूँ, लेकिन मैं एक कठिन समय शुक्रवार पर ध्यान केंद्रित किया है: मैं का मतलब है कि, जब तार्किक जांच के पहले भाग (किया जा रहा है 'चरण <0') false_ को _evaluates, दूसरे भाग 'eCode> = ... 'को अनदेखा कर दिया जाएगा। मानों के साथ उदाहरण '((-1> 0 && 3> = (15 + = - 1)) || ...' भाग '&& 3> = (15 + = - 1)' को अनदेखा कर दिया जाएगा, क्योंकि ' -1> 0' किसी भी तरह झूठा है –

+0

मुझे वास्तव में शॉर्ट सर्किट मूल्यांकन के लिए कोई चश्मा नहीं दिखता है (http://ecma-international.org/ecma-262/5.1/#sec-11 देखें) मुझे कुछ साल पहले याद आया एक स्थिति है जिसमें इस व्यवहार ब्राउज़रों में अनुरूप नहीं था सोच मैंने पाया लेकिन मुझे याद नहीं है का परिणाम क्या रहा – taz

उत्तर

2

मुझे लगता है कि सही कह रही है कि, अगर step < 0 गलत है, && eCode >= (sCode+=step) नजरअंदाज कर दिया जाएगा, sCode अपरिवर्तित

सही का मूल्य छोड़ने में मैं कर रहा हूँ। यदि पहला ऑपरेंड झूठा मूल्यांकन करता है, तो दूसरे ऑपरेंड का मूल्यांकन नहीं किया जाएगा।

चरण जांच सही होने के बाद, एसकोड में/कमी हो जाएगी। मेरे पास है लेकिन यह असाइनमेंट ब्रैकेट में है, यह सुनिश्चित करने के लिए कि नए असाइन किए गए एसकोड के मान की तुलना ईकोड से की जाएगी। दोबारा, मुझे लगता है कि ब्रैकेट लॉजिकल ऑपरेटर पर असाइनमेंट को प्राथमिकता देंगे।

फिर से सही करें, लेकिन असाइनमेंट के आसपास कोष्ठक की आवश्यकता है, क्योंकि असाइनमेंट की तुलना में lower precedence है।

इस सभी ब्राउज़रों के लिए सच है?

हां। अगर आपको ऐसा लगता है जो इस तरह से व्यवहार नहीं करता है तो मुझे अविश्वसनीय रूप से आश्चर्यचकित किया जाएगा।

जब from अपरिभाषित है, (jslint अनुमोदित) दृष्टिकोण from.toString().charCodeAt(0); विफल रहता है, क्योंकि जाहिर है, अपरिभाषित कोई toString विधि, क्यों करता है, (''+from).charCodeAt(0); वापसी यू सभी एक ही था?

क्योंकि यह खाली स्ट्रिंग के साथ from के मान को जोड़ता है। from का मूल्य undefined, जो coerced to a string है है, और आप स्ट्रिंग "अनिर्धारित", और कहा कि स्ट्रिंग के सूचकांक 0 में चरित्र के साथ खत्म हो "यू" है।

+0

धन्यवाद जेम्स। हालांकि, 'से' को संयोजित करने के उस तरफ नोट: से मान अपरिभाषित है, और इसमें 'toString' विधि नहीं है, फिर भी इसका मान स्ट्रिंग में परिवर्तित हो जाता है। मुझे लगता है कि यह उन जेएस quirks में से एक है, मैं एक अपरिभाषित/uninitialized चर की उम्मीद 'शून्य' के रूप में व्यवहार करने की उम्मीद है, और जब यह एक में परिवर्तित हो जाता है तो एक खाली स्ट्रिंग वापस। –

+0

@EliasVanOotegem - 'अपरिभाषित' प्रकार स्ट्रिंग "अपरिभाषित" में परिवर्तित हो जाता है। यह वैसा ही है जैसा होना चाहिए। Spec के लिंक को देखें: http://es5.github.com/#x9.8 –

+0

मुझे यह पता है, लेकिन आपके द्वारा प्रदान किया गया लिंक 'ToString' ऑपरेशन के सभी परिणामों को दिखाता है। मैंने केवल इस तथ्य पर टिप्पणी की कि यह अजीब बात है कि वे उस मान को विधि प्रदान नहीं करते हैं जिसे एक (थोड़ा बदसूरत) कामकाज का उपयोग करके एक स्ट्रिंग में परिवर्तित किया जा सकता है। मैं भी ईमानदार होने के लिए इसे एक हैक कहने का लुत्फ उठा रहा हूं –

2

ऑपरेटरों का व्यवहार ईसीएमएस्क्रिप्ट के सभी सही कार्यान्वयन के लिए संगत है। मुझे आपके द्वारा वर्णित किसी भी ब्राउज़र कार्यान्वयन से अवगत नहीं है।

ईसीएमएस्क्रिप्ट मानक द्वारा परिभाषित किया गया है। http://ecmascript.org/

और हाँ, कोष्ठक ऑपरेटरों की सहयोगीता को परिभाषित करेंगे ..

+0

क्या ईसीएमएस्क्रिप्ट पुरुष एक विशिष्ट स्थान है यह tions? – taz

+0

@taz: कौन सा हिस्सा? –

+0

मैं शॉर्ट सर्किट मूल्यांकन – taz