Skip to content

Instantly share code, notes, and snippets.

@bdelespierre
Last active March 28, 2017 15:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bdelespierre/f111b5c4499a4dfac570be3dcb133560 to your computer and use it in GitHub Desktop.
Save bdelespierre/f111b5c4499a4dfac570be3dcb133560 to your computer and use it in GitHub Desktop.

https://www.toptal.com/javascript/interview-questions


Q: Quel est le piège potentiel d'utiliser typeof bar === "object" pour déterminer si bar est un objet ? Comment ce piège peut être évité ?

A: En JavaScript tout est objet y compris NULL ce qui peut poser problème si on teste de cette façon. Pour contourner le problème on peut faire

(bar !== null) && (typeof bar === "object") && (toString.call(bar) !== "[object Array]")

Q: Que produit l'exécution du code suivant ?

(function(){
  var a = b = 3;
})();

console.log(typeof a !== 'undefined');
console.log(typeof b !== 'undefined');

A: false true car seule a est déclarée localement à la fonction ce qui signifie que b est globale


Q: Que produit l'exécution du code suivant ?

var foo = {
  bar: "hello",
  baz: function() {
    var self = this;
    console.log(this.bar);
    console.log(self.bar);
    (function() {
      console.log(this.bar);
      console.log(self.bar);
    })()
  }
}
foo.baz();

A: "hello" "hello" undefined "hello" car dans le scope de la deuxième fonction, this ne pointe plus sur l'objet foo


Q: Considérez les deux fonctions ci-dessous. Renvoient-elles la même chose et pourquoi ?

function foo1()
{
  return {
      bar: "hello"
  };
}

function foo2()
{
  return
  {
      bar: "hello"
  };
}

A: foo1 renvoie { bar: "hello" } tandis que foo2 renvoie undefined car, à cause du saut de ligne dans foo2 le return est évalué à return; { bar: "hello" }. Ce qui signifie que la déclaration de l'objet n'est jamais atteinte et qu'il s'agit en fait de deux expressions valides - pas d'erreur.


Q: Dans quel ordre ces 4 console.log seront-ils exécutés ?

(function() {
    console.log(1); 
    setTimeout(function(){console.log(2)}, 1000); 
    setTimeout(function(){console.log(3)}, 0); 
    console.log(4);
})();

A: 1 4 3 2


Q: Écrivez une fonction (80 caractères ou moins) qui teste si une chaîne est un palindrome

A:

function isPalindrome(str) {
    str = str.replace(/\W/g, '').toLowerCase();
    return (str == str.split('').reverse().join(''));
}

Q: Écrivez la méthode sum de façon à ce que les deux appels ci-dessous renvoient le même résultat

console.log(sum(2,3));   // 5
console.log(sum(2)(3));  // 5

A:

function sum(x) {
  if (arguments.length == 2) {
    return arguments[0] + arguments[1];
  } else {
    return function(y) { return x + y; };
  }
}

Q: Le code suivant produit un dépassement de pile (stack overflow) si le tableau renvoyé par readHugeList est trop gros. Pouvez-vous corriger ça sans changer la récursivité de la fonction nextItemList ?

var list = readHugeList();

var nextListItem = function() {
    var item = list.pop();

    if (item) {
        // process the list item...
        nextListItem();
    }
};

A: Il suffit de laisser la boucle d'évènements gêrer la récursivité plutôt que la pile (stack). Ainsi, la pile est libérée à chaque itération et il n'y a plus de dépassement.

var list = readHugeList();

var nextListItem = function() {
    var item = list.pop();

    if (item) {
        // process the list item...
        setTimeout( nextListItem, 0);
    }
};

Q: Que produit le code suivant ?

for (var i = 0; i < 5; i++) {
  setTimeout(function() { console.log(i); }, i * 1000 );
}

A: 5 5 5 5 5 et non 0 1 2 3 4 car au moment où le premier console.log arrive, i vaut déjà 5.


Q: Que produit l'exécution du code suivant ?

var hero = {
    _name: 'John Doe',
    getSecretIdentity: function (){
        return this._name;
    }
};

var stoleSecretIdentity = hero.getSecretIdentity;

console.log(stoleSecretIdentity());
console.log(hero.getSecretIdentity());

A: undefined puis "John Doe" car lors de l'execution de stoleSecretIdentity, this n'est plus hero. Pour corriger celà on aurait pu écrire var stoleSecretIdentity = hero.getSecretIdentity.bind(hero).


Question bonus: Dans un pays imaginaire où les femmes font des enfants jusqu'à donner naissance à un garçon puis s'arrêtent de donner des enfants, quelle est la répartition de la population homme / femme ? (on suppose qu'un enfant à naître a autant de chances d'être une fille qu'un garçon).

A: 50 / 50

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment