Sự khác biệt giữa chất nền và chuỗi con là gì?


844

Sự khác biệt giữa

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

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

Cả hai dường như sản xuất ra ab ab.


13
@Derek 會 Lưu ý, substring vượt trội so với tất cả những người khác trên Chrome tính đến cuối.
Steven Lu

4
Thêm vào nhận xét @Derek ... Không giống như slicephương thức, substringkhông xử lý điều chỉnh cho các tham số âm.
Dzeimsas Zvirblis

1
Tôi nghĩ câu hỏi quan trọng hơn là "tại sao JavaScript có cả substrphương thức và substringphương thức"? Đây thực sự là phương pháp quá tải ưa thích?
Sinjai

7
Cho đến ngày hôm nay, MDN có một cảnh báo lớn về màu đỏ substr()mà bạn có thể gọi là "giả mạo" ở đầu trang tài liệu ở đây: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ tựa - Có ai có thêm thông tin về điều này không, ví dụ như có trình duyệt nào đang có kế hoạch thực sự phản đối substr()tại bất kỳ thời điểm nào trong tương lai không? Hoặc như Steven Lu đề xuất, có thể có những bất lợi về hiệu suất khi sử dụng substr()trong tương lai?
kẹt

Câu trả lời:


930

Sự khác biệt là trong đối số thứ hai. Đối số thứ hai substringlà chỉ mục dừng tại (nhưng không bao gồm), nhưng đối số thứ hai substrlà độ dài tối đa để trả về.

Liên kết?

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

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


61
Âm thanh như một nguồn lỗi phổ biến. Tốt để biết sự khác biệt. Tìm thấy thêm ý kiến ​​về điều này ở đây: rapd.wordpress.com/2007/07/12/javascript-substr-vs-subopes
schnaader

3
@Pawel cũng là khi bạn muốn nó đến cuối chuỗi (không có đối số thứ hai)
André Chalella

Điều này thật nực cười đến nỗi tôi gần như bỏ lỡ những ngày phát triển các applet Java. ('Hầu như', vì lúc đó chúng tôi phải lo lắng về IE.)
Michael Scheper

2
Bạn cũng nên đề cập đến sự khác biệt trên đối số đầu tiên, có thể âm đối với lớp nền (trong trường hợp này bắt đầu từ cuối), nhưng không phải cho chuỗi con. Xem câu trả lời của JefferMC, nhưng nó có rất ít phiếu bầu mà nhiều người có thể bỏ lỡ phần quan trọng này.
youen

2
Vì đây là câu trả lời được đánh giá cao nhất, nên có lẽ nên chỉnh sửa để bao gồm điều đó String.prototype.substr()không được chấp nhận ... (Nó được định nghĩa trong Phụ lục B của tiêu chuẩn ECMA-262, trong đó giới thiệu : "Lập trình viên không nên sử dụng hoặc giả sử sự tồn tại của các tính năng và hành vi này khi viết mã ECMAScript mới. ')
TS

309

substring( MDN ) lấy tham số là (from, to).
substr( MDN ) lấy tham số là (from, length).

Cập nhật : MDN xem xét substrdi sản.

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

Bạn có thể nhớ substringlấy các chỉ số, cũng như một phương pháp trích xuất chuỗi khác, lát .

Khi bắt đầu từ 0, bạn có thể sử dụng một trong hai phương pháp.


140
.substring()có chỉ số. Bạn có thể nhớ vì đó là người duy nhất có chữ 'i' trong tên. .slice()mất chỉ số quá.
colllin

10
@colllin, nhận xét đó về i và chỉ định chắc chắn nên được chuyển vào câu trả lời!
MyDaftQuestions

35

Như được gợi ý trong câu trả lời của yatima2975, có một sự khác biệt bổ sung:

substr()chấp nhận vị trí bắt đầu âm như là phần bù từ cuối chuỗi. substring()không làm.

Từ MDN :

Nếu bắt đầu là âm, chất nền () sử dụng nó làm chỉ mục ký tự từ cuối chuỗi.

Vì vậy, để tổng hợp các khác biệt chức năng:

substring(begin-offset, end-offset-exclusive)nơi bắt đầu bù 0hoặc lớn hơn

substr(begin-offset, length) nơi bắt đầu bù cũng có thể là âm


25

Một vấn đề khác mà tôi gặp gần đây là trong IE 8, "abcd".substr(-1)trả về một cách sai lầm "abcd", trong khi Firefox 3.6 trả lại "d"như bình thường. slicehoạt động chính xác trên cả hai.

Thêm về chủ đề này có thể được tìm thấy ở đây .


17

Sự khác biệt chính là

chất nền () cho phép bạn chỉ định độ dài tối đa để trả về

chuỗi con () cho phép bạn chỉ định các chỉ mục và đối số thứ hai KHÔNG bao gồm

Có một số phép tính bổ sung giữa lớp nền () và chuỗi con () như xử lý các đối số bằng nhau và đối số phủ định. Cũng lưu ý chuỗi con () và lát () tương tự nhưng không phải lúc nào cũng giống nhau.

  //*** 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"        

Bạn đã bỏ lỡ "đối số thứ hai tiêu cực" hữu ích cho slice:"string".slice(2,-2); // "ri"
Paul

8

Sự khác biệt là tham số thứ hai. Các tham số thứ hai của chúng, trong khi cả hai số, đang mong đợi hai điều khác nhau:

Khi sử dụng chuỗi con, tham số thứ hai là chỉ mục đầu tiên không bao gồm:

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

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

Khi sử dụng chất nền, tham số thứ hai là số lượng ký tự cần bao gồm trong chuỗi con:

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

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

5

Sự khác biệt lớn được, substr()một phương pháp NỮA mà vẫn có thể được sử dụng, nhưng nên được sử dụng một cách thận trọng bởi vì họ dự kiến sẽ được loại bỏ hoàn toàn đôi khi trong tương lai. Bạn nên làm việc để loại bỏ việc sử dụng chúng khỏi mã của bạn. Và substring()phương pháp đã thành công và chỉ định cái trước.


2
Bạn có thể chỉ ra một nguồn đáng tin cậy cho thấy sự phản đối của substr()? Tôi đã đọc nó từ nhiều người, nhưng tôi không thể tìm thấy bất kỳ thông tin nào trên web hỗ trợ tuyên bố này. Thêm vào đó, Mozilla không đưa nó vào danh sách các tính năng không dùng nữa / bị lỗi thời: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
trộm

@DanielM Theo như tôi nhớ, nó đã bị phản đối khi tôi đăng câu trả lời này, có thể bài báo đã thay đổi và bây giờ không được phản đối (nhưng không chắc chắn) .. Nhưng vẫn được ghi lại trên một số bài viết như trong sstut.com/javascript/subopes- phương thức.php như không dùng nữa.
5ervant

3
@DanielM String.prototype.substr()được định nghĩa trong Phụ lục B của tiêu chuẩn ECMA-262, có phần giới thiệu : "Các lập trình viên không nên sử dụng hoặc giả sử sự tồn tại của các tính năng và hành vi này khi viết mã ECMAScript mới."
TS

@TS substr()thực sự được ghi nhận là không dùng nữa trên một số tài liệu.
5ervant

2
Đây sẽ là một câu trả lời được chấp nhận cho đến ngày hôm nay. Sử dụng các hàm kế thừa khi có sự thay thế không phải là một lựa chọn cho mã tốt. Vui lòng nêu lên câu trả lời này để làm cho nó rõ hơn khi Google dẫn đến trang này.
vbezhenar

4

Slice vs Substr vs Sub Chuỗi vs [] Phương thức

Có những lợi ích hiệu suất cho mỗi phương thức javascript này. Vui lòng sử dụng các chức năng này cho phù hợp.


9
Câu trả lời này sẽ tốt hơn nếu nó bao gồm một số văn bản tóm tắt ở đây về những phát hiện về lợi ích hiệu suất được liên kết, xin vui lòng.
2540625

3

chuỗi con (): Nó có 2 tham số "bắt đầu" và "kết thúc".

  • tham số bắt đầu là cần thiết và chỉ định vị trí bắt đầu khai thác.
  • tham số kết thúc là tùy chọn và chỉ định vị trí trích xuất sẽ kết thúc.

Nếu tham số kết thúc không được chỉ định, tất cả các ký tự từ vị trí bắt đầu cho đến cuối chuỗi được trích xuất.

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

Output : Substring

Nếu giá trị của tham số bắt đầu lớn hơn giá trị của tham số kết thúc, phương thức này sẽ trao đổi hai đối số. Điều này có nghĩa là bắt đầu sẽ được sử dụng như kết thúc và kết thúc sẽ được sử dụng như bắt đầu.

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

Output : Substring

chất nền () : Nó có 2 tham số "bắt đầu" và "đếm".

  • tham số bắt đầu là cần thiết và chỉ định vị trí bắt đầu khai thác.

  • tham số đếm là tùy chọn và chỉ định số lượng ký tự cần trích xuất.

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


Output : Substr Exa

Nếu tham số đếm không được chỉ định, tất cả các ký tự từ vị trí bắt đầu cho đến cuối chuỗi được trích xuất. Nếu số là 0 hoặc âm, một chuỗi trống được trả về.

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

Output : ple


2

chuỗi con (start Index, end Index (không bao gồm))

chất nền (start Index, có bao nhiêu ký tự)

const string = 'JavaScript';

console.log('substring(1,2)', string.substring(1,2)); // a
console.log('substr(1,2)', string.substr(1,2)); // av
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.