2010-09-14 31 views
8

Có cách nào thú vị để bắt đầu một mảng nếu chưa được khởi tạo không? Hiện nay mã trông giống như sau:Cách thanh lịch để bắt đầu và mở rộng một mảng javascript

if (!obj) var obj = []; 
obj.push({}); 

mát mẻ sẽ là một cái gì đó giống như var obj = (obj || []).push({}), nhưng điều đó không làm việc :-(

+0

Um ... Thats một vị trí lẻ cho 'var obj' .. sau' if (! obj) ', không có ý nghĩa gì nhiều, là' obj' cũng được định nghĩa trong một phạm vi cao hơn hay cái gì đó? – gnarf

+0

javascript không init phạm vi bên trong nếu/else – sod

+0

Tôi biết điều này, đó là lý do tại sao tôi tự hỏi tại sao bạn có thể định nghĩa một điều kiện 'var' như thế ... Tôi giả sử' obj' có lẽ là một hàm tham số, và từ khóa 'var' trong đó chỉ là vô ích/không mong muốn ... Nếu không, không có cách nào' obj' có thể được định nghĩa trước cuộc gọi này ... Thử 'obj = {}; (function() {if (! obj) var obj = []; console.log (obj);})(); '- Bạn sẽ nhận được' [] ' – gnarf

Trả lời

12

var obj = (obj || []).push({}) không hoạt động vì lợi nhuận push chiều dài mới của mảng Đối với. một đối tượng mới, nó sẽ tạo ra obj với giá trị 1. Đối với một đối tượng hiện nó có thể nâng cao một lỗi - nếu obj là một con số, nó không có một chức năng push

Bạn nên làm OK với:.

var obj = obj || []; 
obj.push({}); 
+1

Một lớp lót sillier '(obj = obj || []) && obj.push ({}) && obj' có thể làm những gì anh ấy đang tìm kiếm ... – gnarf

+0

@gnarf - Ý tưởng thú vị. Nếu tôi hiểu đúng, dòng vẫn bắt đầu bằng 'var obj ='. – Kobi

2

Điều tốt nhất tôi có thể nghĩ đến là:

var obj; 
(obj = (obj || [])).push({}); 
+0

ngoại trừ ngầm, 'obj' * nên * luôn luôn không được xác định trong trường hợp này, làm cho' (obj || []) 'chỉ' [] ' – gnarf

+0

Không. 'var obj;' sẽ không đặt 'obj' thành' undefined' nếu nó đã được 'định nghĩa' trước đó. – RoToRa

+0

Trừ khi bạn đang sử dụng 'var obj' hai lần trong cùng một phạm vi, mà chỉ có vẻ như một sự lãng phí của' var' cho tôi ... – gnarf

0
with(obj = obj || []) push({}); 
+0

Tôi nghĩ rằng chỉnh sửa trước của bạn là cấp trên: '(obj || [{}]) 'là chức năng. – annakata

+0

-1: erk! không bao giờ * bao giờ * sử dụng tính năng "có" của Javascript. – Spudley

+0

Tôi sợ phải sử dụng câu lệnh 'with' như Douglas Crockford đã nói với tôi (http://yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/) rằng những điều xấu có thể xảy ra khi sử dụng nó – sod

0

Chỉ cần một tinh chỉnh nhỏ để ý tưởng của bạn để làm cho nó hoạt

var obj = (obj || []).concat([{}]); 
+0

Mặc dù, 'concat' thực sự trả về một mảng hoàn toàn mới ...Có nghĩa là nếu obj đã được xác định (mà tôi vẫn tò mò làm thế nào mà có thể xảy ra), nó sẽ không có '{}' thêm vào nó trong bất kỳ phạm vi cha mẹ ... – gnarf

+0

Đó là sự thật, nhưng không có thông tin phạm vi trong bản gốc câu hỏi. Ngoài ra, kể từ khi anh ta sử dụng một tuyên bố nhiệm vụ trong nỗ lực của mình, đột biến rõ ràng không phải là một yêu cầu. –

+0

Bản gốc của anh ta có vẻ như là trạng thái: 'obj' nên ở nguyên, hoặc trở thành một mảng trống, sau đó' đẩy' cái gì đó vào nó ... Vấn đề là 'push' sẽ không xảy ra trên' obj' gốc vì vậy nếu 'obj' đó là tham chiếu đến một mảng khác, hoặc tham số hàm, v.v ... mã của bạn sẽ không làm như vậy ... – gnarf

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