2012-02-15 34 views
5

Vì vậy, tôi có mã, nó không được thực hiện, nhưng tất cả tôi muốn nó làm là hiển thị một hộp cảnh báo nếu tôi viết từ 'trợ giúp', và nói cái gì khác nếu bất cứ điều gì khác được nhập .nếu tuyên bố trong javascript luôn đúng

function prompter() { 
var reply = prompt("This script is made to help you learn about new bands, to view more info, type help, otherwise, just click OK") 
if (reply === 'help' || 'Help') 
    { 
    alert("This script helps you find new bands. It was originally written in Python 3.0.1, using Komodo IDE, but was then manually translated into Javascript. Please answer the questions honestly. If you have no opinion on a question, merely press OK without typing anything.") 
    } 
else 
    { 
    alert("Press OK to continue") 
    } 
}; 

nhưng, điều gì xảy ra, bất kể nội dung gì, hộp cảnh báo đầu tiên bật lên, ngay cả khi bạn nhấn hủy! Tôi nên sửa lỗi này như thế nào ???

+0

Tôi đặt cược điều này xảy ra với rất nhiều người ... câu hỏi hay, tôi chưa bao giờ thấy nó ở đây trước đây! – Purag

Trả lời

11
if (reply === 'help' || 'Help') 

nên là:

if (reply === 'help' || reply === 'Help') 

từ 'Help' là "truthy" và do đó phần đầu của if sẽ luôn luôn được nhập vào.

Tất nhiên, thậm chí tốt hơn là nên làm một so sánh case-insensitive:

if (reply.toLowerCase() === 'help') 

Ví dụ:http://jsfiddle.net/qvEPe/

+0

'Trợ giúp' không đúng sự thật trong trường hợp này, bởi vì không có '==' - xem câu trả lời của tôi. Tuy nhiên, 'Trợ giúp' là đúng, bởi vì chuỗi là 'true' trừ khi có toán tử '==' xung quanh. –

+2

@TimothyJones: Tôi không chắc đó là chính xác. Không phải là boolean, ''Help'' không thể đơn giản là' true'. Tuy nhiên, nó bị ép buộc thành 'true' khi đánh giá. Nói cách khác, gõ cưỡng chế xảy ra có hay không một '==' là hiện tại. –

+0

@AndrewWhitaker Có, các chuỗi bị ép buộc là true, trừ khi chúng trống. Tuy nhiên, 'tính trung thực' trong Javascript chỉ xảy ra khi có hiện diện '== '(tính trung thực là do Thuật toán so sánh bình đẳng trừu tượng, mà bạn có thể tìm thấy trong Đặc tả ECMAScript, ấn bản thứ 5 11.9.3). Vì vậy, chuỗi '" 0 "' cũng bị ép buộc thành true trừ khi có '==' xung quanh. Thật sai lầm khi mô tả các chuỗi nói chung là trung thực hay không - vì sự thật chỉ xảy ra trong các so sánh '== '. –

1

Lý do tại sao nó luôn luôn bật lên là reply === 'help' || 'Help' đánh giá như (reply === 'Help') || ('Help'). Chuỗi chữ Help luôn là sự thật trong Javascript do đó nó luôn luôn đánh giá đúng sự thật.

Để khắc phục điều này, bạn cần phải so sánh reply để cả hai giá trị

if (reply === 'help' || reply === 'Help') { 
    ... 
} 

Hoặc nếu bạn muốn bất kỳ biến thể trường hợp giúp sử dụng một regex

if (reply.match(/^help$/i)) { 
    ... 
} 
2

Vấn đề là ở đây:

if (reply === 'help' || 'Help') // <-- 'Help' evaluates to TRUE 
           //  so condition is always TRUE 

Nhà điều hành bình đẳng không "phân phối", hãy thử

if (reply === 'help' || reply === 'Help') 
1

Chỉ cần thay đổi này: if (reply === 'help' || 'Help')

Để này: if (reply === 'help' || reply === 'Help')

Tuyên bố or đã không so sánh các biến.

0

Vấn đề là dòng này:

if (reply === 'help' || 'Help') 

Bởi vì trong JavaScript, các đối tượng và chuỗi không trống để đánh giá đúng khi sử dụng như một boolean. Có một vài trường hợp ngoại lệ này khi sử dụng ==

if("0") // true 
if("0" == true) // false 

Nói chung, nó không phải là một ý tưởng tốt để sử dụng == hoặc thô biến trong câu lệnh if.

Như những người khác đã chỉ ra, sử dụng

if (reply === 'help' || reply === 'Help') 

Hoặc tốt hơn:

if (typeof reply === 'string' && reply.toLowerCase() === 'help') 

để thay thế.

+0

Chuỗi không trống là trung thực, không đúng - nếu không '" chuỗi "=== true' sẽ đánh giá là' true'. – nnnnnn

+0

@nnnnnn Bạn nói đúng. Tôi đã nghĩ rằng hầu hết sử dụng sự thật trong Javascript cũng được gọi là "0", nhưng một google nhanh chóng cho thấy đó không phải là trường hợp. Tôi sẽ cập nhật nó. –

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