2011-11-12 18 views
18

Tôi cần phải sửa đổi những dòng này để làm cho jshint vui vẻ như thế nào?Tại sao jshint không nhận ra một bài tập như một biểu thức?

Bài tập là một biểu thức. Tại sao jshint không hiểu điều này? Rõ ràng là thông dịch viên.

Line 572: while(bookmark_element=bookmark_list[iterator++]) 

Expected a conditional expression and instead saw an assignment. 


Line 582: while(bookmark_element=bookmark_list[iterator++]) 

Expected a conditional expression and instead saw an assignment. 


Line 623: while(element_iterator=element_iterator.nextSibling) 

Expected a conditional expression and instead saw an assignment. 
+0

Làm cách nào để truyền tới bool? –

Trả lời

19

Nếu bạn thực sự muốn nghe JSHint, chuyển đổi biểu thức để một boolean bởi:

while (!!(bookmark_element=bookmark_list[iterator++])) 

! means: Something that evaluates to true is converted to false, 
     something that evaluates to false is converted to true. 

Vì vậy, !! nghĩa: Chuyển đổi một cái gì đó để các đại diện có điều kiện.

+0

dễ nhất .. tôi đã đi với điều này. –

+0

không javascipt có một diễn viên để bool các loại ... someting trực tiếp hơn? –

+0

@ stack.user.0 Trực tiếp hơn '!!'? Đó là về trực tiếp như nó được: JavaScript có sự thật/falsy, nếu bạn muốn một boolean thực tế, '!!' là đặt cược dễ nhất của bạn. –

19
/*jshint boss:true */ 

Thử nghiệm với các options.

13

Tôi chắc chắn rằng jshint hiểu biểu thức tốt, nó chỉ là hầu hết những người viết if (a = b) thực sự có nghĩa là if (a == b) và do đó điều này tạo ra một cảnh báo.

Kể từ mã của bạn là những gì bạn dự định bạn có thể thêm một thử nghiệm rõ ràng:

while ((element_iterator = element_iterator.nextSibling) !== null) { ... } 
0

Nó là một biểu hiện, và bạn có thể sửa đổi nó để làm việc với JSHint (mặc dù nó không đẹp) như sau:

while(element_iterator.nextSibling) { 
    element_iterator = element_iterator.nextSibling; 

Ví dụ cuối cùng của bạn. Tuy nhiên, bạn không cần phải làm điều này. JSHint chỉ là một công cụ giúp bạn cải thiện thói quen viết mã và sửa lỗi, nhưng cho rằng những gì bạn có là rõ ràng, súc tích, và (theo ý kiến ​​của tôi) là cách tốt nhất để làm điều đó - chỉ cần bỏ qua những thông điệp đó.

0

jshint không thể biết liệu bạn có thực sự muốn thực hiện nhiệm vụ trong khối điều kiện hay không hoặc liệu điều đó có thực sự được coi là so sánh hay không. Mối quan tâm sẽ là những người khác có thể có cùng một nghi ngờ.

Trong trường hợp của trình lặp, tôi nghĩ bạn ổn.

0

Tôi có lỗi này bởi vì tôi đã có một dấu phẩy trailing trong một tuyên bố trước các chức năng:

this.foo = "bar", // <- Error was here 

this.myfunc = function() { 
    ... // <- Error reported on this line 
}; 

(Thật khó để tìm, nhưng củng cố quan điểm của tôi rằng xơ thường đúng, nó là mã của tôi đó là Nếu tôi đã vô hiệu hóa các cảnh báo trên toàn cầu - hoặc thậm chí tại chỗ đó - lỗi vẫn còn tồn tại. </lecture>)

+0

Đây không phải là cảnh báo tương tự như trong câu hỏi này. Đây là [W030] (https://github.com/jshint/jshint/blob/78b79c099fc490d93cd7aef599a1528761e9498d/src/messages.js#L112) và câu hỏi nói về [W084] (https://github.com/jshint/jshint /blob/78b79c099fc490d93cd7aef599a1528761e9498d/src/messages.js#L171). Trong khi tương tự, điều này là không thích hợp ở đây. –

3

Có ít nhất hai cách để giải quyết lỗi được báo cáo, theo số JSHint docs.

  1. Thêm /*jshint boss:true */ trước khi tuyên bố có điều kiện
  2. tuyên bố Bọc trong ngoặc thêm, tức là while ((element_iterator = element_iterator.nextSibling)) {...}

Cá nhân, tôi nghĩ rằng xung quanh với ngoặc thêm là thực hành tốt nhất vì nó giữ việc kiểm tra lỗi nhưng vẫn làm cho tinh thần tốt mã khôn ngoan. Thêm !! trước khi thực sự không có gì ngoài việc chuyển đổi biểu thức thành true/false qua lại hai lần thêm.

+0

Tuy nhiên, đáng chú ý là cảnh báo về "biến đổ bóng", đặc biệt là trong trường hợp vòng lặp for. Tham chiếu : http://jshint.com/docs/options/#shadow – PageYe

Các vấn đề liên quan