2011-12-02 37 views

Respuesta

69

Solución:

goog.net.XhrIo.send(url, undefined, undefined, undefined, {'Cache-Control': 'no-cache'}) 

Se debe utilizar en lugar de undefined parámetro opcional que desea omitir, ya que este 100% simula el valor por defecto para los parámetros opcionales en JavaScript.

pequeño ejemplo:

myfunc(param); 

//is equivalent to 

myfunc(param, undefined, undefined, undefined); 

Recomendación fuerte: utilizar JSON si usted tiene una gran cantidad de parámetros, y se puede tener parámetros opcionales en el medio de la lista de parámetros. Mira cómo se hace esto en jQuery.

+1

+1. No sé exactamente qué hace esto (¿igual que 'undefined'?), Pero parece ser el mejor para" omitir los parámetros opcionales ". – Thilo

+0

Descubrí que nunca se puede estar seguro de qué pasar en lugar del parámetro "omitido". Indefinido? ¿Nulo? 0? ¿Cuerda vacía? ¿Objeto vacío? ¿Formación? ** Si el comportamiento de omitir el parámetro no está docummentado, o no hay un parámetro predeterminado, está en un gran problema **. No puede dormir bien si actualiza la biblioteca externa. Solo Dios y tal vez el desarrollador de la biblioteca pueden saber qué pasará si pasa algo inesperado en lugar del parámetro requerido. En general, si este comportamiento no está documentado, los errores están en usted – Dan

+0

Esto todavía funciona en 2017 en la última versión de Google Chrome, así que estoy votando. – Anonymous

6

sólo tiene que pasar null como valor del parámetro.

Agregado: También se puede saltar todos los parámetros opcionales consiguientes después del último que desea pasar un valor real (en este caso puede omitir opt_timeoutInterval parámetro en absoluto)

+2

¿Estás seguro de que no hay una verificación '=== undefined' dentro? – Dan

+0

@Dan, formuló su pregunta como una pregunta genérica de JavaScript con ese código como ejemplo. Si necesita ayuda específicamente sobre cómo funciona 'goog.net.XhrIo.send()', vuelva a formular la pregunta. – nnnnnn

+0

Muchas gracias @nnnnnn, pero esta es realmente una pregunta JavaScript * genérica * y la respuesta debería funcionar en * cualquier * caso. Si no hay una solución genérica, publícala en tu respuesta. – Dan

1

¿Qué quiere decir por saltar? Puede pasar null, y puede dejar por completo los parámetros finales (opt_timeoutInterval en este caso), pero debe asegurarse de que su parámetro Cache-Control se convierta en el quinto.

goog.net.XhrIo.send(url, null, null, null, {'Cache-Control': 'no-cache'}); 

Si no necesita el Cache-Control:

goog.net.XhrIo.send(url); 

Otros parámetros API tomamos como un hash para hacer parámetros opcionales más fácil (y muchos parámetros con nombre, por tanto, auto-documentado), pero donde posicional Se esperan parámetros, tienes que ir con eso.

+0

Saltando me refiero a vivir en blanco.Quizás aquí tenemos el mal diseño de la interfaz, tal vez. Tiene toda la razón sobre el parámetro final. También sé que: 1) la función funcionará sin los parámetros segundo, tercero y cuarto. 2) el valor predeterminado para el tercer parámetro es "OBTENER". Tantas palabras aquí ... Creo que es un mal diseño de funciones, así que detengámonos – Dan

+0

JSON debería usarse aquí como la manera de pasar los parámetros – Dan

21

Respuesta corta

La apuesta más segura es undefined, y debería funcionar casi ubicua. Sin embargo, en última instancia, no se puede engañar a la función que se le pide para que piense que realmente se ha omitido un parámetro.

Si usted se encuentra inclinado hacia el uso de null sólo porque es más corta, la posibilidad de declarar una variable llamada _ como un buen atajo para undefined:

(function() { // First line of every script file 
    "use strict"; 
    var _ = undefined; // For shorthand 
    // ... 
    aFunction(a, _, c); 
    // ... 
})(); // Last line of every script 

detalles

En primer lugar, saber que:

  • typeof undefined evalúa a "undefined"
  • typeof null evalúa a "object"

Así que supongamos que una función toma un argumento que se espera que sea de tipo "number". Si proporciona null como valor, lo está dando un "object". La semántica está apagada.

Como desarrolladores siguen escribiendo cada vez más robusta código javascript, hay una creciente posibilidad de que las funciones que llaman explícitamente comprobar el valor de un parámetro para undefined en comparación con el clásico if (aParam) {...}. Estará en un terreno inestable si continúa usando null de manera intercambiable con undefined simplemente porque ambos fuerzan a false.

Tenga en cuenta, sin embargo, que de hecho es posible que una función para saber si un parámetro se ha hecho omitido (versus ser ajustado a undefined):

f(undefined); // Second param omitted 
function f(a, b) { 
    // Both a and b will evaluate to undefined when used in an expression 
    console.log(a); // undefined 
    console.log(b); // undefined 
    // But... 
    console.log("0" in arguments); // true 
    console.log("1" in arguments); // false 
} 

Notas al pie

  1. Mientras que undefined tampoco es del tipo "number", su trabajo completo es ser del tipo que realmente no es. Es por eso que es el valor asumido por las variables no inicializadas y el valor de retorno predeterminado para las funciones.
Cuestiones relacionadas