Substr ve substring arasındaki fark nedir?


844

Arasındaki fark nedir

alert("abc".substr(0,2));

ve

alert("abc".substring(0,2));

İkisi de "ab" çıktısı veriyor.


13
@Derek 朕 會 功夫 Dikkat, geç saatlerde substring Chrome'daki diğerlerinden daha iyi performans gösterir .
Steven Lu

4
@Derek yorumuna ekleniyor ... sliceYöntemin aksine, substringnegatif parametreler için ayar yapmaz.
Dzeimsas Zvirblis

1
Bence en önemli soru "JavaScript'in neden hem substryöntemi hem de yöntemi var substring?" Bu gerçekten aşırı yükleme yöntemi mi?
Sinjai

7
Bugün itibariyle, MDN'nin, substr()buradaki dokümanlar sayfasının üst kısmında "yalancı kullanımdan kaldırılmış" olarak adlandırabileceğiniz konusunda büyük bir kırmızı uyarı var: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Herkes bu konuda daha fazla bilgi var mı, örneğin substr()gelecekte herhangi bir noktada gerçekten yoksaymayı planlayan bir tarayıcı var mı? Veya Steven Lu'nun önerdiği gibi, substr()ileriye doğru kullanmanın performans dezavantajları olabilir mi?
jamess

Yanıtlar:


930

Fark ikinci argümanda. İkinci argüman substringduracak (ancak içermeyecek) dizindir, ancak ikinci argüman substrdöndürülecek maksimum uzunluktur.

Bağlantılar?

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substr

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substring


61
Yaygın bir hata kaynağı gibi geliyor. Farkı bilmek güzel. Bununla
schnaader

3
@Pawel, dizenin sonuna kadar istediğinizde de (ikinci argüman yok)
André Chalella

Bu o kadar saçma ki neredeyse Java uygulamaları geliştirmenin günlerini özlüyorum. ('Neredeyse', çünkü o zamanlar IE hakkında endişelenmek zorunda kaldık.)
Michael Scheper

2
Ayrıca, ilk argümandaki substr için negatif olabilecek (bu durumda sondan başlar), ancak alt dize için olmayan farktan da bahsetmelisiniz. JefferMC'nin cevabına bakın, ancak pek çok insan bu önemli kısmı kaçırabilir.
Youen

2
Bu farkla en upvoted cevap gereğidir olarak, muhtemelen bu içerecek şekilde düzenlenmesi gerekir String.prototype.substr()Bu tanımlanmıştır (... kullanımdan kaldırıldı Ek B kimin ECMA-262 standardının, giriş devletler: "... Programcılar kullanmayın veya düşünmemelidir yeni ECMAScript kodu yazarken bu özelliklerin ve davranışların varlığı.… ")
TS

309

substring( MDN ) parametreleri alır (from, to).
substr( MDN ) parametreleri alır (from, length).

Güncelleme : MDN substrmiras olarak kabul edilir .

alert("abc".substr(1,2)); // returns "bc"
alert("abc".substring(1,2)); // returns "b"

Hatırlayabileceğiniz substringgibi, başka bir dize çıkarma yöntemi, dilim gibi, endeksleri alır .

0'dan başlarken her iki yöntemi de kullanabilirsiniz.


140
.substring()endeks alır. Hatırlayabilirsiniz çünkü adında 'i' olan tek kişi budur. .slice()endeksleri de alır.
colllin

10
@colllin, i ve gösteriler hakkındaki yorum mutlaka cevaba taşınmalıdır!
MyDaftQuestions

35

Yatima2975'in cevabında belirtildiği gibi, ek bir fark var:

substr()negatif bir başlangıç ​​konumunu dizenin sonundan öteleme olarak kabul eder. substring()değil.

Gönderen MDN'yi :

Start negatifse, substr () bunu dizenin sonundan karakter dizini olarak kullanır.

Yani fonksiyonel farklılıkları özetlemek gerekirse:

substring(begin-offset, end-offset-exclusive)başlangıç ​​ofseti 0veya daha büyük olduğunda

substr(begin-offset, length) başlangıç ​​ofseti de negatif olabilir


25

Geçenlerde karşılaştığım bir diğer şey ise IE 8'de "abcd".substr(-1)yanlışlıkla geri dönüyor "abcd", Firefox 3.6 ise "d"olması gerektiği gibi geri dönüyor . sliceher ikisinde de doğru çalışır.

Bu konuyla ilgili daha fazla bilgiyi burada bulabilirsiniz .


17

Temel fark şu ki

substr (), döndürülecek maksimum uzunluğu belirlemenizi sağlar

substring (), indeksleri belirtmenize olanak tanır ve ikinci argüman dahil DEĞİLDİR

Substr () ve substring () arasında, eşit argümanların ve negatif argümanların işlenmesi gibi bazı ek incelikler vardır. Ayrıca subring () ve slice () işlevlerinin benzer olduğunu, ancak her zaman aynı olmadığını unutmayın.

  //*** length vs indices:
    "string".substring(2,4);  // "ri"   (start, end) indices / second value is NOT inclusive
    "string".substr(2,4);     // "ring" (start, length) length is the maximum length to return
    "string".slice(2,4);      // "ri"   (start, end) indices / second value is NOT inclusive

  //*** watch out for substring swap:
    "string".substring(3,2);  // "r"    (swaps the larger and the smaller number)
    "string".substr(3,2);     // "in"
    "string".slice(3,2);      // ""     (just returns "")

  //*** negative second argument:
    "string".substring(2,-4); // "st"   (converts negative numbers to 0, then swaps first and second position)
    "string".substr(2,-4);    // ""
    "string".slice(2,-4);     // ""

  //*** negative first argument:
    "string".substring(-3);   // "string"        
    "string".substr(-3);      // "ing"  (read from end of string)
    "string".slice(-3);       // "ing"        

Şunun için yararlı "negatif ikinci argümanı" kaçırdınız slice:"string".slice(2,-2); // "ri"
Paul

8

Fark ikinci parametredir. Her iki sayı da ikinci parametreleri iki farklı şey bekliyor:

Alt dize kullanılırken ikinci parametre dahil edilmeyen ilk dizindir:

var s = "string";
s.substring(1, 3); // would return 'tr'

var s = "another example";
s.substring(3, 7); // would return 'ther'

Substr kullanılırken ikinci parametre, alt dizeye dahil edilecek karakter sayısıdır:

var s = "string";
s.substr(1, 3); // would return 'tri'

var s = "another example";
s.substr(3, 7); // would return 'ther ex'

5

Büyük fark, bir substr()olan kullanımdan kaldırılmış yöntem hala kullanılabilir, ancak bunlar tamamen ileride çıkarılması beklenir çünkü dikkatli kullanılmalıdır. Kullanımlarını kodunuzdan kaldırmak için çalışmalısınız. Ve substring()yöntem başarılı oldu ve öncekini belirledi.


2
Kullanımdan kaldırıldığını gösteren güvenilir bir kaynağa işaret edebilir misiniz substr()? Birkaç kişiden okudum, ancak web'de ifadeyi destekleyen herhangi bir bilgi bulamıyorum. Ayrıca Mozilla, kullanımdan kaldırılmış / eski özellikler listesine dahil etmiyor: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
DanielM

@DanielM Hatırladığım kadarıyla, bu cevabı gönderdiğimde kullanımdan kaldırıldı, belki makale değişti ve şimdi kullanımdan kaldırılmadı (ama emin değilim) .. Ama yine de sstut.com/javascript/substring- yöntem.php kullanımdan kaldırıldı.
5ervant

3
@DanielM String.prototype.substr()tanımlanan Ek B kimin ECMA-262 standardının, giriş devletler: "... yeni ECMAScript kod yazarken Programcılar kullanabilir veya bu özelliklerin ve davranışların varlığını varsaymamalısınız ...."
TS

@TS substr()bazı belgelerde gerçekten kullanımdan kaldırılmıştır.
5ervant

2
Bu bugün itibariyle kabul edilmiş bir cevap olmalıdır. Alternatif olduğunda eski işlevleri kullanmak, iyi kod için bir seçenek değildir. Google'ın bu sayfaya yönlendirmesiyle daha görünür hale getirmek için lütfen bu yanıtı oylayın.
vbezhenar


3

substring (): "start" ve "end" olmak üzere 2 parametresi vardır.

  • start parametresi gereklidir ve ayıklamanın başlatılacağı konumu belirtir.
  • end parametresi isteğe bağlıdır ve ayıklamanın bitmesi gereken konumu belirtir.

End parametresi belirtilmezse, başlangıç ​​konumundan dizenin sonuna kadar olan tüm karakterler çıkarılır.

var str = "Substring Example";
var result = str.substring(0, 10);
alert(result);

Output : Substring

Start parametresinin değeri end parametresinin değerinden büyükse, bu yöntem iki argümanı değiştirir. Bu, başlangıç ​​olarak bitiş ve bitişin başlangıç ​​olarak kullanılacağı anlamına gelir.

var str = "Substring Example";
var result = str.substring(10, 0);
alert(result);

Output : Substring

substr () : "start" ve "count" olmak üzere 2 parametresi vardır.

  • start parametresi gereklidir ve ayıklamanın başlatılacağı konumu belirtir.

  • count parametresi isteğe bağlıdır ve ayıklanacak karakter sayısını belirtir.

var str = "Substr Example";
var result = str.substr(0, 10);
alert(result);


Output : Substr Exa

Count parametresi belirtilmezse, başlangıç ​​konumundan dizenin sonuna kadar olan tüm karakterler çıkarılır. Sayı 0 veya negatif ise, boş bir dize döndürülür.

var str = "Substr Example";
var result = str.substr(11);
alert(result);

Output : ple


2

substring (startIndex, endIndex (dahil değildir))

substr (startIndex, kaç karakter)

const string = 'JavaScript';

console.log('substring(1,2)', string.substring(1,2)); // a
console.log('substr(1,2)', string.substr(1,2)); // av
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.