String.slice और String.substring के बीच अंतर क्या है?


833

क्या किसी को पता है कि इन दोनों तरीकों में क्या अंतर है?

String.prototype.slice
String.prototype.substring

215
यह जावास्क्रिप्ट के खराब डिजाइन का एक उदाहरण है जिसे हमने तीन तरीकों से समाप्त किया है जो सभी एक ही काम करते हैं, लेकिन अलग-अलग quirks के साथ। आईएमओ sliceकम से कम अप्रत्याशित व्यवहार वाला है।
बॉबसन

2
IMO विकल्प जब प्रयोग किया जाता है तो अंत में idx से विकल्प लेना एक नज़र में अधिक समझ में आता है। विशेषकर
नॉब्स

1
इस वेबसाइट के अनुसार , sliceवास्तव में बदल सकता है substringऔर इसका उपयोग करने का कोई कारण नहीं है।
डेरेक 會 會

5
@AmolMKulkarni बिल्कुल भी सच नहीं है। यदि आप कोशिश करते हैं var a = "asdf".substring(-1);, तो इसे माना जाता है var a = "asdf".substring(0);। कोई अपवाद नहीं है। और यदि आप उपयोग करते हैं var a = "asdf".substring(2, -1);, तो यह (जैसे पहले) के 0स्थान पर उपयोग करता है -1, और तर्कों को स्वैप करता है इसलिए यह कार्य करता है var a = "asdf".substring(0, 2);। मैं भी IE 8 पर इन की कोशिश की और कोई अपवाद नहीं के साथ परिणाम मिला
इयान

35
"मैं भी IE 8 पर इन की कोशिश की" - मैं प्रोग्रामिंग प्यार करता हूँ।
चतुर्थी

जवाबों:


859

slice()substring()कुछ अलग व्यवहार के साथ काम करता है।

Syntax: string.slice(start, stop);
Syntax: string.substring(start, stop);

वे आम में क्या है:

  1. यदि startबराबर है stop: एक खाली स्ट्रिंग लौटाता है
  2. यदि stopछोड़ा गया है: स्ट्रिंग के अंत में वर्ण निकालता है
  3. यदि या तो तर्क स्ट्रिंग की लंबाई से अधिक है, तो स्ट्रिंग की लंबाई का उपयोग किया जाएगा।

की विकृतियाँ :substring()

  1. यदि start > stop, तो substringउन 2 तर्कों को स्वैप कर देगा।
  2. यदि या तो तर्क नकारात्मक है या है NaN, तो यह माना जाता है जैसे कि यह था0

की विकृतियाँ :slice()

  1. यदि start > stop, slice()खाली स्ट्रिंग लौटाएगा। ("" )
  2. यदि startनकारात्मक है: स्ट्रिंग के अंत से चार सेट करता है, बिल्कुल उसी तरहsubstr() फ़ायरफ़ॉक्स की । यह व्यवहार फ़ायरफ़ॉक्स और IE दोनों में देखा गया है।
  3. यदि stopनकारात्मक है: सेट बंद हो जाता है: string.length – Math.abs(stop)(मूल मूल्य), 0 पर बंधे को छोड़कर (इस प्रकार, Math.max(0, string.length + stop)) ECMA विनिर्देश में कवर किया गया है ।

स्रोत: रूडिमेंटरी आर्ट ऑफ़ प्रोग्रामिंग एंड डेवलपमेंट: जावास्क्रिप्ट: सब्स्टिट्यूट () बनाम सबस्ट्रिंग ()


8
आपके अंतिम नोट में slice(), यह होना चाहिएstring.length - stop
एंडी

16
अपने अंतिम नोट में slice(), मुझे लगता है कि यह होना चाहिए (string.length – 1) + stopया, यह स्पष्ट करने के लिए कि यह नकारात्मक है,(string.length – 1) – Math.abs(stop)
ओरिओल

9
@Longpoke: String.sliceको इसलिए जोड़ा गया था ताकि वहां एक स्ट्रिंग विधि संगत हो Array.slicesubstringवहाँ हमेशा के लिए गया है, इसलिए उन्होंने इसे नहीं तोड़ा और दूसरी विधि जोड़ी। शायद ही एक भद्दा निर्णय 1 के रूप में है। संगति अच्छी है और 2. यह कॉफ़ी की स्लाइसिंग सिंटैक्स को सरणियों और तारों पर काम करने की अनुमति देता है। @ ऑरिओल: ने इसे संपादित किया।
उड़ान भेड़

6
ऐसा लगता है कि फ़ायरफ़ॉक्स 22 में सबस्ट्रिंग और स्लाइस के बीच एक प्रदर्शन अंतर है। jsperf.com/string-slice-vs-substring
Rick

4
एंडी सही था। stopपर सेट हो जाएगा string.length + stopअगर stopनकारात्मक है। याद रखें stopकि आखिरी वर्ण निकाले जाने के बाद सूचकांक है!
user1537366

97

नोट: यदि आप जल्दी में हैं, और / या उत्तर की तह तक संक्षिप्त उत्तर स्क्रॉल करने के लिए देख रहे हैं, और अंतिम दो पंक्तियों को पढ़ें। तो जल्दी में नहीं पूरी बात पढ़ें।


मुझे तथ्यों को बताते हुए शुरू करें:

वाक्य - विन्यास:
string.slice(start,end)
string.substr(start,length)
string.substring(start,end)
नोट # 1:slice()==substring()

यह क्या करता है? एक स्ट्रिंग की विधि अर्क भागों और रिटर्न एक नया स्ट्रिंग में निकाले भागों। एक स्ट्रिंग की विधि अर्क भागों, निर्दिष्ट स्थान पर चरित्र से शुरू, और रिटर्न पात्रों की निर्दिष्ट संख्या। एक स्ट्रिंग की विधि अर्क भागों और रिटर्न एक नया स्ट्रिंग में निकाले भागों। नोट 2:
slice()
substr()
substring()
slice()==substring()

मूल स्ट्रिंग को बदलता है?
slice()करता नहीं
substr()करता नहीं
substring()करता नहीं
# 3 ध्यान दें:slice()==substring()

तर्क के रूप में ऋणात्मक संख्याओं का उपयोग करना:
slice()स्ट्रिंग
substr()के अंत से शुरू होने वाले वर्णों का चयन करता है स्ट्रिंग के अंत से शुरू होने वाले वर्णों का चयन नोट # 3
substring()नहीं करता है
:slice()==substr()

यदि पहला तर्क दूसरे से बड़ा है: दूसरा तर्क नहीं है क्योंकि
slice()प्रदर्शन
substr()नहीं है, स्थिति नहीं है, लेकिन लंबाई मान है, यह हमेशा की तरह प्रदर्शन करेगा, कोई समस्या नहीं है
substring() दो तर्क स्वैप करेंगे, और हमेशा की तरह प्रदर्शन करेंगे

पहला तर्क:
slice()आवश्यक, इंगित करता है: आरंभिक सूचकांक
substr()आवश्यक, इंगित करता है: आरंभिक सूचकांक
substring()आवश्यक, इंगित करता है: आरंभिक सूचकांक
नोट # ४:slice()==substr()==substring()

दूसरा तर्क:
slice()वैकल्पिक, स्थिति (अप करने के लिए, लेकिन शामिल नहीं) जहां निकासी को समाप्त करने के लिए
substr()वैकल्पिक,
substring()वैकल्पिक निकालने के लिए वर्णों की संख्या , स्थिति (अप करने के लिए, लेकिन शामिल नहीं) जहां निकासी को समाप्त करने के लिए
नोट # 5:slice()==substring()

यदि दूसरा तर्क दिया जाए तो क्या होगा?
slice()स्टार्ट-पोज़िशन से स्ट्रिंग के अंत तक
substr()सभी वर्णों का चयन करता है, स्टार्ट-पोज़िशन से स्ट्रिंग के अंत तक
substring()सभी पात्रों का चयन करता है, स्टार्ट-पोज़िशन से स्ट्रिंग के अंत तक सभी वर्णों का चयन करता है
नोट # 6:slice()==substr()==substring()

हां, तो आप कह सकते हैं वहाँ के बीच एक अंतर है कि slice()और substr()है, जबकि substring()मूल रूप से की एक प्रति हैslice()

संक्षेप में:
यदि आप सूचकांक (स्थिति) को जानते हैं, जिस पर आप रुकेंगे (लेकिन इसमें शामिल नहीं हैं), उपयोग करें slice()
यदि आपको पता है कि पात्रों की लंबाई का उपयोग किया जाना है substr()


11
पदार्थ () का उपयोग नहीं किया जाना चाहिए। डेवलपर.
mozilla.org/en-US/docs/Web/JavaScript/Reference/…

24

बेन नडेल ने इस बारे में एक अच्छा लेख लिखा है, वे इन कार्यों के मापदंडों में अंतर को बताते हैं:

String.slice( begin [, end ] )
String.substring( from [, to ] )
String.substr( start [, length ] )

वह यह भी बताते हैं कि यदि स्लाइस के पैरामीटर नकारात्मक हैं, तो वे स्ट्रिंग को अंत से संदर्भित करते हैं। पदार्थ और पदार्थ नहीं करता है।

यहाँ इस बारे में उनका लेख है।


3
यह गलत है, रूट नकारात्मक मापदंडों को संभालता है। '0123456789'.substr(-3, 2) -> '78'
नील फ्रेजर

14

एक उत्तर ठीक है, लेकिन इसमें थोड़ा पढ़ने की आवश्यकता है। विशेष रूप से नई शब्दावली "स्टॉप" के साथ।

माई गो - मतभेदों द्वारा आयोजित इसे डैनियल द्वारा पहले उत्तर के अतिरिक्त उपयोगी बनाने के लिए:

1) नकारात्मक सूचकांक। सबस्ट्रिंग को पॉजिटिव इंडेक्स की आवश्यकता होती है और यह एक नकारात्मक इंडेक्स को 0. पर सेट करेगा। स्लाइस के नेगेटिव इंडेक्स का अर्थ है स्ट्रिंग के अंत से स्थिति।

"1234".substring(-2, -1) == "1234".substring(0,0) == ""
"1234".slice(-2, -1) == "1234".slice(2, 3) == "3"

2) अनुक्रमित की अदला-बदली। सबस्ट्रिंग पहले इंडेक्स को दूसरे इंडेक्स से कम या उसके बराबर बनाने के लिए इंडेक्स को फिर से व्यवस्थित करेगा।

"1234".substring(3,2) == "1234".substring(2,3) == "3"
"1234".slice(3,2) == ""

--------------------------

सामान्य टिप्पणी - मुझे यह अजीब लगता है कि स्लाइस के अंतिम चरित्र या प्रतिस्थापन के बाद दूसरा सूचकांक स्थिति है। मुझे उम्मीद है कि "1234" .slice (2,2) "3" को वापस करेगा। यह एंडी के भ्रम को औचित्यपूर्ण बनाता है - मुझे उम्मीद है कि "1234" .slice (2, -1) "34" को वापस करेगा। हां, इसका मतलब है कि मैं जावास्क्रिप्ट के लिए नया हूं। इसका मतलब यह व्यवहार भी है:

"1234".slice(-2, -2) == "", "1234".slice(-2, -1) == "3", "1234".slice(-2, -0) == "" <-- you have to use length or omit the argument to get the 4.
"1234".slice(3, -2) == "", "1234".slice(3, -1) == "", "1234".slice(3, -0) == "" <-- same issue, but seems weirder.

मेरा 2 सी।


11

सबस्ट्रिंग और स्लाइस के बीच का अंतर - वे विदेशों में तर्कों पर नकारात्मक और अनदेखी लाइनों के साथ कैसे काम करते हैं:

प्रतिस्थापन (शुरू, अंत)

नकारात्मक तर्कों को शून्य के रूप में व्याख्या की जाती है। बहुत बड़े मूल्यों को स्ट्रिंग की लंबाई तक काट दिया जाता है: चेतावनी ("टेस्टमे" ".substring (-2)); // "testme", -2 0 हो जाता है

इसके अलावा, यदि प्रारंभ> अंत, तर्क परस्पर जुड़े हुए हैं, अर्थात आरंभ और अंत के बीच प्लॉट लाइन रिटर्न:

alert ( "testme" .substring (4, -1)); // "test"
// -1 Becomes 0 -> got substring (4, 0)
// 4> 0, so that the arguments are swapped -> substring (0, 4) = "test"

टुकड़ा

नकारात्मक मानों को रेखा के अंत से मापा जाता है:

alert ( "testme" .slice (-2)); // "me", from the end position 2
alert ( "testme" .slice (1, -1)); // "estm", from the first position to the one at the end.

यह अजीब तर्क विकल्प की तुलना में बहुत अधिक सुविधाजनक है।

IE8- को छोड़कर सभी ब्राउज़रों में समर्थित पहले पैरामीटर का एक नकारात्मक मान।

यदि इन तीन तरीकों में से एक का विकल्प, ज्यादातर स्थितियों में उपयोग के लिए - यह टुकड़ा होगा : नकारात्मक तर्क और यह स्पष्ट रूप से बनाए रखता है और संचालित करता है।


4

पदार्थ: यह हमें निर्दिष्ट सूचकांक के आधार पर स्ट्रिंग का हिस्सा लाने के लिए प्रदान कर रहा है। पदार्थ- string.substr (start, end) का सिंटैक्स - स्टार्ट इंडेक्स बताता है कि कहां से शुरुआत होती है। एंड-एंड इंडेक्स बताता है कि स्ट्रिंग कहां से आती है। यह वैकल्पिक है।

टुकड़ा: यह निर्दिष्ट सूचकांक के आधार पर स्ट्रिंग का हिस्सा लाने के लिए प्रदान कर रहा है। यह हमें सकारात्मक और सूचकांक निर्दिष्ट करने की अनुमति देता है। स्लाइस का सिंटैक्स - string.slice (स्टार्ट, एंड) स्टार्ट - स्टार्ट इंडेक्स बताता है कि कहां से शुरू होता है। यह एंड - एंड इंडेक्स बताता है कि स्ट्रिंग कहां से आती है। यह वैकल्पिक है। 'स्प्लिस' में शुरू और अंत दोनों सूचकांक सकारात्मक और नकारात्मक सूचकांक लेने में मदद करते हैं।

स्ट्रिंग में 'स्लाइस' के लिए नमूना कोड

var str="Javascript";
console.log(str.slice(-5,-1));

output: crip

स्ट्रिंग में 'सबस्ट्रिंग' के लिए नमूना कोड

var str="Javascript";
console.log(str.substring(1,5));

output: avas

[* नोट: स्ट्रिंग के अंत में नकारात्मक अनुक्रमण शुरू होता है।]


3

स्लाइस और सबस्ट्रिंग विधि के बीच एकमात्र अंतर तर्क का है

दोनों दो तर्क लेते हैं जैसे शुरू / से और अंत / से।

आप विधि को प्रतिस्थापित करने के लिए पहले तर्क के रूप में एक नकारात्मक मान को पारित नहीं कर सकते हैं लेकिन अंत से इसे पार करने के लिए स्लाइस विधि के लिए।

स्लाइस विधि तर्क विवरण:

REF: http://www.thesstech.com/javascript/string_slice_method

तर्क

start_index इंडेक्स जहां से स्लाइस शुरू होना चाहिए। यदि ऋणात्मक में मान प्रदान किया जाता है तो इसका मतलब है कि पिछले से शुरू करें। उदाहरण के लिए अंतिम चरित्र। END_INDEX टुकड़ा के अंत के बाद सूचकांक। यदि उपलब्ध नहीं है तो स्लाइस को स्टार्ट_इंडेक्स से स्ट्रिंग के अंत तक ले जाया जाएगा। ऋणात्मक मूल्य सूचकांक के मामले में स्ट्रिंग के अंत से मापा जाएगा।

प्रतिस्थापन विधि तर्क विवरण:

REF: http://www.thesstech.com/javascript/string_substring_method

तर्क

से यह जहां उप-स्ट्रिंग शुरू कर देना चाहिए से सूचकांक निर्दिष्ट करने के लिए एक गैर नकारात्मक पूर्णांक होना चाहिए। अनुक्रमणिका प्रदान करने के लिए एक वैकल्पिक गैर नकारात्मक पूर्णांक, जिसके पहले उप-स्ट्रिंग समाप्त होनी चाहिए।


0

यदि slice(start, stop), stopनकारात्मक है, तो stopइसके लिए सेट किया जाएगा:

string.length  Math.abs(stop)

बजाय:

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