Estoy un poco confundido sobre los valores undefined
y JavaScript null
.
¿Qué hace if (!testvar)
realmente? Qué es la prueba undefined
y null
o simplemente undefined
?
Una vez que se define una variable, ¿puedo volver a undefined
borrarla (por lo tanto, eliminar la variable)?
¿Puedo pasar undefined
como parámetro? P.ej:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
Respuestas:
No te confundas
null
. Por lo general, tiene sentido y se comporta de manera similar a los conceptos de otros lenguajes de script de los objetos 'nulo', 'nulo' o 'Ninguno' fuera de banda.undefined
, por otro lado, es una peculiaridad extraña de JavaScript. Es un objeto singleton que representa valores fuera de banda, esencialmente un segundo similar pero diferentenull
. Surge:Cuando llama a una función con menos argumentos que la lista de argumentos en las
function
listas de instrucciones, los argumentos no pasados se establecen enundefined
. Puede probar eso con, por ejemplo:Con este método no se puede distinguir entre
dosomething(1)
ydosomething(1, undefined)
;arg2
será el mismo valor en ambos. Si necesita distinguir la diferencia que puede verarguments.length
, pero hacer argumentos opcionales como ese generalmente no es muy legible.Cuando una función no tiene
return value;
, regresaundefined
. En general, no es necesario usar un resultado de devolución de este tipo.Cuando declara una variable al tener una
var a
declaración en un bloque, pero aún no le ha asignado un valor, lo esundefined
. De nuevo, en realidad nunca deberías necesitar confiar en eso.El
typeof
operador espeluznante regresa'undefined'
cuando su operando es una variable simple que no existe, en lugar de arrojar un error como sucedería normalmente si intentara referirse a él. (También puede darle una variable simple entre paréntesis, pero no una expresión completa que involucre una variable no existente). Tampoco es muy útil para eso.Este es el controvertido. Cuando accede a una propiedad de un objeto que no existe, no obtiene inmediatamente un error como en cualquier otro idioma. En cambio, obtienes un
undefined
objeto. (Y luego, cuando intente usar eseundefined
objeto más adelante en el script, saldrá mal de una manera extraña que es mucho más difícil de rastrear que si JavaScript hubiera arrojado un error de inmediato).Esto se usa a menudo para verificar la existencia de propiedades:
Sin embargo, porque puede asignar
undefined
como cualquier otro valor:eso no detecta realmente si la propiedad está allí de manera confiable. Es mejor usar el
in
operador, que no estaba en la versión original de Netscape de JavaScript, pero ahora está disponible en todas partes:En resumen,
undefined
es un desastre específico de JavaScript, que confunde a todos. Además de los argumentos de funciones opcionales, donde JS no tiene otro mecanismo más elegante,undefined
debe evitarse. Nunca debería haber sido parte del lenguaje;null
habría funcionado bien para (2) y (3), y (4) es un error que solo existe porque al principio JavaScript no tenía excepciones.Tal 'truthiness' prueba comprueba contra
false
,undefined
,null
,0
,NaN
y cadenas vacías. Pero en este caso, sí, es realmenteundefined
lo que le preocupa. En mi opinión, debería ser más explícito al respecto y decirif (testvar!==undefined)
.Ciertamente puede asignarle
undefined
, pero eso no eliminará la variable. Solo eldelete object.property
operador realmente elimina las cosas.delete
está realmente destinado a propiedades en lugar de variables como tales. Los navegadores le permitirán salirse con la suyadelete variable
, pero no es una buena idea y no funcionará en el modo estricto de ECMAScript Fifth Edition. Si desea liberar una referencia a algo para que se pueda recolectar basura, sería más habitual decirlovariable= null
.Si.
fuente
undefined
es un objeto singleton? ¿Qué quieres decir? Es un valor primitivo, y no un objeto.typeof foo=='undefined'
; tiende a usarse para (4a) rastreo global, en cuyo caso preferiría ser explícito y decir'foo' in window
, o (4b) probar contra elundefined
valor en sí, en cuyo caso preferiría ser legible y decirfoo===undefined
. En teoría, las pruebas entypeof
contra'undefined'
podrían tener un caso de uso que otras construcciones no podrían proporcionar: la detección de la existencia de variables locales. Sin embargo, en realidad casi siempre sabes qué variables se declaran locales.return
instrucción devuelveundefined
, pero si la función es un constructor (invocado con elnew
operador) devolverá el nuevo objeto (el valorthis
dentro del constructor) a pesar de no tener unareturn
instrucción.console.log((function (){}()));
vuelveundefined
.console.log((new function (){}()));
devuelve un objetoNo puede (¿no debería?) Definir nada como indefinido, ya que la variable ya no estaría indefinida, simplemente la definió como algo.
No puede (¿no debería?) Pasar
undefined
a una función. Si desea pasar un valor vacío, usenull
en su lugar.La declaración
if(!testvar)
verifica los valores booleanos de verdadero / falso, este en particular prueba si setestvar
evalúa comofalse
. Por definición,null
yundefined
no debe evaluarse ni comotrue
nifalse
, pero JavaScript evalúanull
comofalse
, y da un error si intenta evaluar una variable indefinida.Para probar
undefined
onull
utilizar correctamente estos:fuente
==
y!=
).var a= undefined
. Puedes pasarfn(undefined)
. Si desea encontrar la diferencia entre una propiedad indefinidap
de un objetoo
y una propiedadp
que se ha definido y establecido enundefined
, debe usar el'p' in o
operador.testvar === undefined
lugar de ser el más complicadotypeof(testvar) === "undefined"
?typeof
prueba para variables indefinidas: a diferencianull
,undefined
es simplemente una propiedad del objeto global y puede redefinirse. Solo toma un estilo de codificación particular y un signo igual que falta yundefined
se cambia en silencio:if (undefined = someVar) {...}
undefined
una propiedad inmutable del objeto global, por lo que es más seguro de lo que solía ser. Sin embargo, todavía es posible definir una variable mutable llamadaundefined
dentro de una función, por lo que el problema no ha desaparecido por completo.La diferencia básica es eso
undefined
ynull
representan conceptos diferentes.Si solo
null
estuviera disponible, no podrá determinar sinull
se configuró intencionalmente como el valor o si el valor aún no se ha establecido a menos que haya utilizado la captura de errores engorrosos: por ejemploSin embargo, si se establece el valor intencionadamente a
null
, la igualdad estricta con laundefined
falla, lo que le permite diferenciar entrenull
yundefined
valores:Echa un vistazo a la referencia aquí en lugar de confiar en que la gente dice despectivamente basura como "En resumen, indefinido es un desastre específico de JavaScript, que confunde a todos". El hecho de que estés confundido no significa que sea un desastre.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
También este comportamiento no es específico de JavaScript y que completa el concepto generalizado de que un resultado booleano puede ser
true
,false
y desconocido (null
), no tiene valor (undefined
), o algo salió mal (error
).http://en.wikipedia.org/wiki/Undefined_value
fuente
null
así hubiera funcionado bien.a == null
estrue
porque la coacción de tipo Javascript.La mejor manera de verificar los valores nulos es
y para indefinido
Puede asignar una variable con indefinido.
fuente
!==
, no!=
SÍ, puede, porque indefinido se define como indefinido.
Tu caso:
También puede crear su propia variable indefinida:
fuente
Para responder a su primera pregunta, el operador no (
!
) forzará lo que sea que se le dé a un valor booleano. Asínull
,0
,false
,NaN
y""
(cadena vacía) le aparecerá toda falsa.fuente
undefined
no aparecerá comofalse
, arrojará un error 'no está definido'.if (undefined) {/* Do stuff*/}
no dará un error, ya queundefined
existe como una propiedad del objeto global. Lo que dará un error es algo asíif (someUndeclaredVariable) {/* Do stuff*/}
JavaScript, cómo configurar una variable como indefinida en la línea de comandos:
Establezca una variable como indefinida en el
js
terminal de línea de comandos de JavaScript que viene con Java en Ubuntu 12.10.Si configura una variable como indefinida en un javascript:
Pon esto en myjs.html:
Imprime esto:
¡ADVERTENCIA! Cuando configura su variable como indefinida, está configurando su variable a otra variable. Si alguna persona astuta corre
undefined = 'rm -rf /';
, cada vez que establezca su variable como indefinida, recibirá ese valor.Puede que se pregunte cómo puedo generar los extraterrestres de valor indefinido al principio y que aún se ejecute. Se debe a la elevación de JavaScript: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
fuente
Prueba esto:
fuente
El for
if (something)
yif (!something)
se usa comúnmente para verificar si algo está definido o no. Por ejemplo:El identificador se convierte en un valor booleano, por lo que
undefined
se interpreta comofalse
. Por supuesto, hay otros valores (como 0 y '') que también se interpretan comofalse
, pero o bien el identificador no debe tener dicho valor de manera razonable o está contento con tratar ese valor de la misma manera que indefinido.Javascript tiene un
delete
operador que puede usarse para eliminar un miembro de un objeto. Dependiendo del alcance de una variable (es decir, si es global o no), puede eliminarla para que no esté definida.No hay una
undefined
palabra clave que pueda usar como un literal indefinido. Puede omitir parámetros en una llamada de función para hacerlos indefinidos, pero eso solo puede usarse enviando menos parámetros a la función, no puede omitir un parámetro en el medio.fuente
Solo por diversión, aquí hay una forma bastante segura de asignar "sin asignar" a una variable. Para que esto tenga una colisión, se requerirá que alguien haya agregado al prototipo de Objeto con exactamente el mismo nombre que la cadena generada aleatoriamente. Estoy seguro de que el generador de cadenas aleatorias podría mejorarse, pero acabo de tomar una de esta pregunta: generar cadenas / caracteres aleatorios en JavaScript
Esto funciona creando un nuevo objeto e intentando acceder a una propiedad con un nombre generado aleatoriamente, que suponemos que no existirá y, por lo tanto, tendrá el valor de indefinido.
fuente