Skip to content

Commit cdf2c0a

Browse files
committed
Refactor number formatting and rounding in article.md
1 parent 1a977a8 commit cdf2c0a

File tree

1 file changed

+115
-1
lines changed

1 file changed

+115
-1
lines changed

1-js/05-data-types/03-string/article.md

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)