2012-07-02 13 views
34

Actualmente estoy leyendo este jquery masking plugin para tratar de entender cómo funciona, y en numerosos lugares el autor llama a la función slice() sin pasarle ningún argumento. Por ejemplo, aquí la variable _buffer es slice() d, y _buffer.slice() y _buffer parecen tener los mismos valores.Usando el método Javascript slice() sin argumentos

¿Hay alguna razón para hacer esto o el autor está haciendo el código más complicado de lo que debería ser?

//functionality fn 
function unmaskedvalue($input, skipDatepickerCheck) { 
    var input = $input[0]; 
    if (tests && (skipDatepickerCheck === true || !$input.hasClass('hasDatepicker'))) { 
     var buffer = _buffer.slice(); 
     checkVal(input, buffer); 
     return $.map(buffer, function(element, index) { 
      return isMask(index) && element != getBufferElement(_buffer.slice(), index) ? element : null; }).join(''); 
    } 
    else { 
     return input._valueGet(); 
    } 
} 
+0

Ningún programador competente alguna vez haría el código más complicado de lo que debe ser. – alex

+1

Es necesario. El método 'slice' se usa al principio de la función para hacer una copia de seguridad de los elementos originales de la matriz antes de ser modificado por la función, de esta manera el autor tiene acceso a las posiciones, claves y valores de la matriz original incluso después de editar el archivo formación. Esto es indispensable cuando se hace una interfaz de manipulación de cadenas responsable, como su plugin de ejemplo. Complementando el comentario de @ alex, si está allí, hay una razón para ello. Ctrl + F la fuente y busca dónde se accede más adelante si necesitas una mejor comprensión. –

+1

'// funcionalidad fn'? – Ben

Respuesta

55

El método .slice() hace una copia (superficial) de una matriz, y toma parámetros para indicar qué subconjunto de la matriz de origen para copiar. Llamarlo sin argumentos solo copia toda la matriz. Es decir:

_buffer.slice(); 
// is equivalent to 
_buffer.slice(0); 
// also equivalent to 
_buffer.slice(0, _buffer.length); 

EDITAR: ¿No es obligatorio el índice de inicio? Sí. Y no. Más o menos Las referencias de JavaScript (como MDN) generalmente dicen que .slice() requiere al menos un argumento, el comienza con el índice. Llamar a .slice() sin argumentos es como decir .slice(undefined). En el ECMAScript Language Spec, el paso 5 en el algoritmo .slice() dice "Deje que relativeStart sea ToInteger(start)". Si observa el algoritmo para la operación abstracta ToInteger(), que a su vez usa ToNumber(), verá que termina convirtiendo undefined en 0.

Aún así, en mi propio código siempre diría .slice(0), no .slice() - para mí parece más nítido.

+1

Esto es realmente confuso dado que array.slice() [dice requerir al menos un argumento] (http://www.w3schools.com/jsref/jsref_slice_array.asp) – meawoppl

+3

@meawoppl - He actualizado mi respuesta a explica por qué funciona sin argumentos. – nnnnnn

+0

Oui. Muchas gracias. – meawoppl

Cuestiones relacionadas