2016-02-03 15 views
9

Các MDN nói:Loại dữ liệu của chức năng: chức năng hoặc đối tượng? trong JavaScript

Sáu kiểu dữ liệu mà nguyên thủy:

  • Boolean
  • Null
  • Undefined
  • Số
  • Chuỗi
  • Symbol (mới trong ECMAScript 6)

  • và Object

Nhưng tôi nhầm lẫn, loại chức năng dữ liệu và đối tượng kiểu dữ liệu.

Hãy xem:

var func = function() { 
    console.log ('Hello World ! ') 
}; 

var obj = { 
    property : something 
} 


console.log(typeof(func)); // ===> function 
console.log(typeof(obj)); // ===> object 

Là nó khác loại chức năng dữ liệu và dữ liệu đối tượng loại? Tại sao typeof(func) là chức năng? không phải là một đối tượng? Tài liệu cho biết có 7 kiểu dữ liệu (6 nguyên thủy, 1 đối tượng). chức năng không bao gồm bất cứ nơi nào. Cho đến nay, hơn 1 năm, tôi nghĩ rằng kiểu dữ liệu của hàm là đối tượng, tôi nghe hàm này là đối tượng lớp đầu tiên trong JavaScript, vì vậy tôi không nghi ngờ về hàm là đối tượng nhưng hôm nay tôi nghĩ nhiều thời gian hơn và tự hỏi .

Có khác biệt không?

+1

Nó trả về hàm nhưng đối tượng hàm của nó là https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Tham chiếu/Toán tử/typeof –

+2

'typeof' không trả về * Kiểu dữ liệu *. – Bergi

+1

'typeof' không báo cáo loại dữ liệu thực của giá trị. Đây là bảng tra cứu ánh xạ loại dữ liệu và các đặc điểm giá trị khác cho một tên: http://www.ecma-international.org/ecma-262/6.0/index.html#sec-typeof-operator. Các hàm là các đối tượng có thuộc tính '[[Gọi]] bên trong. Đó là lý do tại sao 'typeof null' là' "object" '(\ * grumpy face \ *). –

Trả lời

7

Bạn có thể nghĩ một cách hợp lý là Function làm lớp con của Object. Nó có tất cả các phương thức của Object cộng thêm một số chi tiết cụ thể cho một hàm (chẳng hạn như .bind(), .call(), .apply(), v.v ...).

Tại sao Javascript quyết định làm cho Function báo cáo loại duy nhất của riêng nó, nhưng không phải Array (là một dẫn xuất tương tự từ Object) là bất kỳ ai đoán và có thể chỉ được biết đến với nhà thiết kế ban đầu của ngôn ngữ. Nó là cực kỳ hữu ích mà Function không báo cáo loại riêng của nó, do đó bạn có thể dễ dàng kiểm tra xem một tài sản có thể gọi là một chức năng và có lẽ đó là lý do chính tại sao nó được thực hiện theo cách này.

Dưới đây là một cuộc biểu tình như thế nào một đối tượng Function có phương pháp từ một Object:

function f() {} 
 
f.someProperty = "foo"; 
 

 
log(f.hasOwnProperty("someProperty")); 
 
log(f instanceof Object); 
 
log(f instanceof Function); 
 

 
function log(x) { 
 
    var div = document.createElement("div"); 
 
    div.innerHTML = x; 
 
    document.body.appendChild(div); 
 
}

+0

Trường hợp 'Object.create (null)' phù hợp với thứ bậc lớp này ở đâu? – Bergi

+0

* chức năng * không được đặc trưng bởi 'instanceof Function' trong JavaScript, chúng đặc biệt vì chúng là các đối tượng ** có thể gọi **. – Bergi

+0

@Bergi - Nhưng, một hàm là 'instanceof Function'. 'Object.create (null)' là một bit của một quái vật kỳ lạ vì nó không có nguyên mẫu. Người ta có thể nghĩ về nó như là cha mẹ của 'Object', tôi giả sử vì nó cung cấp cú pháp truy cập thuộc tính chung. – jfriend00

0

typeof trả về kiểu của những gì đã từng được truyền cho nó. Một hàm là một đối tượng ((function() {}) instanceof Object === true), nhưng hàm typeof được xác định để trả về "function" khi một đối tượng triển khai [[Gọi]] trong ECMA-262 được cung cấp cho nó.

Chức năng là đối tượng, nhưng typeof coi chúng là trường hợp đặc biệt.

+0

* "khi một đối tượng có phương thức' gọi' được cung cấp cho nó "* - Tôi cầu xin sự khác biệt. 'typeof {call: function() {}}' trả về 'đối tượng'. – SeinopSys

+1

Người ta có thể giả định rằng bạn có nghĩa là phương pháp * nội bộ [[gọi]] đặc biệt *, nhưng từ ngữ là khó hiểu thực sự – Bergi

+0

@bergi Vâng, tôi đã thay đổi từ ngữ cho rằng – Ivan

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