Apa perbedaan antara String.slice dan String.substring?

834

Adakah yang tahu apa perbedaan antara kedua metode ini?

String.prototype.slice
String.prototype.substring
tmim
sumber
216
Ini adalah contoh dari desain JavaScript yang buruk sehingga kami berakhir dengan tiga metode yang semuanya melakukan hal yang sama, tetapi dengan kebiasaan yang berbeda. IMO sliceadalah orang dengan perilaku yang paling tidak terduga.
bobince
2
Substring IMO saat digunakan untuk mengambil substring dari idx hingga akhir lebih mudah dipahami. Terutama untuk noobs
mplungjan
1
Menurut situs web ini , slicesebenarnya bisa menggantikan substringdan tidak ada alasan untuk menggunakannya.
Derek 朕 會 功夫
5
@ AmolMKulkarni Tidak benar sama sekali. Jika Anda mencoba var a = "asdf".substring(-1);, itu diperlakukan sebagai var a = "asdf".substring(0);. Tidak terkecuali dilempar. Dan jika Anda menggunakan var a = "asdf".substring(2, -1);, itu digunakan 0sebagai pengganti -1(seperti sebelumnya), dan bertukar argumen sehingga bertindak seperti var a = "asdf".substring(0, 2);. Saya bahkan mencoba ini di IE 8 dan mendapatkan hasilnya tanpa pengecualian
Ian
35
"Saya bahkan mencoba ini di IE 8" - Saya suka pemrograman.
quemeful

Jawaban:

861

slice()bekerja seperti substring()dengan beberapa perilaku berbeda.

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

Kesamaan yang mereka miliki:

  1. Jika startsama dengan stop: mengembalikan string kosong
  2. Jika stopdihilangkan: mengekstraksi karakter ke akhir string
  3. Jika salah satu argumen lebih besar dari panjang string, panjang string akan digunakan sebagai gantinya.

Perbedaan antara :substring()

  1. Jika start > stop, maka substringakan menukar 2 argumen itu.
  2. Jika salah satu argumen negatif atau NaN, itu diperlakukan seolah-olah itu 0.

Perbedaan antara :slice()

  1. Jika start > stop, slice()akan mengembalikan string kosong. ( "")
  2. Jika startnegatif: set karakter dari akhir string, persis seperti substr()di Firefox. Perilaku ini diamati di Firefox dan IE.
  3. Jika stopnegatif: set berhenti ke: string.length – Math.abs(stop)(nilai asli), kecuali dibatasi pada 0 (dengan demikian, Math.max(0, string.length + stop)) sebagaimana tercakup dalam spesifikasi ECMA .

Sumber: Seni Dasar Pemrograman & Pengembangan: Javascript: substr () vs substring ()

Daniel Vassallo
sumber
8
Dalam catatan terakhir Anda slice(), seharusnyastring.length - stop
Andy
16
Dalam catatan terakhir Anda slice(), saya pikir itu harus (string.length – 1) + stopatau, untuk membuatnya jelas bahwa itu negatif,(string.length – 1) – Math.abs(stop)
Oriol
9
@ Longpoke: String.slicetelah ditambahkan sehingga ada metode string yang konsisten Array.slice. substringtelah ada di sana selamanya, jadi mereka tidak merusaknya dan menambahkan metode lain. Keputusan yang jelek karena konsistensi 1. bagus dan 2. memungkinkan sintaksis CoffeeScript untuk bekerja pada array dan string. @Oriol: diedit masuk
Domba terbang
6
Tampaknya ada perbedaan kinerja antara substring dan slice di Firefox 22. jsperf.com/string-slice-vs-substring
Rick
4
Andy benar. stopakan diatur ke string.length + stopjika stopnegatif. Ingat stopadalah indeks setelah karakter terakhir diekstraksi!
user1537366
97

Catatan: jika Anda sedang terburu-buru, dan / atau mencari jawaban singkat gulir ke bagian bawah jawaban, dan baca dua baris terakhir. Jika tidak terburu-buru baca semuanya.


izinkan saya memulai dengan menyatakan fakta:

Sintaks:
string.slice(start,end)
string.substr(start,length)
string.substring(start,end)
Catatan # 1:slice()==substring()

Apa itu?
The slice()Metode ekstrak bagian string dan kembali bagian-bagian diekstrak dalam string baru.
The substr()Metode ekstrak bagian string, dimulai pada karakter pada posisi tertentu, dan kembali jumlah tertentu dari karakter.
The substring()Metode ekstrak bagian string dan kembali bagian-bagian diekstrak dalam string baru.
Catatan 2:slice()==substring()

Mengubah String Asli?
slice()Tidak
substr()Tidak
substring()Tidak
Catatan # 3:slice()==substring()

Menggunakan Bilangan Negatif sebagai Argumen:
slice()memilih karakter mulai dari akhir string,
substr()memilih karakter mulai dari akhir string
substring()Tidak Melakukan
Catatan # 3:slice()==substr()

jika Argumen Pertama Lebih Besar dari Argumen Kedua:
slice()Tidak Berperan
substr()karena Argumen Kedua BUKAN posisi, tetapi nilai panjang, itu akan berfungsi seperti biasa, tanpa masalah
substring()akan menukar kedua argumen, dan berkinerja seperti biasa

Argumen Pertama:
slice()Diperlukan, menunjukkan: Indeks Awal
substr()Dibutuhkan, menunjukkan: Indeks Awal
substring()Diperlukan, menunjukkan: Indeks Awal
Catatan # 4:slice()==substr()==substring()

Argumen Kedua:
slice()Opsional, Posisi (hingga, tetapi tidak termasuk) di mana untuk mengakhiri ekstraksi
substr()Opsional, Jumlah karakter untuk mengekstraksi
substring()Opsional, Posisi (hingga, tetapi tidak termasuk) di mana untuk mengakhiri ekstraksi
Catatan # 5:slice()==substring()

Bagaimana jika Argumen Kedua Dihilangkan?
slice()memilih semua karakter dari posisi awal hingga akhir string,
substr()memilih semua karakter dari posisi awal hingga akhir string,
substring()memilih semua karakter dari posisi awal hingga akhir string.
Catatan # 6:slice()==substr()==substring()

jadi, Anda dapat mengatakan bahwa ada perbedaan antara slice()dan substr(), sementara substring()pada dasarnya adalah salinan slice().

dalam Ringkasan:
jika Anda tahu indeks (posisi) tempat Anda akan berhenti (tetapi TIDAK termasuk), Gunakan slice()
jika Anda tahu panjang karakter yang akan diekstraksi, gunakan substr().

Waddah
sumber
11
substr () tidak boleh digunakan developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Killy
24

Ben Nadel telah menulis artikel yang bagus tentang ini, ia menunjukkan perbedaan dalam parameter untuk fungsi-fungsi ini:

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

Dia juga menunjukkan bahwa jika parameter untuk slice negatif, mereka mereferensikan string dari akhir. Substring dan substring tidak.

Inilah artikelnya tentang ini.

Jón Viðar Þorsteinsson
sumber
3
Ini tidak benar, substr menangani parameter negatif. '0123456789'.substr(-3, 2) -> '78'
Neil Fraser
14

Satu jawaban baik-baik saja tetapi membutuhkan sedikit bacaan. Apalagi dengan terminologi baru "berhenti".

My Go - diorganisasikan oleh perbedaan untuk menjadikannya bermanfaat di samping jawaban pertama oleh Daniel di atas:

1) indeks negatif. Substring memerlukan indeks positif dan akan menetapkan indeks negatif menjadi 0. Indeks negatif slice berarti posisi dari ujung string.

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

2) Pertukaran indeks. Substring akan menyusun ulang indeks untuk membuat indeks pertama kurang dari atau sama dengan indeks kedua.

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

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

Komentar umum - Saya merasa aneh bahwa indeks kedua adalah posisi setelah karakter terakhir dari slice atau substring. Saya harapkan "1234" .slice (2,2) mengembalikan "3". Ini membuat kebingungan Andy di atas dibenarkan - saya harapkan "1234" .slice (2, -1) mengembalikan "34". Ya, ini berarti saya baru mengenal Javascript. Ini juga berarti perilaku ini:

"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.

2c saya

Gerard ONeill
sumber
11

Perbedaan antara substring dan slice - adalah bagaimana mereka bekerja dengan argumen negatif dan menghadap garis luar negeri:

substring (mulai, akhir)

Argumen negatif ditafsirkan sebagai nol. Nilai terlalu besar dipotong ke panjang string: alert ("testme" .substring (-2)); // "testme", -2 menjadi 0

Selanjutnya, jika mulai> akhir, argumen dipertukarkan, yaitu garis plot mengembalikan antara awal dan akhir:

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"

mengiris

Nilai negatif diukur dari akhir baris:

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.

Ini jauh lebih nyaman daripada substring logika aneh.

Nilai negatif dari parameter pertama untuk substr yang didukung di semua browser kecuali IE8-.

Jika pilihan salah satu dari tiga metode ini, untuk digunakan dalam sebagian besar situasi - itu akan menjadi irisan : argumen negatif dan itu mempertahankan dan beroperasi paling jelas.

Alexandr
sumber
4

substr: Ini memberi kita untuk mengambil bagian dari string berdasarkan indeks yang ditentukan. sintaks dari substr- string.substr (start, end) start - indeks awal memberitahu di mana mulai mengambil. end - end index memberitahu sampai dimana string mengambil. Itu opsional.

slice: Ini menyediakan untuk mengambil bagian dari string berdasarkan indeks yang ditentukan. Ini memungkinkan kita untuk menentukan positif dan indeks. sintaks dari slice - string.slice (start, end) start - start index memberitahu di mana pengambilan awal. Indeks end - end memberitahu sampai ke mana string mengambil. Itu opsional. Dalam 'splice' baik indeks awal dan akhir membantu untuk mengambil indeks positif dan negatif.

kode sampel untuk 'slice' dalam string

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

output: crip

kode sampel untuk 'substring' dalam string

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

output: avas

[* Catatan: pengindeksan negatif dimulai pada akhir string.]

subham ruj
sumber
3

Satu-satunya perbedaan antara metode slice dan substring adalah argumen

Keduanya mengambil dua argumen misalnya mulai / dari dan akhir / ke.

Anda tidak bisa memberikan nilai negatif sebagai argumen pertama untuk metode substring tetapi untuk metode slice untuk melewatinya dari akhir.

Rincian argumen metode slice:

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

Argumen

Indeks start_index dari mana slice harus dimulai. Jika nilai diberikan dalam negatif itu berarti mulai dari yang terakhir. mis. -1 untuk karakter terakhir. Indeks end_index setelah akhir slice. Jika tidak disediakan, slice akan diambil dari start_index ke akhir string. Dalam hal indeks nilai negatif akan diukur dari ujung tali.

Rincian argumen metode substring:

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

Argumen

from Ini harus berupa bilangan bulat non negatif untuk menentukan indeks dari mana sub-string harus dimulai. to Integer non negatif opsional untuk memberikan indeks sebelum sub-string yang harus diselesaikan.

Sohail Arif
sumber
0

Sebab slice(start, stop), jika stopnegatif, stopakan diatur ke:

string.length  Math.abs(stop)

daripada:

string.length  1  Math.abs(stop)
tingxuanz
sumber