Cuestionario para autoevaluar nuestro nivel Javascript

24 May 2011

Introducción

Tras la buena acogida que ha tenido el artículo ‘Tú no sabes Javascript‘, he pensado que podía ser interesante presentar un cuestionario ‘práctico’ para que cada uno pueda autoevaluar su nivel desde un plano más práctico que teórico.

Buscando por la red ejemplos de este tipo de tests, recordé que Kangax dedicó un post completo a este respecto hace ya algún tiempo, así que lo he tomado para presentarlo aquí en castellano. Hay que tener en cuenta que algunas de estas preguntas no resultan demasiado prácticas en un contexto real y que se corresponden más con curiosidades del lenguaje que con las habilidades requeridas para el día a día de un desarrollador. No obstante, es divertido!

Consideraciones

Algunas de las cosas que hay que tener en cuenta antes de enfrentarse al cuestionario son:

  • No es largo, pero hay que leer cada enunciado con atención. Puedes necesitar unos 15 minutos para completarlo.
  • Se asume el estándar ECMAScript 3 (no ECMASCript 5)
  • No uses la consola de Firebug para hacer las pruebas: sería trampa…

Cuestionario

Tienes que escoger una opción para cada una de las preguntas. La comprobación está planteada de tal modo que sólo se indican el número de respuestas correctas. No se marcan aquellas preguntas falladas para dificultar un poco la solución final.

Recuerda indicar en los comentarios tu puntuación y dudas sobre el test!!

1. Qué devuelve la siguiente función?

(function(){
  return typeof arguments;
})();

2. Qué tipo de datos devuelve este código?

var f = function g(){ return 23; };
typeof g();

3. Qué obtenemos al ejecutar este código?

( function( x ){
  delete x;
  return x;
} )( 1 );

4. Cúal es el valor de x tras esta expresión?

var y = 1, x = y = typeof x;

5. Qué obtendriamos con… ?

(function f(f){
  return typeof f();
})(function(){ return 1; });

6. Objetos y funcioes anónimas. Qué obtenemos aquí?

var foo = {
  bar: function() { return this.baz; },
  baz: 1
};
(function(){
  return typeof arguments[0]();
})(foo.bar);

7. Más tipos:

var foo = {
  bar: function(){ return this.baz; },
  baz: 1
}
typeof (f = foo.bar)();

8. Estructuras anidadas; qué tipo de objeto es f ?

var f = (function f(){ return "1"; }, function g(){ return 2; })();
typeof f;

9. Condicionales con funciones anónimas. Si, son posibles, pero el resultado es el esperado?

var x = 1;
if (function f(){}) {
  x += typeof f;
}
x;

10. Arrays y coerción.

var x = [typeof x, typeof y][1];
typeof typeof x;

11. Funciones autoejecutables con objetos como parámetros:

(function(foo){
  return typeof foo.bar;
})({ foo: { bar: 1 } });

12. Funciones anidadas autorreferentes:

(function f(){
  function f(){ return 1; }
  return f();
  function f(){ return 2; }
})();

13. Constructores ampliados:

function f(){ return f; }
new f() instanceof f;

14. Bucles radicales:

with (function(x, undefined){}) length;

Más:

{20} Comentarios.

  1. mad68network

    Ma costao lo mio y casi lo consigo, he acertado 12.

    Un Saludo

  2. Foxandxss

    Bueno, todavía tengo en mi TODO’s aprender Javascript y pensé que algo sabría, pero que va, 1 respuesta correcta. Son rebuscadas jaja.

  3. gnz/vnk

    La 9 está mal. Dice que la respuesta es 1 y no lo es.

    (Y por cierto, que con ese código IE6 -sorry no puedo probar otro IE ahora mismo- dice «1function», que también está mal)

    De todos modos, Carlos, no te lo tomes mal, pero describir este cuestionario como «práctico» es… Bueno, quizá si lo que quieres decir es que el cuestionario en sí es práctico, pues vale. Pero desde luego las preguntas son, en muchos casos, de todo menos «prácticas» y acertarlas no supone un conocimiento práctico de Javascript ni de broma.

    Vamos, yo no soy una persona violenta pero si me encontrara que alguien realmente hace algo como lo del if (function f(){}) o with (function(x, undefined){}), seguramente le buscara y le pegara una paliza. Durante horas. Con cuchillos y pinchos. Oxidados. Y envenenados. Y radiactivos.

    • Carlos Benítez

      Tienes razón con la pregunta 9; corregido!

      Y no hombre, lo de ‘práctico’ está entre comillas porque es un ejercicio directo para ver cómo estamos. Como indico, no son casos que nos encontremos en la vida real, pero nos da un punto de partida para ver qué sabemos del funcionamiento de Javascript por dentro. De ahí que especifique que es la edición 3 del ECMA la que usamos 😉

      Yo espero no encontrarme nunca con estos tipos de códigos heredados.
      Saludos!!

  4. gnz/vnk

    Por cierto, que algunos de los títulos que pones a las preguntas ¿son para despistar?

  5. Mekkon

    Estooo… podrías explicar la número 11?

    gracias 😉

  6. gnz/vnk

    @Mekkon
    Es bastante sencillo. Míralo así:

    (function(baz){
    return typeof baz.bar;
    })({ foo: { bar: 1 } });

  7. Mekkon

    me respondo a mi mismo:

    (function(pepe){
    return typeof pepe.foo.bar;
    })({ foo: { bar: 1 } });

    😉

  8. Mekkon

    @gnz/vnk

    En el caso de querer el objeto, tu respuesta es más adecuada 😉

    un saludo

  9. gnz/vnk

    No es que sea más adecuada, Mekkon. Yo he puesto un código que es equivalente al original y que te puede ayudar a ver porqué la respuesta correcta es la [XXX]. Tu código deja de ser equivalente al original pero hace algo que tiene más sentido que el original.

    En fin, da igual porque lo importante es que hayas visto por qué la respuesta es la que es 😉

  10. @jonasanx

    Dammit! solo tuve tres buenas…. todavía necesito aprender mas. ¿De pura casualidad se van a explicar las respuestas? he hem…

  11. yeikos

    jonasanx, no te preocupes, el test anterior tiene más preguntas frikis que de provecho…

  12. leifsk8er

    0 respuestas bien, ale! ya puedo dormir tranquilo jajaja. x.x

  13. Oscar

    Es genial este blog para tirar por suelo mi moral javascriptera. He acertado una!!! aaaaargh.
    Me voy a tener que repasar todo esto

  14. Uziel

    Hola no sé donde poner está pregunta, hace falta un foro XD .
    No sé relaciona con respecto al tema pero espero me puedas ayudar…. es un curiosidad nadamás.

    Me encontre que hay un operador «in» en javascript para verificar si el objecto tiene una propiedad o no :
    tipo

    propiedad in Obj //Regresa tru o false

    Partiendo de eso me gustaría acercame lo más posible a lo que hace python con sus listas y el manejo de in:
    ejemplo
    a in [1,2,3]
    en vez de
    if a== 1 or a==2 or a==3:

    Lo más cercano que encontre fue esto:

    foo= «bar»;

    if ( foo == «bar» || foo == «foobar» || foo == «foo» )
    console.debug(«Esta»);

    // can be written as
    if ( foo in { bar:1, foobar:1, foo:1 } )
    console.debug(«Esta»);

    Me pregunta como se podría minimizar esta forma… no sé con esa magia de javascript 😛 saludos… espero me puedas ayudar..

    Gracias de antemano por tu tiempo!

    • Carlos Benítez

      Hola Uziel;
      la forma correcta de hacer lo que pides es mediante el operador lógico OR, exactamente como has puesto en el primer ejemplo. Utilizar in solo complica el código y lo hace ilegible (tu mismo ejemplo con foo y bar se hace difícil de seguir)…

      Coffeescript utiliza atajos como el siguiente para generar el código que buscas:

      winner = yes if pick in [47, 92, 13]
      

      Y esto genera/compila en Javascript:

      if (pick === 47 || pick === 92 || pick === 13) winner = true;
      

      Como ves, es la opción más rápida y comprensible, por lo que no veo porqué alterarla.
      Saludos!

  15. Uziel

    Hola, muchas gracias por tu pronta respuesta. Me parece muy interesante esto del CoffeeScript, lo veo como una aproximación a python (lo que conozco =P) en cuanto a simplicidad.

    Muchas gracias. Le daré una revisada.

  16. juan

    2 preguntas correctas.
    Algo es algo :D!

  17. leifsk8er

    Acabo de hacer el test, 9 respuestas correctas. Pero lo mejor no es eso, lo mejor es que este test ya lo hice y ni lo recordaba, en 2011, con 0 respuestas correctas, estoy en los comentarios xD. Hoy 9 :D, y al analizar alguna en detalle he caído encima que he fallado tontamente. Se va notando la mejora js en dos años.

  18. guzman6001

    2 xD Y lo estoy celebrando xDDDDDD

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *