2012-01-28 27 views
8

Tôi là một lập trình viên sở thích, tôi đã nghiên cứu một số ngôn ngữ và hầu như luôn luôn thấy rằng 'chiều dài' là một phương pháp/chức năng. Tôi đã được đào tạo, từ những gì tôi có thể nói, rằng bất kỳ cuộc gọi phương thức nào cũng phải được gọi bằng dấu ngoặc đơn sau, ngay cả khi không có đối số.Tại sao không() sau .length trong Javascript?

Không phải như vậy trong Javascript .... Tại sao?

C# .length() ROR .lenth()

vv ...

+0

Thử '[1,2,3,4] .length = 2'. Xem http://jsfiddle.net/jfriend00/9bddC/. – jfriend00

+0

Độ dài mảng Java cũng là một thuộc tính (giả). Ngoài ra, trong nhiều ngôn ngữ, bao gồm Ruby (RoR không phải là một ngôn ngữ), dấu ngoặc đơn thường là tùy chọn. –

+0

Trên thực tế trong Ruby [trên Rails], không có khái niệm đặc tính riêng biệt và bạn luôn có thể bỏ qua dấu ngoặc đơn (trừ khi được yêu cầu để ưu tiên) – Gareth

Trả lời

2

Đó là bởi vì đó là một tài sản, không phải là một chức năng.

Bạn có thể tìm thấy số documentation here at MDN có liên quan.

Thuộc tính này trả về số đơn vị mã trong chuỗi.

+0

thuộc tính tư tưởng không thể gọi được, không phải là trình giữ chỗ cho giá trị, như biến. Tôi có thể gọi một biến, nhưng không sử dụng nó như một hàm, thuộc tính nữa. Hãy nghĩ rằng chúng đã lưu trữ mọi thứ, nhưng không xử lý bất cứ điều gì –

+0

Hãy suy nghĩ về nó như một tài sản liên tục được cập nhật khi thay đổi mảng, thay vì một giá trị được tính toán khi bạn "gọi" nó - như bạn nói đúng, nó không phải là chức năng được gọi là – Gareth

1

Tên length là thuộc tính không phải là chức năng. Một thuộc tính có thể được truy cập theo tên trong khi một hàm phải được gọi với () và có thể là các đối số để tạo ra một giá trị.

Ví dụ

var x = {}; 
x.name = "example"; // Property 
console.log(x.name); // Prints "example" 
x.getName = function() { return "example"; } // Function 
console.log(x.getName); // Doesn't print what you'd want here 
console.log(x.getName()); // Prints "example" 
1

Bởi vì một giá trị đã biết của nó đối với các đối tượng (một tài sản) và không phải là một chức năng mà cần phải được đánh giá.

+0

Điều này không nhất thiết phải đúng. Các thuộc tính được thực hiện trong nội bộ (hoặc bất kỳ thuộc tính nào trong một cài đặt ES5) có thể có các bộ định tuyến hoặc các bộ định cư tính toán giá trị thuộc tính. – jfriend00

1

Trong JavaScript, .length là thuộc tính của mảng, không phải là chức năng của mẫu thử nghiệm. Hãy tưởng tượng mảng của bạn được thể hiện như thế này:

array { 
    data: [ ... ], 
    length: 4 // 4 elements 
} 

này rõ ràng là vô nghĩa, nhưng vấn đề là .length là một thuộc tính của đối tượng mảng, không phải là một chức năng của nó, vì vậy nó không cần dấu ngoặc trailing.

11

Trong Javascript, đây là thuộc tính chứ không phải chức năng.

Trong các ngôn ngữ như C trong đó chức năng độ dài phải lặp qua toàn bộ chuỗi để tìm kết thúc, nó hợp lý để có nó như một hàm (vì nó hoạt động). Trong các ngôn ngữ mà độ dài được giữ như một giá trị riêng biệt, nó là hợp lý để có nó như là một tài sản thay vì (vì nó chỉ đọc một giá trị đã tồn tại).

+1

Các thuộc tính như .length có thể được thực hiện với getters và setters tính giá trị thuộc tính thay vì chỉ lấy một giá trị đã lưu trước đó. – jfriend00

+0

@ jfriend00, chúng có thể, nhưng thường thì không. Đó là vì kỳ vọng là quyền truy cập thuộc tính sẽ nhanh như truy cập trường. – svick

+0

Tôi không nghĩ rằng mô tả của bạn về lý do tại sao tài sản là chính xác. Tôi nghĩ rằng đó là một tài sản bởi vì các nhà thiết kế có ý định cho bạn để có thể gán cho nó cũng như để đọc nó và một tài sản là giao diện đơn giản nhất cho điều đó. Và, oh bằng cách này, có một hàm setter đằng sau nó cho các thiết lập của chiều dài kể từ đó đòi hỏi một thao tác thực tế của cấu trúc dữ liệu. – jfriend00

0

Trong JavaScript, .length là một tài sản và hoạt động như một:

var a = [1, 2, 3, 4, 5]; 
console.log(a.length); // returns 5 
a.length = 3; 
console.log(a.join(",")); // returns "1,2,3" 

http://jsfiddle.net/GD89N/

Chú ý bạn có thể không chỉ đọc, mà còn viết giá trị của tài sản.


Bằng cách này, Trong C#, thường .Length hoặc .Count là tài sản, chứ không phải phương pháp:
String.Length
Array.Length
List<T>.Count

LINQ cho thấy một phương pháp Count()-IEnumerable<T>, nhưng đó là một sự bổ sung tương đối mới .

0

Có nhiều ngôn ngữ trong đó các thuộc tính có thể được hỗ trợ bằng các cuộc gọi phương thức bao gồm JavaScript. Tùy thuộc vào người triển khai để quyết định cách triển khai.

Bạn có thể có các thuộc tính của riêng bạn được hỗ trợ bởi các chức năng. Tôi đã có answered một câu hỏi tương tự trước đây, vì vậy sẽ không lặp lại câu hỏi ở đây.

Ruby cũng không yêu cầu dấu ngoặc đơn sau khi gọi phương thức. Đây là mã Ruby hợp lệ

[].size   // size is an Array method 
object.x = 42; // x= is a method (setter) 

Python cũng có khái niệm về tính năng được hỗ trợ chức năng. Dưới đây là một ví dụ bằng Python:

class Foo(object): 
    def __init__(self): 
     self._x = None 

    @property 
    def x(self): 
     print "getter called" 
     return self._x 

    @x.setter 
    def x(self, value): 
     print "setter called" 
     self._x = value 

f = Foo() 
f.x = "20" 
setter called 
f.x 
getter called 

ngoặc chỉ là cú pháp và có truyền thống được sử dụng cho các cuộc gọi chức năng/phương pháp, nhưng nó không phải là một tiêu chuẩn phổ cập bởi bất kỳ phương tiện.

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