2013-03-20 40 views
5

Tôi muốn tạo đối tượng Javascript với các biến lồng nhau trong đó một số biến sẽ không có giá trị mặc định được chỉ định.Khai báo các biến không có giá trị

Tôi hiện có này:

var globalVarA = "foo"; 
var globalVarB = "bar"; 
var globalVarC; 

function myFunction(){ 
    //do something 
} 

tôi muốn thay đổi điều này để:

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 

Tuy nhiên tôi nhận được lỗi sau:

Expected ':'

Làm thế nào tôi có thể khai báo biến này không có giá trị?

Đây có phải là phương pháp hay nhất hoặc có giải pháp thay thế tốt hơn không?

Trả lời

12

Nếu bạn muốn xác định các biến như tính chất của GlobalVars bạn phải gán một cách rõ ràng undefined cho họ

GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: undefined 
    }, 

Mã của bạn chứa ký hiệu không hợp lệ, khi sử dụng ký hiệu literal đối tượng bạn phải chỉ định một giá trị cho mỗi biến. Điều này không giống như các ký pháp khác như XML hoặc formParams, nơi bạn có thể khai báo một thuộc tính/thuộc tính mà không cần thiết lập nó.

Lưu ý rằng trong biến giải pháp không xác định của tôi có giá trị mặc định - giá trị đó chỉ là giá trị nguyên thủy undefined là giá trị được trả về theo mặc định cho các biến không được xác định.

Tuy nhiên, biến của bạn không được xác định nếu bạn làm globalVarC: undefined

GlobalVars.globalVarC;//undefined 
GlobalVars.globalVarX;//undefined 
GlobalVars.hasOwnProperty("globalVarC");//true 
GlobalVars.hasOwnProperty("globalVarX");//false 

Từ spec:

4.3.9 undefined value:

primitive value used when a variable has not been assigned a value.

+0

Chỉ trên ghi chú bên. Điều gì sẽ là nhược điểm để không tuyên bố 'globalVarC' ở tất cả cho đến khi nó được yêu cầu? Vì bạn có thể đặt 'GlobalVars.globalVarC =" bất cứ điều gì "; ' ngay cả khi nó không được khai báo. –

+1

@TimBJames là một câu hỏi tuyệt vời. Ví dụ, sự khác biệt có thể được thể hiện trong một kiểm tra 'hasOwnProperty'. Cá nhân, nếu nó chỉ để sử dụng trong hàm đó, trong mã của riêng tôi, tôi sẽ làm 'GlobalVars.globalVarC' thay vì thiết lập rõ ràng nó thành undefined. –

+0

Vâng tôi có lẽ sẽ đi với cũng, bởi vì nếu bạn đang kiểm tra sự tồn tại của biến, bạn sẽ kiểm tra 'if (GlobalVars.globalVarC! = undefined) 'đó sẽ là trường hợp một trong hai cách. –

1

Bạn cần phải xác định một giá trị cho globalVarC khác cú pháp javascript cho json sẽ sai, vì bạn không có bất kỳ giá trị nào để khởi tạo, bạn có thể cung cấp giá trị undefined.

undefined là biến toàn cầu với giá trị nguyên thủy undefined.

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: undefined 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 
0

Bạn sẽ muốn undefined giá trị nguyên thủy là giá trị mặc định:

var myObject = { 
    GlobalVars: { 
    globalVarA: "foo", 
    globalVarB: "bar", 
    globalVarC: void 0 
    }, 
    myFunction: function(){ 
    //do something 
    } 
} 

Khái niệm void 0 cho giá trị của undefined, bất kể undefined được "định tuyến".

+0

Chỉ cần tự hỏi .. Điều đó không gọi trình biên dịch JS trên giá trị 0? Tôi không bao giờ thực sự có lý do tại sao bạn sẽ thay đổi giá trị của undefined. Trên cùng một dòng suy nghĩ, người ta có thể thay đổi giá trị của Function.prototype.call. Bạn có tự làm điều này trong mã sản xuất không? Những lợi thế nào nó cung cấp? Tôi hy vọng điều này không đến như là tích cực, tôi thực sự quan tâm đến lý do tại sao bạn muốn làm điều đó. –

+0

@BenjaminGruenbaum Bạn có ý gì bằng cách "gọi trình biên dịch về giá trị 0"? Đối với việc thay đổi 'undefined', chắc chắn không ai có lý do chính đáng để làm điều đó ;-) –

+0

toán tử' void' gọi trình biên dịch JavaScript trên biểu thức sau (trong trường hợp này là '0' được gán thành' "0" 'và trả về 'undefined'). https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/void. Gọi trình biên dịch có vẻ hơi cực đoan trong trường hợp này là imho. Thậm chí 'globalVarC: (function() {var a; return a;})()' có vẻ sạch hơn. Tôi sẽ tạo một sự hoàn hảo :) –

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