string.charAt (x) या string [x]?


246

क्या कोई कारण है जो मुझे string.charAt(x)ब्रैकेट नोटेशन के बजाय उपयोग करना चाहिए string[x]?


3
सावधानी का शब्द : बेसिक बहुभाषी प्लेन BPM (AKA "Astral Plane" ) के "😃".charAt(0)
अतीत के इमोजीस

जवाबों:


243

ब्रैकेट नोटेशन अब IE7 और उसके अलावा सभी प्रमुख ब्राउज़रों पर काम करता है।

// Bracket Notation
"Test String1"[6]

// charAt Implementation
"Test String1".charAt(6)

इन कारणों से ( स्रोत ):

IE7 में यह नोटेशन काम नहीं करता है। पहला कोड स्निपेट IE7 में अपरिभाषित वापस आ जाएगा। यदि आप अपने कोड में स्ट्रिंग के लिए ब्रैकेट नोटेशन का उपयोग करते हैं और आप माइग्रेट करना चाहते हैं .charAt(pos), तो यह एक वास्तविक दर्द है: ब्रैकेट्स का उपयोग आपके कोड पर किया जाता है और यह पता लगाने का कोई आसान तरीका नहीं है कि क्या यह एक स्ट्रिंग या एक सरणी के लिए है / वस्तु।

आप इस संकेतन का उपयोग करके वर्ण सेट नहीं कर सकते। जैसा कि किसी भी प्रकार की कोई चेतावनी नहीं है, यह वास्तव में भ्रमित और निराशाजनक है। यदि आप .charAt(pos)फ़ंक्शन का उपयोग कर रहे थे , तो आपको ऐसा करने के लिए लुभाया नहीं गया होगा।


21
सच है, IE7 में अंकन काम नहीं करता है, लेकिन यह आजकल बहुत बड़ा नुकसान नहीं है। इस बीच, बेंचमार्क मैंने क्रोम में charAt बनाम इंडेक्सर का उपयोग करते समय प्रदर्शन में तीन बार कमी दिखाया जब स्ट्रिंग को एक वस्तु में बॉक्स किया जाता है। मुझे पता है कि यह वास्तव में प्रासंगिक नहीं है, लेकिन फिर भी ध्यान देने योग्य है। jsfiddle.net/mdasxxd2
Siderite Zackwehdex

5
एक और अधिक सटीक परीक्षण (बेंचमार्क.जेएस) esbench.com/bench/579609a0db965b9a00965b9e
NoNameProvided

3
उच्चतम स्कोर होने के बावजूद यह उत्तर अब (2019) काफी पुराना है। एमडीएन के हवाले से नीचे दिए गए जवाब को इसके बजाय संदर्भित किया जाना चाहिए।
स्कॉट मार्टिन

97

से MDN :

एक स्ट्रिंग में एक व्यक्ति के चरित्र तक पहुंचने के दो तरीके हैं। पहला charAtतरीका है, ECMAScript 3 का हिस्सा:

return 'cat'.charAt(1); // returns "a"

दूसरा तरीका स्ट्रिंग को एक सरणी की तरह वस्तु के रूप में व्यवहार करना है, जहां प्रत्येक व्यक्तिगत वर्ण एक संख्यात्मक सूचकांक के अनुरूप हैं। यह IE के अलावा उनके पहले संस्करण के बाद से अधिकांश ब्राउज़रों द्वारा समर्थित किया गया है। इसे ECMAScript 5 में मानकीकृत किया गया था:

return 'cat'[1]; // returns "a"

दूसरे तरीके के लिए ECMAScript 5 समर्थन की आवश्यकता होती है (और कुछ पुराने ब्राउज़रों में समर्थित नहीं)।

दोनों ही मामलों में, एक व्यक्ति के चरित्र को बदलने की कोशिश नहीं की जाएगी, क्योंकि तार अपरिवर्तनीय हैं, अर्थात, उनके गुण न तो "लिखने योग्य" हैं और न ही "कॉन्फ़िगर करने योग्य" हैं।

  • str.charAt(i) यदि IE6 / IE7 संगतता की आवश्यकता है, तो एक संगतता परिप्रेक्ष्य से बेहतर है।
  • str[i] अधिक आधुनिक है और IE8 + और अन्य सभी ब्राउज़रों (सभी एज / फ़ायरफ़ॉक्स / क्रोम, सफारी 2+, सभी आईओएस / एंड्रॉइड) में काम करता है।

19
यह सच है, ECMA 5 अभी तक सभी ब्राउज़रों पर समर्थित नहीं है, लेकिन यह सबसे ब्राउज़रों पर समर्थित है: IE9 और ऊपर और सभी क्रोम / फ़ायरफ़ॉक्स संस्करणों अर्थ: kangax.github.io/compat-table/es5/#Property_access_on_strings कोई जे एस सुविधा कभी होगा 100% समर्थित बनें, और मुझे लगता है कि ECMA 5 सुविधाओं के उपयोग से बचने से अतीत में हमें हमेशा के लिए छोड़ दिया जाएगा ...
डैनी आर

83

वे किनारे के मामलों में अलग-अलग परिणाम दे सकते हैं।

'hello'[NaN] // undefined
'hello'.charAt(NaN) // 'h'

'hello'[true] //undefined
'hello'.charAt(true) // 'e'

CharAt समारोह कैसे सूचकांक एक में संख्या में बदल जाती है पर निर्भर करता है कल्पना


इसके अलावा 'hello'[undefined] // undefinedऔर'hello'.charAt(undefined) //h
जुआन मेंडेस

3
nullकी तरह काम करता है undefined, लेकिन इसे देखें: "hello"["00"] // undefinedलेकिन "hello".charAt("00") // "h"और"hello"["0"] // "h"
panzi

11
यह पूरी ईमानदारी से मुझे उपयोग करने के लिए आश्वस्त करता है []
ApproachingDarknessFish

इसका मतलब यह भी है कि .charAt()अपने पैरामीटर के लिए एक अतिरिक्त रूपांतरण करता है Number। FYI करें, आजकल लगभग कोई प्रदर्शन अंतर नहीं है।
Константин Ван

7
इस उत्तर को आगे बढ़ना चाहिए, यह वास्तव में बताता है कि 2 विधियों के बीच अंतर है। अन्य उत्तर IE7 के लिए अनुकूलता के बारे में बात करते हैं (मेरा वास्तव में मतलब है?) जबकि यह उत्तर बहुत वास्तविक नुकसान की व्याख्या करता है।
स्टॉर्म मुलर

11

String.charAt () मूल मानक है और सभी ब्राउज़रों में काम करता है। IE 8+ और अन्य ब्राउज़रों में, आप वर्णों तक पहुँचने के लिए ब्रैकेट नोटेशन का उपयोग कर सकते हैं, लेकिन IE 7 और नीचे ने इसका समर्थन नहीं किया है।

अगर कोई वास्तव में IE 7 में ब्रैकेट नोटेशन का उपयोग करना चाहता है, तो स्ट्रिंग को एक सरणी में परिवर्तित करने के लिए बुद्धिमान है str.split('')और फिर इसे किसी भी ब्राउज़र के साथ संगत, सरणी के रूप में उपयोग करें।

var testString = "Hello"; 
var charArr = testString.split("");
charArr[1]; // "e"

5
IE 8 आगे से ब्रैकेट नोटेशन का समर्थन करता है।
mrec

3
यूनिकोड के साथ व्यवहार करते समय यह विधि टूट जाती है: mathiasbynens.be/notes/javascript-unicode
जेरेमी जे स्टारचेर

यह विधि वास्तव में बड़े तारों से निपटने के दौरान अक्षम होगी क्योंकि यह मेमोरी (मूल स्ट्रिंग और सरणी) में डेटा की नकल करेगा।
डैनियल

8

बहुत दिलचस्प परिणाम जब आप charAt()विधि बनाम स्ट्रिंग इंडेक्स एक्सेसर का परीक्षण करते हैं । लगता है क्रोम एकमात्र ब्राउज़र है जो charAtअधिक पसंद करता है।

चारएट बनाम इंडेक्स 1

चार्टएट बनाम इंडेक्स 2

चार्टएट बनाम इंडेक्स 3


1
अभी ऐसा नहीं है। indexतेजी से क्रोम में तेजी से, भी है
माको-टैको

5

जब आप किसी इंडेक्स को एक्सेस करने की कोशिश करते हैं, जो सीमा से बाहर होता है या पूर्णांक नहीं होता है, तो अंतर होता है।

string[x]यदि 0 और , के बीच पूर्णांक है x, stringतो वें स्थान पर वर्ण लौटाता है और अन्यथा लौटता है।xstring.length-1undefined

string.charAt(x)यहांx बताई गई प्रक्रिया का उपयोग करके एक पूर्णांक में धर्मान्तरित (जो मूल रूप से एक पूर्णांक संख्या होने पर नीचे की ओर घूमता है और 0 यदि है तो) और फिर पूर्णांक और 0 के बीच में वर्ण को उस स्थिति में लौटाता है, और कोई रिक्त स्ट्रिंग लौटाता है अन्यथा ।xxparseInt(x)NaNstring.length-1

यहाँ कुछ उदाहरण हैं:

"Hello"[313]    //undefined
"Hello".charAt(313)    //"", 313 is out of bounds

"Hello"[3.14]    //undefined
"Hello".charAt(3.14)    //'l', rounds 3.14 down to 3

"Hello"[true]    //undefined
"Hello".charAt(true)    //'e', converts true to the integer 1

"Hello"["World"]    //undefined
"Hello".charAt("World")    //'H', "World" evaluates to NaN, which gets converted to 0

"Hello"[Infinity]    //undefined
"Hello".charAt(Infinity)    //"", Infinity is out of bounds

एक और अंतर यह है कि string[x]कुछ भी नहीं करने के लिए असाइन करना (जो भ्रामक हो सकता है) और असाइन करना string.charAt(x)एक त्रुटि है (जैसा कि अपेक्षित है):

var str = "Hello";
str[0] = 'Y';
console.log(str);    //Still "Hello", the above assignment did nothing
str.charAt(0) = 'Y';    //Error, invalid left-hand side in assignment

कारण यह है कि string[x]काम नहीं करने का कारण यह है कि जावास्क्रिप्ट तार अपरिवर्तनीय हैं

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