2009-04-02 52 views
8

Một nguồn tin dự án JavaScript mở tôi làm việc trên bao gồm mã:Javascript: Tại sao so sánh với null?

if (color) { 
     tapeDiv.style.backgroundColor = color; 
     // set color here if defined by event. Else use css 
    } 

Một đóng góp muốn thay đổi nó để

if (color != null) { // this line changed 
     tapeDiv.style.backgroundColor = color; 
     // set color here if defined by event. Else use css 
    } 

màu là một chuỗi var. Chỉ sử dụng một chuỗi gồm nhiều hơn 0 ký tự để đặt màu rõ ràng.

Vì JS xử lý "" và null là boolean false, tại sao so sánh! = Null là cần thiết?

Tôi có thiếu thứ gì đó khi nghĩ rằng biểu mẫu đầu tiên chỉ tốt (và ngắn hơn một chút) so với giây không?

Tôi thấy so sánh với null khá thường xuyên trong nguồn JS. Tại sao chúng cần thiết khi tất cả các đối tượng JS đơn giản có kết quả đã biết khi cast như boolean?

Cảm ơn,

Larry

ps. Tôi cho rằng nếu 0 (một số nguyên) là một trường hợp hợp lệ, thì nếu (0) là sai [một vấn đề] và nếu (0! = Null) là đúng [cho phép 0 trường hợp]. Có lý do nào khác không?

pps. Nên đã đề cập rằng tapeDiv ​​mới được tạo ra. Vì vậy, không có điểm để đặt lại kiểu thành "" vì div là thương hiệu mới.

Trả lời

5

Không, và ps của bạn là chính xác. Null sẽ đánh giá sai, và nếu null cần được phân biệt với chuỗi rỗng hoặc 0, thì bạn sẽ thực hiện kiểm tra null.

Hoặc nó chỉ có thể được cho rõ ràng. Đó là mô tả hơn để cho biết rằng bạn đang tìm kiếm một cách cụ thể.

+0

Với tôi, tôi muốn có mã ngắn hơn một chút và giả sử người đọc hiểu được đẳng cấp và logic logic. Có lẽ đó chỉ là lập trình viên Ruby trong tôi. Nó có thể là truyền thống trong js để đánh vần mọi thứ ra một cách chi tiết hơn ... –

+0

Không thường xuyên. Hãy nhớ rằng nguồn của JS thực sự được tải xuống, vì vậy ngắn gọn là một dấu cộng. Và tôi đồng ý với Larry. Không được sử dụng để tránh nhận dạng cách JS nhập và truyền các tác phẩm. – user37078

1

Nền backgroundColor = "" có làm gì không? Điều đó có đặt màu thành màu mặc định không? Nếu đó là trường hợp, sau đó nó sẽ có ý nghĩa, như một cách để thiết lập lại màu sắc.

nếu (màu) {}

sẽ không thành công nếu màu "", nhưng trong trường hợp thứ 2, nó sẽ đặt lại màu nền.

0

Nếu màu có thể là một số nguyên, bạn không thể đặt nền thành màu đen (#000000 = 0).

+1

Nhưng jpot (bên dưới) có sự hiểu biết rằng việc thiết lập kiểu 0 không cho màu đen trên FF, vì vậy nó không nên được sử dụng. –

18

Đánh giá sự phân công với tất cả các giá trị falsy càng tốt và bạn sẽ nhận được câu trả lời của bạn:

tapeDiv.style.backgroundColor = false; // does nothing 

tapeDiv.style.backgroundColor = 0;  // sets as "black", 
             // but ignored by FF 

tapeDiv.style.backgroundColor = null; // resets the background-color 
             // to use whatever is defined 
             // in a stylesheet (if any), 
             // but ignored by IE. 

tapeDiv.style.backgroundColor = ''; // resets the background-color 
             // to use whatever is defined 
             // in a stylesheet (if any). 

Vui lòng cung cho "if (color)" sẽ không cho phép bất kỳ trong số họ thông qua.

Kiểm tra "if (color != null)" sẽ cho phép 1), 2) và 4) thông qua. 1) không làm bất cứ điều gì, 2) sẽ không hoạt động như mong đợi trong Firefox và 4) sẽ luôn hoạt động như mong đợi. Tuy nhiên, "công trình" phụ thuộc vào ngữ cảnh của bạn (mà bạn không cung cấp).

Hy vọng điều đó sẽ hữu ích.

+1

Đây là câu trả lời toàn diện nhất. Trọng lực không quan trọng hơn hành vi xác định. –

0

Chỉ sử dụng một chuỗi hơn 0 ký tự để đặt màu rõ ràng.

Tại sao? Gán chuỗi rỗng nghĩa là màu sẽ được đặt lại (tức là giá trị mặc định do CSS xác định sẽ được sử dụng), một trường hợp sử dụng hoàn toàn hợp lệ.

Tất cả bạn cần làm là kiểm tra xem color được định nghĩa, tức là

typeof color !== 'undefined' 

hoặc nếu đó là một chuỗi biến

// checks for primitive strings 
typeof color === 'string' 

// checks for primitive strings and string objects 
typeof color === 'string' || color instanceof String 

// checks for primitive strings and string objects, cross-frame safe 
Object.prototype.toString.call(color) === '[object String]' 

nếu nó có thể chứa các giá trị của loại hình không chính xác.

0

if (typeof màu == 'chuỗi' & & color.length)

Đối typeof là đủ để sử dụng "==" và nếu typeof là chuỗi sau đó nó sẽ kiểm tra color.length. Nếu không, nó sẽ thoát ra nếu trước khi kiểm tra điều kiện thứ hai. Điều này tôi tin là giải pháp hoàn chỉnh nhất.

Nhưng nếu bạn chắc chắn màu là biến chuỗi và được xác định ở đâu đó trước khi được khởi tạo, thì bạn có thể sử dụng "if (color)" như bạn đã làm, nhưng hãy nhớ rằng nếu màu không được xác định tại thời điểm của câu lệnh if, bạn sẽ nhận được một ReferenceError.

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