2010-04-21 55 views
7

Dưới đây là các câu lệnh javascript sẽ gây ra lỗi, nếu ga không được khai báo.Lý do tại sao Tuyên bố JavaScript "ga = ga || []" Hoạt động?

if (ga) 
{ 
    alert(ga); 
} 

Lỗi này là:

ga is not defined 

Có vẻ biến chưa được khai báo không thể được công nhận trong biểu bool. Vì vậy, tại sao tuyên bố dưới đây hoạt động?

var ga = ga || []; 

Với tôi, ga được coi là giá trị bool trước "||". Nếu nó sai, biểu thức sau "||" được gán cho ga cuối cùng.

+0

Ý của bạn là 'var ga = ga || [] 'vì' ga = ga || []; 'lỗi quá (như S.Mark chỉ ra). – R0MANARMY

+0

Cảm ơn bạn đã chỉ ra điều này. Tôi đã cập nhật câu hỏi. –

+3

Tôi nghĩ rằng đó là ga = ga || oh.la = la; muốn (yourBadRomance); –

Trả lời

3

Chỉnh sửa: Bạn cần sử dụng var ga; trước hoặc var ga = ga || [];, vì khai báo ga trước và gán giá trị vào đó.

Bạn có thể thử này

var x = 1, y = x + 1; 
alert([x,y]) // 1,2 

Bạn có thể nhận thấy, khi y là tuyên bố, x đã được công bố và đã giao từ 1 tới nó.

Vì vậy, trong trường hợp của bạn, khi ga || [] chuyển nhượng, ga đã được tuyên bố và biến hợp lệ của nó.

+0

Rất tiếc, tôi quên "var". Câu hỏi được cập nhật. –

+2

vâng, bởi vì, khi bạn sử dụng 'var', khai báo đầu tiên và phép gán sẽ xảy ra sau này. – YOU

+0

nhận được 2 downvotes ..., vì vậy ai đó có thể xin vui lòng chỉ ra câu trả lời của tôi là sai? Vì vậy, tôi có thể sửa nó. – YOU

4

null hoặc định nghĩa là những giá trị falsey trong javascript (ngầm ước lượng là false.) Sự || toán tử trả về giá trị đầu tiên không đánh giá sai.

var x = 0 || "" || null || "hello" || false; // x equals "hello" 

Mặt khác các nhà điều hành & & sẽ trả về giá trị falsey đầu tiên hoặc giá trị cuối cùng.

var y = "a string" && {"attr":"an object"} && false && ["array"]; 
// y equals false 

var z = "a string" && {"attr":"an object"} && ["array"]; 
// z equals ["array"] 
0

Trong câu lệnh thứ hai ga được chọn nếu nó được xác định và nếu đúng, được gán cho chính nó. Nếu không, nó được gán một giá trị rỗng.

1

Điều này hoạt động trong trường hợp có 'var' vì biến dừng trong độ phân giải phạm vi được tạo. Nếu không có 'var' bạn chỉ cần chạy ra ngoài tìm kiếm thông qua các chuỗi phạm vi và bạn nhận được thông báo. Nếu bạn thực sự muốn sử dụng một biến toàn cầu:

// This is fine because assignment always sets a property value 
// in this case (no 'var ga') it's the same as window.ga = window.ga || [] 
ga = window.ga || [] 

Hoặc:

// Once again, only the lookup is affected with "running off" 
// the lookup chain. It's not that the variable has no value -- 
// the problem is there IS NO VARIABLE. 
if (!window.ga) { 
    ga = [] 
} 

Hoặc ngay cả điều này:

// First line is the same as window.ga = window.ga, 
// but now the property ga is guaranteed to exist on the window object -- 
// the VALUE of the property may (still) be undefined 
ga = window.ga 
ga = ga || [] 

Lưu ý rằng trong cả hai trường hợp này tôi dứt khoát gọi ga như một thuộc tính của đối tượng window (toàn cầu).

Bạn có thể đọc về các chi tiết ở đây: Identifier Resolution, Execution Contexts and Scope Chains.

Vị trí của var trong phạm vi không quan trọng.Tất cả những điều sau đây đều giống nhau:

var ga 
ga = ga || [] 

var ga = ga || [] 

ga = ga || [] 
var ga 
1

Có thể là một lựa chọn ít lạ-looking:

if (typeof ga !== 'undefined') 
{ 
    alert(ga); 
} 
0

Bạn đang mong đợi b là một mảng, lẽ bạn muốn sử dụng một phương pháp mảng trên b hoặc đọc giá trị chỉ mục từ nó.

var b= s.match(/\d+/) || []; 
return b[0]; 

này trả về văn bản phù hợp hoặc undefined-

mà không assignmentment mảng trống rỗng, dòng thứ hai sẽ ném ra một lỗi nếu không có trận đấu.

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