Si su comprobación de objetos estándar que son el resultado de analizar una cadena JSON , .hasOwnProperty
no tiene ningún beneficio obvio. Excepto, por supuesto, si usted o alguna lib que está utilizando ha estado jugando con el Object.prototype
.
En general, undefined
como tal se puede redefinir, pero no he encontrado esto por mí mismo, ni creo que alguna vez lo haga. Sin embargo, es imposible (AFAIK) estropear los valores de retorno de typeof
. En ese sentido, este último es la forma más segura de hacerlo. Creo que algunos navegadores antiguos tampoco funcionan bien con la palabra clave undefined
.
Al reanudar: no hay necesidad de ir y reemplazar cada cheque typeof
solo. En una nota personal: creo que es una buena práctica tener el hábito de usar .hasOwnProperty
, sin embargo. Por lo tanto, sugeriría que, en caso de que exista una propiedad, pero no esté definida, .hasOwnPorperty
es la apuesta más segura.
En respuesta a tu comentario: sí, typeof
se ajuste a sus necesidades ~ 95% de las veces. .hasOwnProperty
funcionará el 99% de las veces. Sin embargo, como su nombre indica: propiedades más arriba en la cadena de herencia no se compruebe, considere el siguiente ejemplo:
Child.prototype = new Parent();
Child.prototype.constructor=Child;//otherwise instance.constructor points to parent
function Parent()
{
this.foo = 'bar';
}
function Child()
{
this.bar = 'baz';
}
var kiddo = new Child();
if (kiddo.hasOwnProperty('foo'))
{
console.log('This code won\'t be executed');
}
if (typeof kiddo.foo !== 'undefined')
{
console.log('This will, foo is a property of Parent');
}
Así que si usted quiere comprobar si un objeto tiene una propiedad, hasOwnProperty
es lo que necesita . Especialmente si va a cambiar el valor de esa propiedad (si se trata de una propiedad prototipo, todas las instancias se pueden modificar).
Si desea saber si una propiedad tiene un valor (distinto de undefined
), independientemente de dónde se encuentre en la cadena de herencia, necesitará typeof
. Tengo una función recursiva en alguna parte para determinar dónde se puede encontrar la propiedad en la cadena de herencia. Una vez que lo encuentre, lo publicaré aquí también.
Actualización:
Como prometió, la función de localizar una propiedad en una cadena de herencia. No es la función real que utilicé hace un tiempo, así que armé un borrador en funcionamiento. No es perfecto, pero bien podría ayudarle en su camino:
function locateProperty(obj,prop,recursion)
{
recursion = recursion || false;
var current = obj.constructor.toString().match(/function\s+(.+?)\s*\(/m)[1];
if (!(obj.hasOwnProperty(prop)))
{
if (current === 'Function' || recursion === current)
{
return false;
}
return locateProperty(new window[current](),prop,current);
}
return current;
}
//using the object kiddo
locateProperty(kiddo,'foo');//returns 'Parent'
locateProperty(kiddo,'bar');//returns 'Parent', too
Para evitar este último problema técnico, se puede reemplazar la última declaración con return current;
return obj;
. O, mejor aún, agregue la línea siguiente al fragmento anterior:
Child.prototype.constructor=Child;
me olvidaron que en la primera edición ...
Sólo un comentario: aquí es como he visto hacer demasiado: https://github.com/olegskl/is.js/blob/master/is.js#L79 –
Otra manera de hacerlo: 'si (ac === (function (u) {return u})()) {'... – Martijn
Pregunta similar: http: // stackoverflow.com/preguntas/4725603/variable indefinido-vs-TypeOf-variable-indefinido – simon