2012-10-30 21 views
28

Tôi đã thấy các ví dụ mã khác nhau với các biến được khai báo và được đặt thành undefined và null. Chẳng hạn như:Khi nào tôi có thể khởi tạo các biến trong JavaScript bằng null hay không?

var a; // undefined - unintentional value, object of type 'undefined' 
var b = null; // null - deliberate non-value, object of type 'object' 

Nếu mã theo các khai báo này gán giá trị cho hoặc đến b, lý do sử dụng một loại khai báo nào khác?

Trả lời

22

Ví dụ đầu tiên không gán bất kỳ thứ gì cho biến, do đó, nó ngầm ám chỉ giá trị undefined (xem 10.5 in the spec để biết chi tiết). Nó thường được sử dụng khi khai báo các biến để sử dụng sau này. Không cần phải chỉ định rõ ràng bất cứ điều gì cho họ trước khi cần thiết.

Ví dụ thứ hai được chỉ định rõ ràng null (thực tế là loại null, nhưng do một đặc điểm kỹ thuật JavaScript, yêu cầu có loại "đối tượng"). Nó thường được sử dụng để xóa một giá trị đã được lưu trữ trong một biến hiện có. Nó có thể được coi là mạnh mẽ hơn để sử dụng null khi thanh toán bù trừ giá trị vì nó có thể ghi đè lên undefined, và trong tình huống đó assiging undefined sẽ dẫn đến hành vi bất ngờ.

Là một sang một bên, mà những đứa của null là một lý do tốt để sử dụng một hình thức mạnh mẽ hơn của loại kiểm tra:

Object.prototype.toString.call(null); // Returns "[object Null]" 
+0

Chỉ cần một lưu ý ... tôi nghĩ rằng ' "[đối tượng Null]"' kết quả của 'toString() 'có thể có một số không tương thích của trình duyệt. –

6

Tôi chỉ thấy liên kết này mà làm rõ câu hỏi của tôi. What reason is there to use null instead of undefined in JavaScript?

Javascript dành cho nhà phát triển web tuyên bố "Khi xác định biến có nghĩa là để giữ lại đối tượng, bạn nên khởi tạo biến thành null thay vì bất kỳ điều gì khác. Bằng cách đó, bạn có thể kiểm tra giá trị một cách rõ ràng null để xác định xem biến đã được lấp đầy với một tham chiếu đối tượng sau này hay chưa. "

+3

+1 Điều đó nghe có vẻ như là một thực hành tốt để theo dõi – techfoobar

0

null là một đối tượng .. Khi một cái gì đó là undefined nó là gì .. nó không phải là một đối tượng, không phải là một chuỗi, vì nó chưa được xác định chưa rõ ràng .. .. sau đó nó chỉ đơn giản là một tài sản không có chức năng ..

ví dụ:

Bạn khai báo biến có var nhưng chưa bao giờ đặt biến.

var foo; 
alert(foo); //undefined. 

Bạn cố gắng truy cập thuộc tính trên đối tượng mà bạn chưa từng đặt.

var foo = {}; 
alert(foo.bar); //undefined 

Bạn cố gắng truy cập vào đối số không bao giờ được cung cấp.

function myFunction (foo) { 
    alert(foo); //undefined. 
} 
10

Tôi không nghĩ rằng có một cách làm tốt hơn, nhưng tôi có xu hướng tránh không xác định nhiều nhất có thể. Có lẽ đó là do một nền tảng OOP mạnh mẽ.

Khi tôi cố gắng bắt chước OOP bằng Javascript, tôi thường khai báo và khởi tạo biến của mình thành null (giống như ngôn ngữ OOP khi bạn khai báo biến mẫu mà không khởi tạo rõ ràng). Nếu tôi không khởi tạo chúng, tại sao thậm chí khai báo chúng ngay từ đầu? Khi bạn gỡ lỗi, nếu bạn chưa đặt giá trị cho biến mà bạn xem, bạn sẽ thấy giá trị đó là không xác định cho dù bạn đã khai báo hay không ...

Tôi muốn giữ undefined cho các hành vi cụ thể:

  • khi bạn gọi một phương thức, bất kỳ đối số bạn không cung cấp sẽ có một giá trị không xác định. Cách tốt để có một đối số tùy chọn, thực hiện một hành vi cụ thể nếu đối số không được xác định.
  • lười biếng init ... trong cuốn sách của tôi không xác định có nghĩa là "không được khởi tạo: đi lấy giá trị", và null có nghĩa là "khởi tạo nhưng giá trị là null (ví dụ: có thể có lỗi máy chủ?)"
  • mảng: myArray [myKey] === null nếu có giá trị null cho khóa này, không xác định nếu giá trị chưa bao giờ được đặt cho khóa này.

Hãy cẩn thận, mặc dù rằng myVar == nullmyVar == undefined trả về cùng giá trị cho dù myVar không xác định, null hoặc cái gì khác. Sử dụng === nếu bạn muốn biết nếu biến không xác định.

+0

Dòng cuối cùng, cần lưu ý rằng không có gì '===' (ba bằng) 'null' bên ngoài' null' chính nó (vì nó là một "đối tượng"). –

1

tôi một cách rõ ràng sẽ chọn null, không có một đối tượng có id sau đó sẽ bị ghi đè anyway:

var foo = {}; // empty object, has id etc. 
var foo2 = null; // good practice, // filled with an object reference at a later time 
var foo3;// undefined, I would avoid it 
console.log(typeof foo); 
console.log(typeof foo2); 
console.log(typeof foo3); 

null cũng đảm bảo khả năng đọc tốt để xác định các kiểu dữ liệu (object), kết quả trong

object 
object 
undefined 

Nguồn (JavaScript chuyên nghiệp dành cho nhà phát triển web 3rd Edition):

Khi xác định một biến có nghĩa là để giữ lại một đối tượng, nó là nên khởi tạo biến thành null thay vì bất cứ điều gì khác. Bằng cách đó, bạn rõ ràng có thể kiểm tra giá trị null để xác định xem biến đã được lấp đầy với một tham chiếu đối tượng tại một thời gian sau đó, chẳng hạn như trong ví dụ này:

if (foo2 != null){ 
    //do something with foo2 
} 

Giá trị không xác định là một dẫn xuất của null, do ECMA-262 định nghĩa chúng là một cách hời hợt bình đẳng như sau:

console.log(null == undefined); // prints true 
console.log(null === undefined);// prints false 
+0

Có lẽ bạn có thể chỉnh sửa câu trả lời và thêm một số liên kết và tham số tham chiếu. Chỉ cần thả ở đây "Thực hành tốt" là không có gì nhiều hơn một ý kiến. –

+1

Tôi đã thêm sách tham khảo, cũng "chỉ là một cuốn sách" không phải là tiêu chuẩn – ItsmeJulian

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