Sự khác biệt giữa String.slice và String.subopes là gì?


834

Có ai biết sự khác biệt giữa hai phương pháp này là gì không?

String.prototype.slice
String.prototype.substring

216
Đó là một ví dụ về thiết kế kém của JavaScript mà chúng tôi đã kết thúc với ba phương thức mà tất cả đều làm cùng một thứ, nhưng với các quirks khác nhau. IMO slicelà một trong những hành vi ít bất ngờ nhất.
bobince

2
Chuỗi con IMO khi được sử dụng để lấy một chuỗi con từ idx cho đến hết sẽ dễ hiểu hơn trong nháy mắt. Đặc biệt là để noobs
mplungjan

1
Theo trang web này , slicethực sự có thể thay thế substringvà không có lý do để sử dụng nó.
Derek 朕 會

5
@AmolMKulkarni Không đúng chút nào. Nếu bạn cố gắng var a = "asdf".substring(-1);, nó được coi là var a = "asdf".substring(0);. Không có ngoại lệ ném. Và nếu bạn sử dụng var a = "asdf".substring(2, -1);, nó sử dụng 0thay cho -1(như trước đây) và hoán đổi các đối số để nó hoạt động như thế nào var a = "asdf".substring(0, 2);. Tôi thậm chí đã thử những thứ này trên IE 8 và nhận được kết quả không có ngoại lệ
Ian

35
"Tôi thậm chí đã thử những thứ này trên IE 8" - Tôi thích lập trình.
tuyệt vời

Câu trả lời:


861

slice()hoạt động như substring()với một vài hành vi khác nhau.

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

Những gì họ có điểm chung:

  1. Nếu startbằng stop: trả về một chuỗi rỗng
  2. Nếu stopbị bỏ qua: trích xuất các ký tự đến cuối chuỗi
  3. Nếu một trong hai đối số lớn hơn độ dài của chuỗi, thì độ dài của chuỗi sẽ được sử dụng thay thế.

Sự khác biệt của :substring()

  1. Nếu start > stop, sau đó substringsẽ trao đổi 2 đối số.
  2. Nếu một trong hai đối số là âm hoặc là NaN, nó được xử lý như thể nó là 0.

Sự khác biệt của :slice()

  1. Nếu start > stop, slice()sẽ trả về chuỗi trống. ( "")
  2. Nếu startlà âm: đặt char từ cuối chuỗi, chính xác như substr()trong Firefox. Hành vi này được quan sát trong cả Firefox và IE.
  3. Nếu stoplà âm: đặt dừng thành: string.length – Math.abs(stop)(giá trị ban đầu), ngoại trừ giới hạn ở 0 (do đó, Math.max(0, string.length + stop)) như được nêu trong đặc tả ECMA .

Nguồn: Nghệ thuật lập trình & phát triển thô sơ: Javascript: chất nền () so với chuỗi con ()


8
Trong ghi chú cuối cùng của bạn slice(), nó phải làstring.length - stop
Andy

16
Trong lưu ý cuối cùng của bạn slice(), tôi nghĩ rằng nó nên (string.length – 1) + stophoặc, để làm rõ rằng nó tiêu cực,(string.length – 1) – Math.abs(stop)
Oriol

9
@Longpoke: String.sliceđã được thêm vào để có một phương thức chuỗi phù hợp với Array.slice. substringđã ở đó mãi mãi, vì vậy họ đã không phá vỡ nó và thêm một phương pháp khác. Một quyết định khó hiểu là 1. tính nhất quán là tốt và 2. nó cho phép cú pháp cắt của CoffeeScript hoạt động trên các mảng và chuỗi. @Oriol: chỉnh sửa nó trong.
cừu bay

6
Có vẻ như có sự khác biệt về hiệu suất giữa chuỗi con và lát cắt trong Firefox 22. jsperf.com/opes-slice-vs-subopes
Rick

4
Andy đã đúng. stopsẽ được đặt thành string.length + stopnếu stopâm. Hãy nhớ stoplà chỉ số sau khi nhân vật cuối cùng được trích xuất!
dùng1537366

97

Lưu ý: nếu bạn đang vội, và / hoặc đang tìm kiếm câu trả lời ngắn, hãy cuộn xuống cuối câu trả lời và đọc hai dòng cuối cùng. Nếu không vội thì hãy đọc toàn bộ.


hãy để tôi bắt đầu bằng cách nêu rõ sự thật:

Cú pháp:
string.slice(start,end)
string.substr(start,length)
string.substring(start,end)
Lưu ý số 1:slice()==substring()

Những gì nó làm?
Các slice()chiết xuất phương pháp các bộ phận của một chuỗi và trả về các phần chiết xuất trong một chuỗi mới.
Các substr()chiết xuất phương pháp các bộ phận của một chuỗi, bắt đầu từ nhân vật ở vị trí nhất định, và trả về số lượng cụ thể của các nhân vật.
Các substring()chiết xuất phương pháp các bộ phận của một chuỗi và trả về các phần chiết xuất trong một chuỗi mới.
Lưu ý 2:slice()==substring()

Thay đổi chuỗi gốc?
slice()Không
substr()không
substring()không
Lưu ý # 3:slice()==substring()

Sử dụng số âm làm đối số:
slice()chọn các ký tự bắt đầu từ cuối chuỗi
substr()chọn các ký tự bắt đầu từ cuối chuỗi
substring()Không thực hiện
Lưu ý # 3:slice()==substr()

nếu Đối số thứ nhất lớn hơn đối số thứ hai:
slice()Không thực hiện
substr()do Đối số thứ hai KHÔNG phải là vị trí, nhưng giá trị độ dài, nó sẽ hoạt động như bình thường, không có vấn đề gì
substring()sẽ trao đổi hai đối số và thực hiện như bình thường

Đối số thứ nhất:
slice()Bắt buộc, cho biết: Bắt đầu chỉ mục
substr()bắt buộc, cho biết: Bắt đầu chỉ mục
substring()bắt buộc, cho biết: Chỉ số bắt đầu
Lưu ý số 4:slice()==substr()==substring()

Đối số thứ hai:
slice()Tùy chọn, Vị trí (tối đa, nhưng không bao gồm) nơi kết thúc trích xuất
substr()Tùy chọn, Số lượng ký tự để trích xuất
substring()Tùy chọn, Vị trí (tối đa, nhưng không bao gồm) nơi kết thúc trích xuất
Lưu ý # 5:slice()==substring()

Điều gì xảy ra nếu Đối số thứ hai bị bỏ qua?
slice()chọn tất cả các ký tự từ vị trí bắt đầu đến cuối chuỗi
substr()chọn tất cả các ký tự từ vị trí bắt đầu đến cuối chuỗi
substring()chọn tất cả các ký tự từ vị trí bắt đầu đến cuối chuỗi
Lưu ý # 6:slice()==substr()==substring()

vì vậy, bạn có thể nói rằng có một sự khác biệt giữa slice()substr(), trong khi substring()về cơ bản là một bản sao của slice().

Tóm tắt:
nếu bạn biết chỉ mục (vị trí) mà bạn sẽ dừng (nhưng KHÔNG bao gồm), hãy sử dụng slice()
nếu bạn biết độ dài của các ký tự được trích xuất sử dụng substr().


11
không nên sử dụng chất nền () developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
Kẻ

24

Ben Nadel đã viết một bài viết hay về điều này, ông chỉ ra sự khác biệt trong các tham số cho các chức năng này:

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

Ông cũng chỉ ra rằng nếu các tham số để lát là âm, chúng tham chiếu chuỗi từ cuối. Chuỗi con và chất nền khôngn.

Đây là bài viết của ông về điều này.


3
Điều này là không chính xác, chất nền không xử lý các tham số tiêu cực. '0123456789'.substr(-3, 2) -> '78'
Neil Fraser

14

Một câu trả lời là tốt nhưng đòi hỏi một chút đọc vào. Đặc biệt với thuật ngữ mới "dừng lại".

My Go - được tổ chức bởi sự khác biệt để làm cho nó hữu ích ngoài câu trả lời đầu tiên của Daniel ở trên:

1) chỉ số tiêu cực. Chuỗi con yêu cầu các chỉ mục dương và sẽ đặt chỉ số âm thành 0. Chỉ số âm của Slice có nghĩa là vị trí từ cuối chuỗi.

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

2) Hoán đổi các chỉ số. Chuỗi con sẽ sắp xếp lại các chỉ mục để làm cho chỉ mục đầu tiên nhỏ hơn hoặc bằng chỉ mục thứ hai.

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

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

Nhận xét chung - Tôi thấy thật kỳ lạ khi chỉ số thứ hai là vị trí sau ký tự cuối cùng của lát cắt hoặc chuỗi con. Tôi hy vọng "1234" .slice (2,2) sẽ trả về "3". Điều này làm cho sự nhầm lẫn của Andy ở trên trở nên hợp lý - tôi hy vọng "1234" .slice (2, -1) sẽ trả về "34". Vâng, điều này có nghĩa là tôi chưa quen với Javascript. Điều này cũng có nghĩa là hành vi này:

"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 của tôi.


11

Sự khác biệt giữa chuỗi con và lát cắt - là cách chúng hoạt động với các đối số phủ định và nhìn ra các dòng ở nước ngoài:

chuỗi con (bắt đầu, kết thúc)

Đối số phủ định được hiểu là không. Các giá trị quá lớn bị cắt ngắn theo chiều dài của chuỗi: alert ("testme" .sub chuỗi (-2)); // "testme", -2 trở thành 0

Hơn nữa, nếu bắt đầu> kết thúc, các đối số được hoán đổi cho nhau, tức là dòng cốt truyện trả về giữa điểm đầu và điểm cuối:

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"

lát

Các giá trị âm được đo từ cuối dòng:

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.

Nó thuận tiện hơn nhiều so với chuỗi con logic lạ.

Giá trị âm của tham số đầu tiên đến chất nền được hỗ trợ trong tất cả các trình duyệt ngoại trừ IE8-.

Nếu lựa chọn một trong ba phương pháp này, để sử dụng trong hầu hết các tình huống - đó sẽ là lát cắt : đối số phủ định và nó duy trì và vận hành rõ ràng nhất.


4

chất nền: Nó cung cấp cho chúng tôi để tìm nạp một phần của chuỗi dựa trên chỉ mục được chỉ định. cú pháp của struct- string.substr (start, end) start - start index cho biết nơi bắt đầu tìm nạp. chỉ mục kết thúc cho biết nơi tìm nạp chuỗi. Đó là tùy chọn.

lát: Nó cung cấp để tìm nạp một phần của chuỗi dựa trên chỉ mục đã chỉ định. Nó cho phép chúng tôi chỉ định tích cực và chỉ số. cú pháp của lát - string.slice (start, end) start - start index cho biết nơi bắt đầu tìm nạp. Chỉ mục end-end của nó cho biết nơi chuỗi tìm nạp. Đó là tùy chọn. Trong 'mối nối' cả chỉ số bắt đầu và kết thúc đều giúp lấy chỉ số dương và âm.

mã mẫu cho 'lát' trong chuỗi

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

output: crip

mã mẫu cho 'chuỗi con' trong chuỗi

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

output: avas

[* Lưu ý: lập chỉ mục tiêu cực bắt đầu ở cuối chuỗi.]


3

Sự khác biệt duy nhất giữa phương thức lát và chuỗi con là của các đối số

Cả hai đều có hai đối số, ví dụ: bắt đầu / từ và kết thúc / đến.

Bạn không thể truyền giá trị âm làm đối số đầu tiên cho phương thức chuỗi con nhưng cho lát phương thức để truyền qua nó từ cuối.

Chi tiết đối số phương thức Slice:

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

Tranh luận

start_index Index từ nơi lát nên bắt đầu. Nếu giá trị được cung cấp trong phủ định, điều đó có nghĩa là bắt đầu từ cuối cùng. ví dụ -1 cho ký tự cuối cùng. end_index Chỉ số sau khi kết thúc lát. Nếu không được cung cấp lát sẽ được lấy từ start_index đến cuối chuỗi. Trong trường hợp chỉ số giá trị âm sẽ được đo từ cuối chuỗi.

Chi tiết đối số phương thức chuỗi con:

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

Tranh luận

từ Nó phải là một số nguyên không âm để chỉ định chỉ mục từ đó chuỗi con sẽ bắt đầu. đến Một số nguyên không âm tùy chọn để cung cấp chỉ mục trước khi chuỗi con nào được kết thúc.


0

Đối với slice(start, stop), nếu stoplà âm, stopsẽ được đặt thành:

string.length  Math.abs(stop)

thay vì:

string.length  1  Math.abs(stop)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.