Tôi biết đây là một câu hỏi rất cũ, nhưng tôi không hài lòng 100% với bất kỳ câu trả lời nào vì tất cả chúng đều có vẻ không đầy đủ. Vì vậy, ở đây chúng tôi đi lại từ các hiệu trưởng đầu tiên:
Mục tiêu chung của người dùng:
Tóm tắt đoạn mã: "Tôi muốn thêm error
tên lớp vào một chuỗi, tùy chọn với khoảng trắng ở đầu nếu đã có tên lớp trong chuỗi."
Giải pháp đơn giản nhất
Như Kobi đã chỉ ra, cách đây 5 năm, việc có khoảng trắng hàng đầu trong tên lớp sẽ không gây ra bất kỳ vấn đề nào với bất kỳ trình duyệt đã biết nào, vì vậy giải pháp chính xác ngắn nhất thực sự sẽ là:
h.className += ' error';
Đó là cần phải có được những câu trả lời thực tế để các vấn đề thực tế .
Có thể như vậy, các câu hỏi được đặt ra là ...
1) Tại sao nó hoạt động?
h.className += h.className ? ' error' : 'error'
Toán tử có điều kiện / bậc ba hoạt động giống như một câu lệnh if, gán kết quả của nó true
hoặc false
các đường dẫn đến một biến.
Vì vậy, mã đó đã hoạt động vì nó được đánh giá đơn giản là:
if (h.className IS NOT null AND IS NOT undefined AND IS NOT '')
h.className += ' error'
else
h.className += 'error'
2) và tại sao điều này bị phá vỡ?
h.className = h.className + h.className ? ' error' : 'error'
Câu hỏi nêu rõ "lỗi [n] trong bảng điều khiển của tôi", điều này có thể khiến bạn hiểu nhầm rằng mã không hoạt động . Trong thực tế các mã sau đây không chạy, không lỗi , nhưng nó chỉ đơn giản là lợi nhuận 'lỗi' nếu chuỗi không trống rỗng và 'lỗi' nếu chuỗi là rỗng và do đó chưa đáp ứng được yêu cầu .
Mã đó luôn dẫn đến một chuỗi chỉ chứa ' error'
hoặc 'error'
vì nó đánh giá thành mã giả này:
if ((h.className + h.className) IS NOT null AND IS NOT undefined AND IS NOT '')
h.className = ' error'
else
h.className = 'error'
Lý do cho điều này là toán tử cộng ( +
dân gian thông thường) có "mức độ ưu tiên" cao hơn (6) so với toán tử điều kiện / bậc ba (15). Tôi biết những con số xuất hiện ngược lại
Ưu tiên đơn giản có nghĩa là mỗi loại toán tử trong một ngôn ngữ được đánh giá theo một thứ tự xác định trước cụ thể (và không chỉ từ trái sang phải).
Cách thay đổi thứ tự đánh giá:
Bây giờ chúng ta biết tại sao nó không thành công, bạn cần biết cách làm cho nó hoạt động.
Một số câu trả lời khác nói về việc thay đổi mức độ ưu tiên , nhưng bạn không thể . Ưu tiên là ngôn ngữ khó có. Đó chỉ là một bộ quy tắc cố định ... Tuy nhiên, bạn có thể thay đổi thứ tự đánh giá ...
Công cụ trong hộp công cụ của chúng tôi có thể thay đổi thứ tự đánh giá là toán tử nhóm (còn gọi là dấu ngoặc). Nó thực hiện điều này bằng cách đảm bảo các biểu thức trong ngoặc được đánh giá trước các hoạt động bên ngoài ngoặc. Đó là tất cả những gì họ làm, nhưng như vậy là đủ.
Dấu ngoặc hoạt động đơn giản vì chúng (toán tử nhóm) có mức độ ưu tiên cao hơn tất cả các toán tử khác ("bây giờ có mức 0").
Chỉ cần thêm dấu ngoặc, bạn sẽ thay đổi thứ tự đánh giá để đảm bảo kiểm tra điều kiện được thực hiện trước, trước khi nối chuỗi đơn giản:
h.className = h.className + (h.className ? ' error' : 'error')
Bây giờ tôi sẽ để câu trả lời này để rỉ sét trong số những người khác :)
h.className += ' error'
, nhưng nó cũng để lại một khoảng trống ở đầu chuỗi nếu ban đầu nó trống. Tôi tin rằng điểm của hoạt động bậc ba là tạo ra một chuỗi trông sạch sẽ.