ฉันรู้ว่านี่เป็นคำถามที่เก่ามาก แต่ฉันไม่พอใจกับคำตอบใด ๆ 100% เนื่องจากคำตอบทั้งหมดดูเหมือนจะไม่สมบูรณ์ ดังนั้นที่นี่เราไปอีกครั้งจากหลักการแรก:
จุดมุ่งหมายโดยรวมของผู้ใช้:
การสรุปโค้ด: "ฉันต้องการเพิ่มerror
ชื่อคลาสให้กับสตริงโดยเลือกเว้นวรรคนำหน้าหากมีชื่อคลาสอยู่แล้วในสตริง"
วิธีแก้ปัญหาที่ง่ายที่สุด
ดังที่ Kobi กล่าวไว้เมื่อ 5 ปีที่แล้วการมีพื้นที่ชั้นนำในชื่อคลาสจะไม่ก่อให้เกิดปัญหากับเบราว์เซอร์ที่รู้จักดังนั้นวิธีแก้ปัญหาที่สั้นที่สุดคือ:
h.className += ' error';
ที่ควรได้รับการตอบจริงกับปัญหาที่เกิดขึ้นจริง
อาจเป็นไปได้ว่าคำถามที่ถามคือ ...
1) ทำไมถึงได้ผล?
h.className += h.className ? ' error' : 'error'
ตัวดำเนินการเงื่อนไข / ternary ทำงานเหมือนคำสั่ง if ที่กำหนดผลลัพธ์ของมันtrue
หรือพา ธfalse
ไปยังตัวแปร
ดังนั้นรหัสนั้นจึงทำงานได้เนื่องจากมีการประเมินเพียงดังนี้:
if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
2) แล้วทำไมถึงแตก?
h.className = h.className + h.className ? ' error' : 'error'
คำถามที่รัฐ "ที่ให้ [N] ข้อผิดพลาดในคอนโซลของฉัน" ซึ่งอาจทำให้เข้าใจผิดให้คุณคิดว่ารหัสไม่สามารถทำงานได้ ในความเป็นจริงรหัสต่อไปนี้จะทำงานโดยไม่มีข้อผิดพลาดแต่มันก็ 'ข้อผิดพลาด' ผลตอบแทนถ้าสตริงก็ไม่ว่างเปล่าและ 'ข้อผิดพลาด' ถ้าสตริงเป็นที่ว่างเปล่าและอื่น ๆไม่ได้ตอบสนองความต้องการ
รหัสนั้นจะส่งผลให้สตริงที่มีเพียง' error'
หรือ'error'
เพราะมันประเมินเป็นรหัสหลอกนี้เสมอ:
if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
เหตุผลนี้ก็คือตัวดำเนินการเพิ่มเติม ( +
ไปยังโฟล์คทั่วไป) มี "ลำดับความสำคัญ" (6) สูงกว่าตัวดำเนินการเงื่อนไข / ตัวดำเนินการตามเงื่อนไข (15) ฉันรู้ว่าตัวเลขปรากฏย้อนหลัง
ลำดับความสำคัญหมายถึงว่าตัวดำเนินการแต่ละประเภทในภาษาได้รับการประเมินตามลำดับที่กำหนดไว้ล่วงหน้าโดยเฉพาะ (ไม่ใช่แค่จากซ้ายไปขวา)
วิธีเปลี่ยนลำดับการประเมิน:
ตอนนี้เรารู้แล้วว่าทำไมมันถึงล้มเหลวคุณต้องรู้วิธีทำให้มันใช้งานได้
บางคำตอบอื่น ๆ พูดคุยเกี่ยวกับการเปลี่ยนแปลงลำดับความสำคัญแต่คุณไม่สามารถ ลำดับความสำคัญเป็นแบบต่อสายในภาษา นั่นเป็นเพียงการกำหนดกฎเกณฑ์ตายตัว ... อย่างไรก็ตามคุณสามารถเปลี่ยนลำดับการประเมินได้ ...
เครื่องมือในกล่องเครื่องมือของเราที่สามารถเปลี่ยนลำดับของการประเมินได้คือตัวดำเนินการจัดกลุ่ม (หรือที่เรียกว่าวงเล็บ) ทำได้โดยการตรวจสอบว่านิพจน์ในวงเล็บได้รับการประเมินก่อนการดำเนินการภายนอกวงเล็บ นั่นคือทั้งหมดที่พวกเขาทำ แต่ก็เพียงพอแล้ว
วงเล็บใช้งานได้เพราะ (ตัวดำเนินการจัดกลุ่ม) มีลำดับความสำคัญสูงกว่าตัวดำเนินการอื่น ๆ ทั้งหมด ("ขณะนี้มีระดับ 0")
เพียงแค่เพิ่มวงเล็บคุณสามารถเปลี่ยนลำดับของการประเมินผลเพื่อให้แน่ใจว่าการทดสอบตามเงื่อนไขจะดำเนินการก่อนก่อนที่จะทำการต่อสายอักขระอย่างง่าย:
h.className = h.className + (h.className ? ' error' : 'error')
ตอนนี้ฉันจะปล่อยให้คำตอบนี้เป็นสนิมที่ไม่มีใครเห็น :)
h.className += ' error'
ๆ แต่ก็ยังเว้นช่องว่างไว้ที่จุดเริ่มต้นของสตริงหากในตอนแรกว่างเปล่า ฉันเชื่อว่าจุดสำคัญของการดำเนินการสามส่วนคือการสร้างสตริงที่ดูสะอาดตา