为什么没有()在Javascript之后的.length之后?

时间:2012-01-28 00:06:08

标签: javascript

我是一个业余爱好程序员,我研究了几种语言,几乎总是发现“长度”是一种方法/功能。根据我的判断,我已经接受过训练,即使没有参数,任何方法调用都必须在括号后调用。

在Javascript中不是这样......为什么?

C#.length() ROR .lenth()

等...

7 个答案:

答案 0 :(得分:11)

在Javascript中,它是属性,而不是函数。

在像C这样的语言中,长度函数必须循环遍历整个字符串以找到结束,将它作为一个函数(因为它做了一些工作)是合乎逻辑的。在将长度保持为单独值的语言中,将其作为属性(因为它只读取已存在的值)是合乎逻辑的。

答案 1 :(得分:4)

这是因为它是一种财产,而不是一种功能。

您可以找到相关的documentation here at MDN

  

此属性返回字符串中的代码单元数。

答案 2 :(得分:2)

名称length是属性而不是函数。可以通过名称访问属性,同时必须使用()和可能的参数调用函数以生成值。

例如

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"

答案 3 :(得分:1)

因为它是对象(属性)的已知值而不是需要评估的函数。

答案 4 :(得分:1)

在JavaScript中,.length是数组的属性,而不是原型的函数。想象一下你的数组如下所示:

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

这显然是无稽之谈,但关键是.length是数组对象的属性,而不是它的函数,所以它不需要尾随括号。

答案 5 :(得分:0)

在JavaScript中,.length是一个属性,表现为一个:

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/

请注意,您不仅可以阅读,还可以写入属性的值。


顺便说一句,在C#中,通常.Length.Count是属性,而不是方法:
String.Length
Array.Length
List<T>.Count

Linq向Count()公开IEnumerable<T>方法,但这是一个相对较新的补充。

答案 6 :(得分:0)

有许多语言可以通过包括JavaScript在内的方法调用来支持属性。由实现者决定如何实现它。

您可以使用功能支持自己的属性。我之前已经answered提出了类似的问题,所以不会在此重复。

Ruby在方法调用后也不会需要括号。这是有效的Ruby代码

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

Python还具有功能支持属性的概念。这是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

圆括号只是语法,传统上用于函数/方法调用,但它无论如何都不是通用标准。