@@ -405,4 +405,118 @@ alert( "วิด*!*เจ็ต*/!*".endsWith("เจ็ต") ); // true, "ว
405405| ` substr(start, length) ` | จาก ` start ` ดึง ` length ` อักขระ | อนุญาต ` start ` เป็นลบ |
406406
407407``` smart header="เลือกตัวไหนดี?"
408- ทั้งหมดสามารถทำงานได้ อย่างเป็นทางการ `substr` มีข้อเสียเล็กน้อย: มันถูกอธิบายไว้ไม่ใช่ในข้อกำหนดหลักของ JavaScript แต่ใน Annex B ซึ่งครอบคลุมคุณลักษณะของเบราว์เซอร์เท่านั้นที่มีอยู่ส่วนใหญ่เพื่อเหตุผลทางประวัติศาสตร์ ดังนั้น สภาพแวดล้อมที่ไม่ใ
408+ ทั้งหมดสามารถทำงานได้ อย่างเป็นทางการ `substr` มีข้อเสียเล็กน้อย: มันถูกอธิบายไว้ไม่ใช่ในข้อกำหนดหลักของ JavaScript แต่ใน Annex B ซึ่งครอบคลุมคุณลักษณะของเบราว์เซอร์เท่านั้นที่มีอยู่ส่วนใหญ่เพื่อเหตุผลทางประวัติศาสตร์ ดังนั้น สภาพแวดล้อมที่ไม่ใช่เบราว์เซอร์อาจล้มเหลวในการสนับสนุนมัน แต่ในทางปฏิบัติมันทำงานได้ทุกที่
409+
410+ จากสองตัวเลือกที่เหลือ `slice` มีความยืดหยุ่นมากกว่าเล็กน้อย เพราะอนุญาตให้ใช้อาร์กิวเมนต์ที่เป็นลบได้และสั้นกว่าในการเขียน
411+
412+ ดังนั้น สำหรับการใช้งานในทางปฏิบัติ การจำแค่ `slice` ก็เพียงพอแล้ว
413+ ```
414+
415+ ## การเปรียบเทียบสตริง
416+
417+ ดังที่เราทราบจากบท < info:comparison > สตริงจะถูกเปรียบเทียบทีละอักขระตามลำดับตัวอักษร
418+
419+ อย่างไรก็ตาม มีความแปลกประหลาดบางอย่าง:
420+
421+ 1 . ตัวพิมพ์เล็กจะมากกว่าตัวพิมพ์ใหญ่เสมอ:
422+
423+ ``` js run
424+ alert ( ' a' > ' Z' ); // true
425+ ```
426+
427+ 2. ตัวอักษรที่มีเครื่องหมายกำกับจะ " ไม่เป็นไปตามลำดับ" :
428+
429+ ` ` ` js run
430+ alert( 'Österreich' > 'Zealand' ); // true
431+ ` ` `
432+
433+ สิ่งนี้อาจนำไปสู่ผลลัพธ์ที่แปลกประหลาดถ้าเราเรียงลำดับชื่อประเทศเหล่านี้ โดยปกติแล้วคนจะคาดหวังว่า ` Zealand` จะอยู่หลัง ` Österreich` ในรายการ
434+
435+ เพื่อเข้าใจว่าเกิดอะไรขึ้น เราควรตระหนักว่าสตริงใน JavaScript ถูกเข้ารหัสโดยใช้ [UTF - 16 ](https: // en.wikipedia.org/wiki/UTF-16) นั่นคือ: แต่ละอักขระมีรหัสตัวเลขที่สอดคล้องกัน
436+
437+ มีเมธอดพิเศษที่ช่วยให้เราได้อักขระจากรหัสและกลับกัน:
438+
439+ ` str.codePointAt(pos)`
440+ : ส่งคืนตัวเลขฐานสิบที่แสดงถึงรหัสสำหรับอักขระที่ตำแหน่ง ` pos` :
441+
442+ ` ` ` js run
443+ // ตัวอักษรที่มีตัวพิมพ์ต่างกันจะมีรหัสต่างกัน
444+ alert( "Z".codePointAt(0) ); // 90
445+ alert( "z".codePointAt(0) ); // 122
446+ alert( "z".codePointAt(0).toString(16) ); // 7a (ถ้าเราต้องการค่าฐานสิบหก)
447+ ` ` `
448+
449+ ` String.fromCodePoint(code)`
450+ : สร้างอักขระโดยรหัสตัวเลข ` code`
451+
452+ ` ` ` js run
453+ alert( String.fromCodePoint(90) ); // Z
454+ alert( String.fromCodePoint(0x5a) ); // Z (เราสามารถใช้ค่าฐานสิบหกเป็นอาร์กิวเมนต์ได้ด้วย)
455+ ` ` `
456+
457+ ตอนนี้มาดูอักขระที่มีรหัส ` 65..220` (ตัวอักษรละตินและเพิ่มเติมเล็กน้อย) โดยการสร้างสตริงจากพวกมัน:
458+
459+ ` ` ` js run
460+ let str = '';
461+
462+ for (let i = 65; i <= 220; i++) {
463+ str += String.fromCodePoint(i);
464+ }
465+ alert( str );
466+ // ผลลัพธ์:
467+ // ABCDEFGHIJKLMNOPQRSTUVWXYZ[\] ^_` abcdefghijklmnopqrstuvwxyz{| }~
468+ // ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜ
469+ ` ` `
470+
471+ เห็นไหม? ตัวอักษรตัวพิมพ์ใหญ่มาก่อน จากนั้นก็มีอักขระพิเศษบางตัว แล้วตามด้วยตัวอักษรตัวพิมพ์เล็ก และ ` Ö` อยู่ใกล้ท้ายของผลลัพธ์
472+
473+ ตอนนี้มันชัดเจนแล้วว่าทำไม ` a > Z `
474+
475+ อักขระถูกเปรียบเทียบโดยรหัสตัวเลขของพวกมัน รหัสที่มากกว่าหมายความว่าอักขระนั้นมากกว่า รหัสสำหรับ ` a` (97) มากกว่ารหัสสำหรับ ` Z ` (90)
476+
477+ - ตัวอักษรตัวพิมพ์เล็กทั้งหมดมาหลังตัวอักษรตัวพิมพ์ใหญ่เพราะรหัสของพวกมันมากกว่า
478+ - ตัวอักษรบางตัวเช่น ` Ö` แยกออกจากตัวอักษรหลัก ในที่นี้ รหัสของมันมากกว่าอะไรก็ตามจาก ` a` ถึง ` z`
479+
480+ ### การเปรียบเทียบที่ถูกต้อง [#correct-comparisons]
481+
482+ อัลกอริทึม "ที่ถูกต้อง" ในการเปรียบเทียบสตริงนั้นซับซ้อนกว่าที่อาจดูเหมือน เพราะตัวอักษรแตกต่างกันสำหรับภาษาต่างๆ
483+
484+ ดังนั้น เบราว์เซอร์จำเป็นต้องรู้ภาษาเพื่อเปรียบเทียบ
485+
486+ โชคดีที่เบราว์เซอร์สมัยใหม่สนับสนุนมาตรฐานการทำให้เป็นสากล [ECMA-402](https://www.ecma-international.org/publications-and-standards/standards/ecma-402/)
487+
488+ มันให้เมธอดพิเศษสำหรับการเปรียบเทียบสตริงในภาษาต่างๆ ตามกฎของพวกมัน
489+
490+ การเรียก [str.localeCompare(str2)](mdn:js/String/localeCompare) ส่งคืนจำนวนเต็มที่บ่งบอกว่า ` str` น้อยกว่า เท่ากับ หรือมากกว่า ` str2` ตามกฎภาษา:
491+
492+ - ส่งคืนจำนวนติดลบถ้า ` str` น้อยกว่า ` str2`
493+ - ส่งคืนจำนวนบวกถ้า ` str` มากกว่า ` str2`
494+ - ส่งคืน ` 0 ` ถ้าพวกมันเท่ากัน
495+
496+ ตัวอย่างเช่น:
497+
498+ ` ` ` js run
499+ alert ( ' Österreich' .localeCompare (' Zealand' ) ); // -1
500+ ` ` `
501+
502+ เมธอดนี้จริงๆ แล้วมีอาร์กิวเมนต์เพิ่มเติมอีกสองตัวที่ระบุใน [เอกสาร](mdn:js/String/localeCompare) ซึ่งช่วยให้ระบุภาษาได้ (โดยค่าเริ่มต้นจะใช้จากสภาพแวดล้อม ลำดับตัวอักษรขึ้นอยู่กับภาษา) และตั้งค่ากฎเพิ่มเติมเช่นการคำนึงถึงตัวพิมพ์ใหญ่-เล็กหรือควรปฏิบัติกับ ` " a" ` และ ` " á" ` เหมือนกันหรือไม่ เป็นต้น
503+
504+ ## สรุป
505+
506+ - มีเครื่องหมายคำพูด 3 ประเภท Backticks ช่วยให้สตริงสามารถขึ้นหลายบรรทัดและแทรกนิพจน์ ` ${…}` ได้
507+ - เราสามารถใช้อักขระพิเศษได้ เช่น การขึ้นบรรทัดใหม่ ` \n`
508+ - ในการรับอักขระ ใช้: ` []` หรือเมธอด ` at`
509+ - ในการรับสตริงย่อย ใช้: ` slice` หรือ ` substring`
510+ - ในการทำให้สตริงเป็นตัวพิมพ์เล็ก/ใหญ่ ใช้: ` toLowerCase/ toUpperCase`
511+ - ในการค้นหาสตริงย่อย ใช้: ` indexOf` หรือ ` includes/ startsWith/ endsWith` สำหรับการตรวจสอบอย่างง่าย
512+ - ในการเปรียบเทียบสตริงตามภาษา ใช้: ` localeCompare` มิฉะนั้นพวกมันจะถูกเปรียบเทียบตามรหัสอักขระ
513+
514+ มีเมธอดที่เป็นประโยชน์อื่นๆ อีกหลายตัวในสตริง:
515+
516+ - ` str .trim ()` -- ลบ ("ตัด") ช่องว่างจากจุดเริ่มต้นและจุดสิ้นสุดของสตริง
517+ - ` str .repeat (n)` -- ทำซ้ำสตริง ` n` ครั้ง
518+ - ...และอื่นๆ ที่สามารถพบได้ใน[คู่มือ](mdn:js/String)
519+
520+ สตริงยังมีเมธอดสำหรับการค้นหา/แทนที่ด้วยนิพจน์ทั่วไป (regular expressions) แต่นั่นเป็นหัวข้อใหญ่ ดังนั้นจึงอธิบายในส่วนบทเรียนแยกต่างหาก <info:regular-expressions>
521+
522+ นอกจากนี้ ณ ตอนนี้สิ่งสำคัญคือต้องทราบว่าสตริงอยู่บนพื้นฐานของการเข้ารหัส Unicode และดังนั้นจึงมีปัญหาเกี่ยวกับการเปรียบเทียบ มีข้อมูลเพิ่มเติมเกี่ยวกับ Unicode ในบท <info:unicode>
0 commit comments