2011-07-29 18 views
14

Los métodos "in" operator y "hasOwnProperty" parecen ser intercambiables, pero me pregunto si uno está buscando propiedades heredadas o algo así y el otro no, o algo así. Estoy especialmente interesado en el caso de usarlo con un diccionario, pero dudo que sea diferente de otros usos.En Actionscript 3, ¿cuál es la diferencia entre el operador "in" y el método "hasOwnProperty"?

"hasOwnProperty" se describe en los documentos oficiales here y "en" se describe here, pero si hay una diferencia, no me pareció muy claro.

Respuesta

14

Confiando en la respuesta valiosamente aceptada en realidad me metió en un poco de problemas. Parece que hay más cosas más que solo diferencias relacionadas con prototipos. Lo que he encontrado es que

hasOwnProperty no se puede utilizar para ver si una clave está presente en un diccionario cuando esa clave es un tipo de referencia, pero el operador in puede hacerlo.

Aquí hay un ejemplo para demostrar.

código:

var test:Function = function(key:*,label:String):void 
    { 
     var d:Dictionary = new Dictionary(true); 
     d[key] = true; 
     trace(label); 
     trace(" hasOwnProperty: " + (d.hasOwnProperty(key)?"true":"false <== !!PROBLEM!!")); 
     trace(" in: " + (key in d)); 
     trace(" []: " + d[key]); 
    }; 
test({}, "indexed by object"); 
test("string", "key is string"); 
test(0, "key is number"); 
test(true, "key is boolean"); 

resultados:

indexed by object 
    hasOwnProperty: false <== !!PROBLEM!! 
    in: true 
    []: true 
key is string 
    hasOwnProperty: true 
    in: true 
    []: true 
key is number 
    hasOwnProperty: true 
    in: true 
    []: true 
key is boolean 
    hasOwnProperty: true 
    in: true 
    []: true 
+2

Y hay más a él todavía. hasOwnProperty no es compatible con la búsqueda estática. Por ejemplo, '** Static properties **' - variables, constantes o métodos definidos con la palabra clave static en la clase de definición de un objeto o en cualquiera de sus superclases; y '** Propiedades de prototipo **' - propiedades definidas en un objeto prototipo que es parte de la cadena de prototipos del objeto. 'devolverá' falso'. –

+0

Otra forma de verlo es 'in' que me indicará si arroja un error si accedo a la propiedad o al método, ya que' hasOwnProperty' no lo hará porque no comprueba si existe la propiedad o el método estático o prototipo. –

4

El cambio que conozco es in busca la cadena de prototipos, mientras que hasOwnProperty no, la mayoría de los desarrolladores de AS3 no usan prototipos, por lo que no es tan relevante para el uso diario.

Cuestiones relacionadas