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