2011-11-23 21 views

Respuesta

176
key of obj 

Esto compila a JavaScript de key in obj. (CoffeeScript utiliza of cuando se refiere a las llaves, y in cuando se hace referencia a los valores de la matriz: val in arr pondrá a prueba si es val en arr.) Respuesta

de thejh es correcta si desea ignorar prototipo del objeto. La respuesta de Jimmy es correcta si desea ignorar las claves con un valor null o undefined.

+2

muy probablemente 'own key of obj' funciona, también, para probar' .hasOwnProperty() '. lo "más probable" proviene de que no lo he intentado, pero esta sintaxis funciona en las comprensiones. –

+2

@flyingsheep No, solo funciona en comprensión. Pruébalo: http://coffeescript.org/#try:own%20key%20of%20obj –

+0

ah, [ok] (https://github.com/jashkenas/coffee-script/issues/1019): 'own = (prop, obj) -> Objeto :: hasOwnProperty.call obj, prop' –

20
obj.hasOwnProperty(name) 

+0

Me gusta esta respuesta porque 'key of obj' arrojará un error si el valor es una cadena o un número. 'No se puede usar el operador 'in' para buscar'. En este caso, si el objeto no está indefinido y no es nulo, funcionará. – jqualls

+0

Esto falla donde el objeto tiene el valor de su prototipo. –

32

El '?' el operador comprueba la existencia:

if obj? 
    # object is not undefined or null 

if obj.key? 
    # obj.key is not undefined or null 

# call function if it exists 
obj.funcKey?() 

# chain existence checks, returns undefined if failure at any level 
grandChildVal = obj.key?.childKey?.grandChildKey 

# chain existence checks with function, returns undefined if failure at any level 
grandChildVal = obj.key?.childKey?().grandChildKey 
+16

Esto falla si la clave está allí, pero tiene el valor 'null'. –

+0

@muistooshort Bueno, eso es molesto. –

+0

En el caso donde uno no se preocupa por la clave existente pero es nula, entonces 'obj.key?' Es probablemente la más concisa. –

Cuestiones relacionadas