2011-01-02 28 views
24

Tôi đã đọc một số bài báo gần đây tôi đọc từ Opera.Javascript || hoặc nhà điều hành với biến không xác định

http://dev.opera.com/articles/view/javascript-best-practices/

Trong bài viết mà họ viết này:

Một tình huống phổ biến trong JavaScript đang cung cấp một giá trị đặt trước cho một biến nếu nó không được định nghĩa, như vậy:

if(v){ 
    var x = v; 
} else { 
    var x = 10; 
} 

Ký hiệu phím tắt cho điều này là nhân vật ống kép:

var x = v || 10; 

Đối với một số lý do tôi không thể có được điều này để làm việc cho tôi. Có thực sự có thể kiểm tra xem nếu v được xác định, nếu không x = 10?

--Cảm ơn. Bryan

+0

Các công trình lớn! Tôi làm điều đó mỗi ngày. – Hemlock

+0

Ý bạn là nó không phù hợp với bạn? Bạn có thể xây dựng? Không có giải pháp nào của bạn hoạt động khi v = 0 đó là một thực tế khác. – lazyboy

+0

nếu bạn làm việc cụ thể với các số nguyên thì bạn nên sử dụng 'var x = v> 0? v: 10' – RobertPitt

Trả lời

47

Bài viết trên Opera đó mô tả không đúng về những gì đang diễn ra.

Mặc dù đúng là x sẽ nhận được giá trị 10 nếu vundefined. Cũng đúng là x sẽ là 10 nếu vgiá trị bất kỳ "falsey".

Các "falsey" giá trị trong javascript là:

  • 0
  • null
  • undefined
  • NaN
  • "" (chuỗi rỗng)
  • false

Vì vậy, bạn có thể thấy rằng có nhiều trường hợp trong đó x sẽ được đặt thành 10 bên cạnh chỉ undefined.

Here's some documentation nêu chi tiết toán tử logic. (Cái này là "hợp lý HOẶC".) Nó đưa ra một vài ví dụ về cách sử dụng nó cho một nhiệm vụ như vậy.

nhanh Ví dụ: http://jsfiddle.net/V76W6/

var v = 0; 

var x = v || 10; 

alert(x); // alerts 10 

Gán v bất kỳ giá trị falsey mà tôi đã nêu ở trên, và bạn sẽ nhận được kết quả tương tự.

+0

Cảm ơn câu trả lời này, vì vậy bạn nghĩ tốt nhất nên làm: var v = false; var x = v || 10; cảnh báo (x)? –

+2

Một cách khác để mô tả những gì được thực hiện là: http://jsfiddle.net/robertpitt/V76W6/1/ – RobertPitt

+0

@bryan: Không cần gán 'false' cho' v'. Nếu bạn chỉ đơn giản là 'var v;', nó sẽ tự động có một giá trị ban đầu của 'undefined', vì vậy nếu' v' nhận được một số giá trị không khác, 'x' sẽ được gán giá trị đó. Nhưng nếu 'v' không được gán bất cứ thứ gì, hoặc nhận giá trị falsey khác,' x' sẽ nhận '10'. Hãy nhớ rằng '0' là falsey. Bạn chỉ nên sử dụng "OR hợp lý" theo cách này nếu bạn hoàn toàn chắc chắn rằng bạn không muốn 'x' có * bất kỳ giá trị * falsey nào. – user113716

1

tôi sẽ chỉ cần sử dụng một try-catch

var x = 0; 

try 
{ 
    x = v; 
} 
catch(err) 
{ 
    x = 10; 
} 
5

Nếu v là false (ví dụ, 0, null, false) sau đó nó sẽ không hoạt động. Bạn có thể kiểm tra theo cách thủ công cho undefined:

var x = v !== undefined ? v : 10; 
+0

bạn cũng có thể kiểm tra bằng tay 0, null, false, "", NaN:/ – RobertPitt

0

Dưới đây là làm thế nào để có được nó làm việc:

var v;   //declare v as undefined 
// v = 5;  //if uncommented x will be 5 

var x = v || 10; 
alert(x);  //output: 10 

http://jsfiddle.net/uLLtu/1/

+1

các tài liệu sẵn sàng công cụ là không cần thiết btw. –

+1

Chỉ vì lợi ích của một vài người nắm giữ vẫn không thấy "javascript" và nghĩ "jquery", '$ (function() {...});' là những gì Eric gọi là "tài liệu sẵn sàng" ; đó là viết tắt của jQuery cho '$ (document) .ready (function() {...});', được (thường) được gọi khi DOM tải xong (nhưng trước sự kiện 'load' trên' window'). Tôi không chắc tại sao nó lại được đưa vào câu trả lời này ngay từ đầu. – eyelidlessness

+0

@eyelidlessness Cảm ơn bạn đã làm rõ, bạn đúng không cần nó, tôi chỉ quên xóa chúng, tôi lần đầu tiên sử dụng đánh dấu để minh họa nội dung var thay vì cảnh báo. –

8
var x = v || 10; 

điều hành đó (các "logical" or "short-circuit" OR operator) thông thường sẽ kiểm tra giá trị của v, và nếu nó là một giá trị "falsy" (tức là nó sẽ thất bại như một điều kiện được sử dụng trong một tuyên bố nếu), 10 trở thành giá trị của x, nếu không v không (và nếu 10 là một hàm, nó sẽ không bao giờ được thực hiện).

undefined, null0 là tất cả các ví dụ về giá trị giả mà biến có thể giữ (có, ngay cả giá trị đầu tiên) và toán tử (hoặc nếu câu lệnh) hoạt động tương ứng. Ngược lại, tất cả các đối tượng và mảng (không bao gồm null) là những giá trị "truthy", cho phép điều như thế này (sử dụng trong mã theo dõi Google Analytics):

var _gaq = _gaq || []; // Makes a new array _gaq if it is not already there 

Tuy nhiên, nếu biến tham chiếu là thậm chí không được khai báo ở bất kỳ đâu trong chuỗi phạm vi, khi đó một ngoại lệ JavaScript sẽ xảy ra.

Một cách để tránh điều này là bằng cách tuyên bố tất cả các biến toàn cầu của bạn ngay từ đầu:

var iAmAGlobalVariable; // Holds the value undefined by default 

Nếu đây là không thể, bạn nên sử dụng typeof operator. Nó không cố gắng để đánh giá toán hạng của nó, và do đó một ngoại lệ sẽ không xảy ra:

var x; 
if(typeof v != 'undefined' && v) { 
    x = v; 
} else { 
    x = 10; 
} 

Hoặc thậm chí tốt hơn, nếu bạn biết rằng biến sẽ là một biến toàn cầu, bạn có thể coi nó như là một tài sản của toàn cầu (cửa sổ) đối tượng:

var x = window.v || 10; 
+0

Vâng giải thích câu trả lời. –

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