Lý do thường gặp các lỗi:
- sử dụng chuyển nhượng (
=
) thay vì bình đẳng (==
/===
)
- gán là kết quả của chức năng
foo() = 42
thay vì lập luận đi qua (foo(42)
)
- chỉ thiếu tên thành viên (ví dụ: giả sử một số lựa chọn mặc định):
getFoo() = 42
thay vì getFoo().theAnswer = 42
hoặc chỉ mục mảng ing getArray() = 42
thay vì getArray()[0]= 42
Trong trường hợp này bạn muốn sử dụng ==
(hoặc tốt hơn ===
-What exactly is Type Coercion in Javascript?) để kiểm tra đẳng thức (như if(one === "rock" && two === "rock")
, nhưng nó trở thành lý do thực tế bạn đang nhận được lỗi này là phức tạp hơn.
Lý do lỗi là Operator precedence. Đặc biệt, chúng tôi đang tìm kiếm &&
(ưu tiên 6) và =
(ưu tiên 3).
Hãy đặt dấu ngoặc trong biểu thức theo ưu tiên - &&
cao hơn =
vì vậy nó được thực hiện đầu tiên tương tự như cách người ta sẽ làm gì 3+4*5+6
như 3+(4*5)+6
:
if(one= ("rock" && two) = "rock"){...
Bây giờ chúng ta có biểu hiện tương tự như nhiều bài tập như a = b = 42
do liên kết từ phải sang trái được thực hiện dưới dạng a = (b = 42)
. Vì vậy, bổ sung thêm niềng răng:
if(one= ( ("rock" && two) = "rock") ){...
Cuối cùng chúng tôi đến để vấn đề thực tế: ("rock" && two)
không thể được đánh giá để l-giá trị có thể được giao cho (trong trường hợp đặc biệt này nó sẽ được giá trị của two
như truthy) .
Lưu ý rằng nếu bạn sử dụng niềng răng để khớp với mức độ ưu tiên nhận thấy xung quanh mỗi "bình đẳng" với niềng răng, bạn sẽ không bị lỗi.Rõ ràng đó cũng sản xuất kết quả khác nhau hơn bạn mong muốn - thay đổi giá trị của cả hai biến và hơn làm &&
trên hai chuỗi "rock" && "rock"
dẫn đến "rock"
(mà trong lần lượt là truthy) tất cả các thời gian do hành vi của logial &&:
if((one = "rock") && (two = "rock"))
{
// always executed, both one and two are set to "rock"
...
}
Đối thậm chí thêm chi tiết về các lỗi và các trường hợp khác khi nó có thể xảy ra - xem đặc điểm kỹ thuật:
Assignment
LeftHandSideExpression = AssignmentExpression
...
Throw a SyntaxError exception if the following conditions are all true:
...
IsStrictReference(lref) is true
Left-Hand-Side Expressions
và The Reference Specification Type giải thích IsStrictReference:
... function calls are permitted to return references. This possibility is admitted purely for the sake of host objects. No built-in ECMAScript function defined by this specification returns a reference and there is no provision for a user-defined function to return a reference...
Ba "trói" các trường hợp có thể được đơn giản hóa thành một đơn 'nếu (một == hai)' –