2012-01-28 8 views
8

Soy un programador aficionado, he estudiado varios idiomas y casi siempre encuentro que 'longitud' es un método/función. Por lo que sé, me han enseñado que cualquier llamada al método debe llamarse con un paréntesis después, incluso sin argumentos.¿Por qué no() después de .length en Javascript?

No es así en Javascript .... ¿Por qué?

C# .length() ROR .lenth()

etc ...

+0

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

+0

La longitud de la matriz de Java también es una propiedad (pseudo-). Además, en muchos idiomas, incluido Ruby (RoR no es un idioma), los paréntesis suelen ser opcionales. –

+0

En realidad en Ruby [on Rails], no existe un concepto separado de propiedades, y siempre se puede omitir el paréntesis (excepto cuando sea necesario para la precedencia) – Gareth

Respuesta

2

Es porque es una propiedad, no una función.

Puede encontrar el correspondiente documentation here at MDN.

Esta propiedad devuelve el número de unidades de código en la cadena.

+0

las propiedades de pensamiento no eran invocables, salvo como un marcador de posición para un valor, como una variable. Puedo llamar una variable, pero no usarla como una función, propiedad también. pensaban que almacenaban cosas, pero no procesaban nada. –

+0

Piense en ello como una propiedad que se actualiza continuamente a medida que cambia la matriz, en lugar de un valor que se calcula cuando lo "llama", como bien dice, no es un función que se llama – Gareth

1

El nombre length es una propiedad no una función. Se puede acceder a una propiedad por nombre, mientras que una función debe invocarse con () y posiblemente argumentos para generar un valor.

Por ejemplo

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

porque es un valor conocido en el objeto (una propiedad) y no una función que necesita ser evaluada.

+0

Esto no es necesariamente cierto. Las propiedades implementadas internamente (o cualquier propiedad en una implementación de ES5) pueden tener getters o setters que calculen el valor de la propiedad. – jfriend00

1

En JavaScript, .length es una propiedad de la matriz, no una función del prototipo. Imagine que su matriz se representa así:

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

Esto obviamente es un disparate, pero el punto es que .length es una propiedad del objeto de matriz, no es una función de la misma, por lo que no necesita soportes que se arrastran.

11

En Javascript es una función, no una función.

En idiomas como C, donde la función de longitud tiene que recorrer toda la cadena para encontrar el final, es lógico tenerlo como una función (ya que hace algún trabajo). En los idiomas donde la longitud se mantiene como un valor separado, es lógico tenerlo como una propiedad en su lugar (ya que solo lee un valor ya existente).

+1

Propiedades como .length se pueden implementar con getters y setters que calculan el valor de la propiedad en lugar de recuperar un valor previamente almacenado. – jfriend00

+0

@ jfriend00, pueden, pero generalmente no lo son. Eso es porque la expectativa es que el acceso a la propiedad será tan rápido como el acceso al campo. – svick

+0

Simplemente no creo que su descripción de por qué es una propiedad sea precisa. Creo que es una propiedad porque los diseñadores tienen la intención de que usted pueda asignarla y leerla, y una propiedad es la interfaz más simple para eso. Y, por cierto, hay una función setter detrás para la configuración de la longitud ya que eso requiere una manipulación real de la estructura de datos. – jfriend00

0

En JavaScript, .length es una propiedad y se comporta como uno:

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/

Aviso no sólo se puede leer, sino también escribir el valor de la propiedad.


Por cierto, En C#, por lo general .Length o .Count son propiedades, no métodos:
String.Length
Array.Length
List<T>.Count

Linq expone un método Count()-IEnumerable<T>, pero eso es una adición relativamente nueva .

0

Hay muchos idiomas donde las propiedades pueden respaldarse mediante llamadas a métodos, incluido JavaScript. Depende de los implementadores decidir cómo se implementará.

Puede tener sus propias propiedades respaldadas por funciones. Ya he hecho answered una pregunta similar antes, por lo que no la repetiré aquí.

Ruby tampoco requieren paréntesis después de una llamada a un método. Este es el código Ruby válido

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

Python también tiene el concepto de propiedades respaldadas por funciones. He aquí un ejemplo en 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 

paréntesis es sólo la sintaxis y se ha utilizado tradicionalmente para las llamadas de función/método, pero no es una norma universal por cualquier medio.

Cuestiones relacionadas