Questions d'entretien en JavaScript natif

Déduplication de tableaux en JavaScript

Il existe plusieurs méthodes pour supprimer les doublons d'un tableau en JavaScript natif.

1. Utilisation de indexOf

Array.prototype.removeDuplicates = function() {
    const uniqueItems = [];
    for (let item of this) {
        if (uniqueItems.indexOf(item) === -1) {
            uniqueItems.push(item);
        }
    }
    return uniqueItems;
};
const data = [1, 2, 3, 2, 1, 3, 2, 1];
console.log(data.removeDuplicates()); // Affiche [1, 2, 3]

Pour les environnements plus anciens comme IE6-8 qui ne supportent pas indexOf, une polyfill peut être ajoutée à l'objet Array.

if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(searchElement) {
        for (let i = 0; i < this.length; i++) {
            if (this[i] === searchElement) {
                return i;
            }
        }
        return -1;
    };
}

2. Méthode par tri préalable

Array.prototype.removeDuplicates = function() {
    this.sort();
    const uniqueItems = [this[0]];
    for (let i = 1; i < this.length; i++) {
        if (this[i] !== uniqueItems[uniqueItems.length - 1]) {
            uniqueItems.push(this[i]);
        }
    }
    return uniqueItems;
};
const arrayData = [1, 2, 3, 2, 1, 3, 2, 1];
console.log(arrayData.removeDuplicates()); // Affiche [1, 2, 3]

3. Utilisation de Set et Array.from en ES6

function deduplicateArray(arr) {
    return Array.from(new Set(arr));
}
console.log(deduplicateArray([1, 2, 3, 2, 1])); // Affiche [1, 2, 3]

Set est une structure de données qui élimine automatiquement les doublons, et Array.from convertit un itérable en tableau.

Conversion de chaîne en format camelCase

function toCamelCase(str) {
    return str.replace(/-([a-z])/g, function(match, letter) {
        return letter.toUpperCase();
    });
}
const inputStr = 'border-left-color';
console.log(toCamelCase(inputStr)); // Affiche borderLeftColor

Recherche du caractère le plus fréquent dans une chaîne

function findMostFrequentCharacter(str) {
    const charFrequency = {};
    for (let char of str) {
        charFrequency[char] = (charFrequency[char] || 0) + 1;
    }
    let maxCount = 0;
    let resultChar = '';
    for (let char in charFrequency) {
        if (charFrequency[char] > maxCount) {
            maxCount = charFrequency[char];
            resultChar = char;
        }
    }
    return { character: resultChar, count: maxCount };
}
const testStr = 'aabbbcccc';
const result = findMostFrequentCharacter(testStr);
console.log(`Caractère le plus fréquent: ${result.character}, Occurrences: ${result.count}`);

Extraction des chiffres à partir d'arguments variables

function extractNumberArgs() {
    const args = Array.from(arguments);
    const digitPattern = /^\d+$/;
    const numbers = args.filter(arg => digitPattern.test(arg.toString()));
    return numbers.join(',');
}
console.log(extractNumberArgs('1', 'a', '45', 'b', '3', 1)); // Affiche '1,45,3,1'

Problèmes de hoisting des variables et fonctions

En JavaScript, les déclarations de variables et de fonctions sont soumises au hoisting. Voici des exemples illustratifs :

function exampleA() {
    console.log(varA); // undefined
    var varA = 10;
    function funcA() {}
    varA = 100;
    console.log(varA); // 100
}
exampleA();

function exampleB() {
    console.log(varB); // undefined
    function funcB() {}
    var varB = 10;
    varB = 100;
    console.log(varB); // 100
}
exampleB();

(function exampleC(num) {
    console.log(num); // 100
    var num = 10;
}(100));

(function exampleD(num) {
    console.log(num); // function num() {}
    var num = 10;
    function num() {}
}(100));

(function exampleE(num) {
    function num() {}
    console.log(num); // function num() {}
    var num = 10;
    console.log(num); // 10
}(100));

function hoistingInBlocks() {
    console.log(blockVar); // undefined
    console.log(blockFunc); // undefined en mode strict, sinon undefined
    if (false) {
        var blockVar = 10;
        function blockFunc() {}
    }
    if (true) {
        var blockVar = 20;
        function blockFunc() {}
    }
    console.log(blockVar); // 20
    console.log(blockFunc); // function blockFunc() {}
}
hoistingInBlocks();

Les déclarations de fonctions sont hoistées, tandis que les expressions de fonctions ne le sont pas. La clé let nécessite le mode strict.

Vérification des types de données

function checkDataType(value) {
    return Object.prototype.toString.call(value);
}
console.log(checkDataType(42)); // Affiche [object Number]

Les types primitifs en JavaScript incluent number, string, null, undefined, boolean et symbol, stockés dans la pile. Les types de référence comme Object, Array, Date, RegExp et Function sont stockés dans le tas.

Conversion de l'objet arguments en tableau

function convertArgumentsToArray(args) {
    return Array.from(args);
}
// Alternative avec ES6
function convertWithSpread(...args) {
    return args;
}

Vérifier si un objet est un tableau

Utilisez Array.isArray() ou Object.prototype.toString.call() pour une vérification fiable.

Suppression d'un nœud DOM en JavaScript natif

function removeDOMNode(node) {
    if (node && node.parentNode) {
        node.parentNode.removeChild(node);
    }
}

Ajout d'un événement de clic à un bouton

const button = document.getElementById('myButton');
if (button.addEventListener) {
    button.addEventListener('click', function() {
        console.log('Clic détecté');
    });
} else if (button.attachEvent) {
    button.attachEvent('onclick', function() {
        console.log('Clic détecté (IE ancien)');
    });
}

addEventListener permet d'attacher plusieurs gestionnaires sans écrasement, contrairement à onclick.

Algorithmes de tri

Tri à bulles

function bubbleSort(arr) {
    for (let i = 0; i < arr.length - 1; i++) {
        for (let j = 0; j < arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
            }
        }
    }
    return arr;
}
console.log(bubbleSort([5, 3, 8, 1])); // Affiche [1, 3, 5, 8]

Tri rapide

function quickSort(arr) {
    if (arr.length <= 1) return arr;
    const pivotIndex = Math.floor(arr.length / 2);
    const pivot = arr[pivotIndex];
    const left = [];
    const right = [];
    for (let i = 0; i < arr.length; i++) {
        if (i === pivotIndex) continue;
        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
    return [...quickSort(left), pivot, ...quickSort(right)];
}
console.log(quickSort([10, 7, 8, 9, 1, 5])); // Affiche [1, 5, 7, 8, 9, 10]

Tri par sélection

function selectionSort(arr) {
    for (let i = 0; i < arr.length; i++) {
        let minIndex = i;
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex !== i) {
            [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
        }
    }
    return arr;
}
console.log(selectionSort([29, 10, 14, 37, 13])); // Affiche [10, 13, 14, 29, 37]

Étiquettes: JavaScript ES6 DOM algorithmes-de-tri hoisting

Publié le 29 juin à 20h28