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

Why no () after .length in Javascript?

本文关键字:之后 length Javascript 为什么      更新时间:2023-09-26

我是一名业余程序员,我学习过几种语言,几乎总是发现"length"是一种方法/函数。据我所知,我已经受过训练,任何方法调用都必须在后面加括号,即使没有参数。

在Javascript中并非如此。。。。为什么?

C#.length()ROR.lenth()

等等。。。

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

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

这是因为它是一个属性,而不是函数。

您可以在MDN上找到相关文档。

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

名称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"

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

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

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

因为它是对象(属性)上的已知值,而不是需要计算的函数。

在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向IEnumerable<T>公开了一个Count()方法,但这是一个相对较新的添加。

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

您可以拥有由函数支持的自己的属性。我以前已经回答过类似的问题,所以这里不再赘述。

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

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