ความแตกต่างระหว่างสตริงย่อยและสตริงย่อยคืออะไร?


844

อะไรคือความแตกต่างระหว่าง

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

และ

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

พวกเขาทั้งสองดูเหมือนจะส่งออก "ab"


13
@Derek 朕會功夫หมายเหตุมีsubstring ประสิทธิภาพสูงกว่าคนอื่น ๆ ทั้งหมดใน Chromeเมื่อเวลาผ่านไป
Steven Lu

4
การเพิ่มความคิดเห็นลงใน @Derek ... ซึ่งแตกต่างจากsliceวิธีการที่substringไม่จัดการการปรับค่าพารามิเตอร์เชิงลบ
Dzeimsas Zvirblis

1
ฉันคิดว่าคำถามที่สำคัญกว่านั้นคือ "ทำไม JavaScript มีทั้งsubstrวิธีและsubstringวิธีการ" นี่เป็นวิธีที่ต้องการมากไปหรือเปล่า
Sinjai

7
ณ วันนี้ MDN มีคำเตือนสีแดงขนาดใหญ่เกี่ยวกับsubstr()สิ่งที่คุณอาจเรียกว่า "หลอกเลิก" ที่ด้านบนของหน้าเอกสารที่นี่: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...... - ใครบ้างมีข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้เช่นมีเบราว์เซอร์ที่วางแผนจะเลิกใช้จริงsubstr()ในอนาคตหรือไม่? หรืออย่างที่ Steven Lu แนะนำอาจมีข้อเสียเปรียบด้านประสิทธิภาพสำหรับการใช้งานในsubstr()อนาคตหรือไม่
jamess

คำตอบ:


930

ข้อแตกต่างอยู่ในอาร์กิวเมนต์ที่สอง อาร์กิวเมนต์ที่สองsubstringเป็นดัชนีที่จะหยุดที่ (แต่ไม่รวม) แต่อาร์กิวเมนต์ที่สองที่substrเป็นความยาวสูงสุดที่จะส่งคืน

การเชื่อมโยง?

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

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


61
ดูเหมือนแหล่งที่มาของข้อผิดพลาดทั่วไป ดีที่จะรู้ความแตกต่าง พบความคิดเห็นเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่: rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
schnaader

3
@Pawel ก็เช่นกันเมื่อคุณต้องการให้ถึงจุดสิ้นสุดของสตริง (ไม่มีอาร์กิวเมนต์ที่สอง)
André Chalella

มันช่างไร้สาระจนฉันเกือบพลาดวันของการพัฒนาแอปเพล็ต Java ('เกือบ' เพราะเราต้องกังวลเรื่อง IE ในตอนนั้น)
Michael Scheper

2
คุณควรพูดถึงความแตกต่างในอาร์กิวเมนต์แรกซึ่งอาจเป็นค่าลบสำหรับ substr (ซึ่งในกรณีนี้มันจะเริ่มจากจุดสิ้นสุด) แต่ไม่ใช่สำหรับสตริงย่อย ดูคำตอบของ JefferMC แต่มีคะแนนน้อยกว่ามากที่ผู้คนจำนวนมากอาจพลาดส่วนสำคัญนี้
คุณ

2
เนื่องจากนี่คือคำตอบที่ upvoted มากที่สุดจึงควรแก้ไขเพื่อรวมที่ String.prototype.substr()คัดค้าน ... (มันถูกกำหนดไว้ในภาคผนวก Bของมาตรฐาน ECMA-262 ซึ่งแนะนำรัฐ: "... โปรแกรมเมอร์ไม่ควรใช้หรือถือว่า มีคุณลักษณะและพฤติกรรมเหล่านี้เมื่อเขียนรหัส ECMAScript ใหม่… ")
TS

309

substring( MDN ) (from, to)ใช้พารามิเตอร์เป็น
substr( MDN ) (from, length)ใช้พารามิเตอร์เป็น

ปรับปรุง : MDN ถือว่าเป็นsubstrมรดก

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

คุณสามารถจำsubstringต้องใช้ดัชนีเช่นเดียวกับอีกหนึ่งวิธีการสกัดสตริงชิ้น

เมื่อเริ่มต้นจาก 0 คุณสามารถใช้วิธีใดวิธีหนึ่ง


140
.substring()ใช้ดัชนี คุณสามารถจำได้เพราะมันเป็นเพียงคนเดียวที่มี 'i' ในชื่อ .slice()ใช้ดัชนีเช่นกัน
colllin

10
@ colllin ความคิดเห็นเกี่ยวกับฉันและบ่งบอกว่าแน่นอนควรจะย้ายเข้าสู่คำตอบ
MyDaftQuestions

35

ตามที่บอกไว้ในคำตอบของ yatima2975 มีความแตกต่างเพิ่มเติม:

substr()ยอมรับตำแหน่งเริ่มต้นเชิงลบเป็นออฟเซ็ตจากจุดสิ้นสุดของสตริง substring()ไม่.

จากMDN :

หาก start เป็นค่าลบ substr () จะใช้เป็นดัชนีอักขระจากส่วนท้ายของสตริง

ดังนั้นเพื่อสรุปความแตกต่างการทำงาน:

substring(begin-offset, end-offset-exclusive)โดยที่ start-offset 0หรือมากกว่านั้น

substr(begin-offset, length) เมื่อเริ่มต้นการชดเชยอาจเป็นลบ


25

อีกหนึ่ง gotcha ที่ฉันเพิ่งเจอคือใน IE 8 "abcd".substr(-1)ผลตอบแทนที่ผิดพลาด"abcd"ในขณะที่ Firefox 3.6 กลับมา"d"อย่างที่ควรจะเป็นsliceทำงานอย่างถูกต้องทั้งสองอย่าง

เพิ่มเติมในหัวข้อนี้สามารถพบได้ที่นี่


17

ความแตกต่างที่สำคัญคือ

substr () ช่วยให้คุณสามารถระบุความยาวสูงสุดที่จะกลับมา

ซับสตริง () ช่วยให้คุณระบุดัชนีและอาร์กิวเมนต์ที่สองไม่รวม

มีรายละเอียดปลีกย่อยเพิ่มเติมบางอย่างระหว่าง substr () และ substring () เช่นการจัดการข้อโต้แย้งที่เท่าเทียมกันและข้อโต้แย้งเชิงลบ หมายเหตุ substring () และ slice () เหมือนกัน แต่ไม่เหมือนกันเสมอไป

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

คุณพลาดประโยชน์ "อาร์กิวเมนต์ที่สองเชิงลบ" ที่เป็นประโยชน์สำหรับslice:"string".slice(2,-2); // "ri"
Paul

8

ความแตกต่างคือพารามิเตอร์ที่สอง พารามิเตอร์ที่สองของพวกเขาในขณะที่ตัวเลขทั้งสองกำลังคาดหวังสองสิ่งที่แตกต่างกัน:

เมื่อใช้ซับสตริงพารามิเตอร์ที่สองคือดัชนีแรกที่ไม่รวม:

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

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

เมื่อใช้สตริงย่อยพารามิเตอร์ตัวที่สองคือจำนวนอักขระที่จะรวมในสตริงย่อย:

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

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

5

ความแตกต่างที่สำคัญคือsubstr()เป็นวิธีที่เลิกใช้แล้วซึ่งยังคงสามารถใช้ได้ แต่ควรใช้ด้วยความระมัดระวังเนื่องจากคาดว่าจะถูกลบออกทั้งหมดในอนาคต คุณควรดำเนินการเพื่อลบการใช้งานออกจากรหัสของคุณ และsubstring()วิธีการประสบความสำเร็จและระบุอดีต


2
คุณสามารถชี้ไปยังแหล่งที่เชื่อถือได้ซึ่งระบุถึงการคัดค้านได้substr()หรือไม่? ฉันได้อ่านจากหลาย ๆ คนแล้ว แต่ฉันไม่พบข้อมูลใด ๆ บนเว็บที่รองรับคำสั่ง นอกจากนี้ Mozilla จะไม่รวมอยู่ในรายการคุณสมบัติที่เลิกใช้ / ล้าสมัย: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

@DanielM เท่าที่ฉันจำได้มันเลิกเมื่อฉันโพสต์คำตอบนี้อาจจะมีการเปลี่ยนแปลงบทความและตอนนี้ก็ไม่คัดค้าน(แต่ไม่แน่ใจ) .. แต่ยังคงบันทึกไว้ในบางบทความเช่นในsstut.com/javascript/substring- method.phpตามที่คัดค้าน
5ervant

3
@DanielM String.prototype.substr()ถูกกำหนดไว้ในภาคผนวก Bของมาตรฐาน ECMA-262 ซึ่งมีสถานะการแนะนำ : "... โปรแกรมเมอร์ไม่ควรใช้หรือสันนิษฐานว่ามีคุณสมบัติและพฤติกรรมเหล่านี้เมื่อเขียนรหัส ECMAScript ใหม่ ... "
TS

@TS substr()ถูกกล่าวถึงจริงๆว่าเลิกใช้แล้วในบางเอกสาร
5ervant

2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ณ วันนี้ การใช้ฟังก์ชั่นดั้งเดิมเมื่อมีทางเลือกไม่ใช่ตัวเลือกสำหรับรหัสที่ดี โปรด upvote คำตอบนี้เพื่อให้มองเห็นได้ชัดเจนยิ่งขึ้นเมื่อ Google นำไปสู่หน้านี้
vbezhenar

4

Slice กับ Substr เทียบกับ Substring เทียบกับ [] วิธีการ

มีประโยชน์ด้านประสิทธิภาพการทำงานของแต่ละวิธี javascript เหล่านี้ กรุณาใช้ฟังก์ชั่นเหล่านี้ตามลำดับ


9
คำตอบนี้จะดีกว่าถ้ามันรวมข้อความสรุปบางส่วนที่นี่เป็นข้อค้นพบของผลประโยชน์การเชื่อมโยงโปรด
2540625

3

ซับสตริง (): มันมี 2 พารามิเตอร์ "เริ่มต้น" และ "สิ้นสุด"

  • ต้องใช้พารามิเตอร์startและระบุตำแหน่งที่จะเริ่มการแตกไฟล์
  • พารามิเตอร์endเป็นทางเลือกและระบุตำแหน่งที่การแยกควรสิ้นสุด

หากไม่ได้ระบุพารามิเตอร์สิ้นสุดอักขระทั้งหมดจากตำแหน่งเริ่มต้นจนถึงจุดสิ้นสุดของสตริงจะถูกแยกออกมา

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

Output : Substring

หากค่าของพารามิเตอร์เริ่มต้นมีค่ามากกว่าค่าของพารามิเตอร์สิ้นสุดวิธีการนี้จะสลับสองข้อโต้แย้ง นี่หมายถึงการเริ่มต้นจะถูกใช้เป็นจุดสิ้นสุดและจุดสิ้นสุดจะถูกใช้เป็นจุดเริ่มต้น

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

Output : Substring

substr () : มันมี 2 พารามิเตอร์ "เริ่มต้น" และ "นับ"

  • ต้องใช้พารามิเตอร์ start และระบุตำแหน่งที่จะเริ่มการแตกไฟล์

  • พารามิเตอร์ count เป็นทางเลือกและระบุจำนวนอักขระที่จะแตก

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


Output : Substr Exa

หากไม่ได้ระบุพารามิเตอร์ count ตัวละครทั้งหมดจากตำแหน่งเริ่มต้นจนถึงจุดสิ้นสุดของสตริงจะถูกแยกออกมา ถ้านับเป็น 0 หรือเชิงลบสตริงที่ว่างเปล่าจะถูกส่งกลับ

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

Output : ple


2

สตริงย่อย (startIndex, endIndex (ไม่รวม))

substr (startIndex จำนวนตัวอักษร)

const string = 'JavaScript';

console.log('substring(1,2)', string.substring(1,2)); // a
console.log('substr(1,2)', string.substr(1,2)); // av
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.