200 questions JavaScript théoriques





Bonne journée, mes amis!



Voici une liste de la deuxième centaine de questions de base sur JavaScript de ce référentiel avec des réponses courtes et des liens vers le tutoriel JavaScript moderne (JSR) d'Ilya Kantor et MDN.



Cette liste, ainsi que plus de 300 questions pratiques, sont disponibles dans mon application .



L'application met en œuvre un mécanisme de mémorisation de la question étudiée, et fournit également un travail en mode hors ligne.



Je m'excuse pour les éventuelles erreurs et erreurs typographiques. Toute forme de rétroaction est appréciée.



Édition du 14.09.2019



Consultez les 100 premières questions ici .



101. À quoi sert stopPropagation ()?



Cette méthode est utilisée pour empêcher l'événement de remonter ou de remonter la chaîne à partir des ancêtres de l'élément cible. En d'autres termes, il arrête d'envoyer l'événement de l'élément cible à ses ancêtres. Prenons un exemple:



<div onclick="f2()">
    <div onclick="f1()"></div>
</div>

function f1(event) {
    event.stopPropagation()
    console.log(' ')
}

function f2() {
    console.log(' ')
}


Lorsque vous cliquez sur un conteneur imbriqué, le message "Conteneur interne" s'affiche dans la console. Si vous supprimez event.stopPropagation (), alors lorsque vous cliquez sur le conteneur imbriqué, les deux messages seront affichés dans la console.



JSR

MDN



102. Que fait return false?



Cette instruction est utilisée dans les gestionnaires d'événements pour:



  • Annulation du comportement par dĂ©faut du navigateur
  • EmpĂŞcher la propagation des Ă©vĂ©nements via le DOM
  • ArrĂŞt de l'exĂ©cution du callback et retour du contrĂ´le Ă  la fonction appelante


Notez que sans spécifier de valeur de retour, l'instruction return renvoie undefined.



JSR

MDN



103. Qu'est-ce que BOM?



La nomenclature ou (Browser Object Model) permet à JavaScript d'interagir avec le navigateur. Ce modèle comprend des objets tels que le navigateur, l'emplacement, l'historique, l'écran, XMLHttpRequest, etc. En d'autres termes, les nomenclatures sont des objets supplémentaires fournis par le navigateur pour fonctionner avec tout sauf le document.

Veuillez noter que la nomenclature n'est pas standardisée, donc sa mise en œuvre peut différer selon les navigateurs.







JSR



104. À quoi sert setTimeout ()?



Cette méthode est utilisée pour l'exécution différée d'une tâche. En d'autres termes, il permet de lancer l'exécution d'une fonction ou l'évaluation d'une expression après un certain temps (en millisecondes). Dans l'exemple suivant, nous imprimons un message sur la console après 2 secondes:



setTimeout(() => console.log('!'), 2000)

//    ,   
const timer = setTimeout(() => {
    console.log('!')
    clearTimeout(timer)
}, 2000)


JSR

MDN



105. À quoi sert setInterval ()?



Cette méthode est utilisée pour exécuter périodiquement une tâche. En d'autres termes, il vous permet d'exécuter l'exécution d'une fonction ou l'évaluation d'une expression après un certain laps de temps (en millisecondes). Dans l'exemple suivant, nous imprimons un message sur la console toutes les 2 secondes:



setInterval(() => console.log('!'), 2000)

//    ,    
//    
let i = 0
const timer = setInterval(() => {
    console.log('!')
    i++

    if (i == 2) {
        clearInterval(timer)
    }
}, 2000)


Dans le deuxième exemple, le message "Hello!" imprimera deux fois sur la console, après quoi la minuterie s'arrêtera



JSR

MDN



106. Pourquoi est-ce que JavaScript est appelé Single Threated?



JavaScript est un langage de programmation à thread unique ou synchrone. Cela signifie qu'une seule tâche peut être exécutée à la fois. Si la tâche est complexe, son exécution peut prendre beaucoup de temps et pendant ce temps, le thread principal de l'exécution du code sera bloqué. Le blocage d'un flux, à son tour, signifie qu'il n'y a pas d'interactivité sur la page. Le navigateur cesse de répondre aux actions de l'utilisateur et à d'autres événements. Pour résoudre ce problème, des rappels, des promesses, async / await, des workers et d'autres outils pour travailler avec du code asynchrone sont utilisés. En JavaScript, contrairement à, par exemple, Java, Go ou C ++, il n'y a aucun moyen de créer des threads ou des processus supplémentaires.



JSR

MDN



107. Qu'est-ce que la délégation d'événements?



La délégation d'événements est une technique dans laquelle un événement est enregistré sur un parent pour gérer les événements déclenchés par les enfants.

Souvent utilisé pour gérer les clics de bouton dans un conteneur de regroupement ou pour modifier les champs de saisie de texte dans les formulaires, par exemple:



<form>
    <input type="text" class="first-input">
    <input type="text" class="second-input">
</form>

<div>
    <button class="first-button">click</button>
    <button class="second-button">click</button>
</div>

const form = document.querySelector('form')
const buttons = document.querySelector('div')

form.addEventListener('input', event => {
    console.log(event.target.className)
})

buttons.addEventListener('click', event => {
    console.log(event.target.className)
})


Dans l'exemple ci-dessus, au lieu d'inscrire des gestionnaires sur les éléments enfants, nous les enregistrons sur les éléments parents. Entrer du texte dans un champ ou cliquer sur un bouton affichera le nom de classe de l'élément correspondant dans la console.



JSR



108. Qu'est-ce qu'ECMAScript?



ECMAScript est le langage de programmation derrière JavaScript. C'est une sorte de modèle ou de plan sur lequel JavaScript est "construit". ECMAScript est normalisé dans la spécification ECMA-262 par l'organisme de normalisation Ecma International.



JSR

MDN



109. Nommer les fonctionnalités de la syntaxe JSON



La syntaxe JSON présente les caractéristiques suivantes:



  • Les donnĂ©es sont des paires clĂ© / valeur
  • La clĂ© et la valeur sont placĂ©es entre guillemets, sauf si la valeur est un nombre ("clĂ©": "valeur")
  • Les donnĂ©es sont sĂ©parĂ©es par des virgules
  • Les objets sont entourĂ©s d'accolades
  • Tableaux - au carrĂ©


JSR

MDN



110. Que fait JSON.stringify ()?



Lors de l'envoi de données au serveur, il doit avoir un format de chaîne spécial. La méthode JSON.stringify () est utilisée pour convertir un objet en chaîne JSON:



const user = { name: '', age: 30 }
const str = JSON.stringify(user)
console.log(str) // {"name":"","age":30}


JSR

MDN



111. Que fait JSON.parse ()?



Lors de la réception des données du serveur, elles ont un format de chaîne spécial. La méthode JSON.parse () est utilisée pour convertir ces données en un objet JavaScript:



const str = { "name":"","age":30 }
const user = JSON.parse(str)
console.log(user) // {name: "", age: 30}


JSR

MDN



112. À quoi sert JSON?



Lors de l'échange de données entre client et serveur, ces données ne peuvent être que des chaînes. Puisque JSON est du texte, il est parfait pour cela. Il peut également être utilisé comme format de données par n'importe quel langage de programmation, avec d'autres formats tels que XML ou Protobuf.



JSR

MDN



113. Qu'est-ce que PWA (Progressive Web Application - Progressive Web Application)?



En bref, les PWA sont des sites Web qui se comportent comme des applications natives. Ils peuvent être installés sur un téléphone ou un ordinateur et, en règle générale, ils fonctionnent hors ligne. Pour ce dernier, des agents de service et une interface de mise en cache sont utilisés. L'avantage des PWA par rapport aux applications mobiles est leur taille et leur relative facilité de développement. En outre, vous n'avez pas besoin de dépenser des ressources pour créer deux applications pour un site: Web et mobile. Il maintient également une bonne expérience utilisateur.



MDN



114. À quoi sert clearTimeout ()?



Cette méthode est utilisée pour arrêter une minuterie démarrée par setTimeout (). Pour ce faire, l'identifiant du minuteur est écrit dans une variable, qui est ensuite passée à clearTimeout () en tant qu'argument.



const timer = setTimeout(() => {
    console.log('!')
    clearTimeout(timer)
}, 2000)


Dans l'exemple ci-dessus, deux secondes plus tard, le message «Hello!» S'affiche sur la console, après quoi le minuteur s'arrête. Ceci est fait pour que le garbage collector puisse supprimer le minuteur qui s'est exécuté.



JSR

MDN



115. À quoi sert clearInterval ()?



Cette méthode est utilisée pour arrêter une minuterie démarrée avec setInterval (). Pour ce faire, l'identifiant du minuteur est écrit dans une variable, qui est ensuite passée à clearInterval () en tant qu'argument.



let i = 1
const timer = setInterval(() => {
    console.log(i)
    i++

    if (i === 3) clearInterval(timer)
}, 1000)


Dans l'exemple ci-dessus, la valeur de la variable i est imprimée sur la console toutes les secondes, qui augmente de 1 (1, 2) à chaque fois. Lorsque i devient 3, la minuterie s'arrête.



JSR

MDN



116. Comment rediriger?



Pour ce faire, vous pouvez utiliser la propriété location de l'objet window:



location.href = 'newPage.html'
// 
location.replace('newPage.html')
// 
location.assign('newPage.html')


MDN



117. Comment vérifier si une sous-chaîne existe dans une chaîne?



Il existe au moins trois façons de procéder.

String.prototype.includes ()



const mainStr = 'hello'
const subStr = 'hel'
mainStr.includes(subStr) // true


String.prototype.indexOf ()



const mainStr = 'hello'
const subStr = 'hel'
mainStr.indexOf(subStr) !== -1 // true


RegExp



const mainStr = 'hello'
const regex = /hel/
regex.test(mainStr) // true


JSR

MDN - inclut

MDN - indexOf

MDN - test



118. Comment vérifier l'exactitude de l'adresse e-mail?



Cela peut être fait en utilisant HTML, en définissant le type du champ de saisie sur la valeur email (<input type = "email">). Cependant, cette méthode n'est pas considérée comme très fiable. Par conséquent, le courrier électronique est généralement validé à l'aide d'une expression régulière. Il est recommandé de le faire côté serveur car JavaScript peut être désactivé sur le client:



const validateEmail = email =>
    /\S+@\S+.\S+/
        .test(email.toString()
        .toLowerCase())
const email = 'myemail@example.com'
validateEmail(email) // true


Cet exemple utilise l'une des expressions régulières les plus simples pour valider une adresse e-mail. Une expression plus fiable ressemble à ceci (RFC 2822): [a-z0-9! # $% & '* + / =? ^ _ \ `{|} ~ -] + (?:. [A-z0-9! # $% & '* + / =? ^ _ \ `{|} ~ -] +) * @ (?: [a-z0-9] (?: [a-z0-9 -] * [a-z0- 9]) ?.) + [A-z0-9] (?: [A-z0-9 -] * [a-z0-9])?



119. Comment obtenir l'URL actuelle?



Pour ce faire, vous pouvez utiliser la propriété location de l'objet window ou la propriété URL de l'objet document:



console.log(' URL', location.href)
console.log(' URL', document.URL) //  Chrome     " URL chrome-search://local-ntp/local-ntp.html"


MDN - emplacement

MDN - document.URL



120. Quelles sont les propriétés de l'objet de localisation?



Les propriétés de l'objet de localisation peuvent être utilisées pour obtenir des parties de l'URL de la page actuelle:



  • href - URL complète
  • origine - protocole, hĂ´te et port (origine, utilisĂ© dans la politique d'origine commune (SOP) et le partage de ressources (CORS))
  • protocole
  • hĂ´te - hĂ´te et port
  • nom d'hĂ´te - hĂ´te
  • Port
  • chemin d'accès - chemin
  • recherche - la chaĂ®ne de requĂŞte après?
  • hash - chaĂ®ne de requĂŞte après # (ancre)
  • nom d'utilisateur - nom d'utilisateur avant le domaine
  • mot de passe - mot de passe avant le domaine


MDN



121. Comment obtenir la chaîne de requête?



Vous pouvez utiliser le constructeur d'URL pour cela:



const url = new URL('https://example.com?foo=1&bar=2')
console.log(url.search) // ?foo=1&bar=2
console.log(url.searchParams.get('foo')) // 1


MDN



122. Comment vérifier si une propriété existe dans un objet?



Il existe au moins trois façons de procéder.

En opérateur



const user = { name: '' }
console.log('name' in user) // true
console.log(!('age' in user)) // true


MĂ©thode HasOwnProperty ()



const user = { name: '' }
console.log(user.hasOwnProperty('name')) // true
console.log(!user.hasOwnProperty('age')) // true


Comparaison avec undefined



const user = { name: '' }
console.log(user.name !== undefined) // true
console.log(user.age === undefined) // true


JSR

MDN - pour ... dans

MDN - hasOwnProperty



123. Comment parcourir les propriétés énumérées d'un objet?



Pour ce faire, vous pouvez utiliser une boucle for ... in avec la méthode hasOwnProperty () pour exclure les propriétés héritées.



const user = {
    name: '',
    age: 30
}

for (key in user) {
    if (user.hasOwnProperty(key)) {
        console.log(\`${key}: ${user[key]}\`) // name:  age: 30
    }
}


JSR

MDN



124. Comment vérifier que l'objet est vide?



Il existe au moins trois façons de procéder.

Object.entries (), méthode



const obj = {}
console.log(Object.entries(obj).length === 0) // true
//      Date
const obj2 = new Date()
console.log(Object.entries(obj2).length === 0 && obj2.constructor === Object) // false


Object.keys (), méthode



const obj = {}
console.log(Object.keys(obj).length === 0) // true
//      Date
const obj2 = new Date()
console.log(Object.keys(obj2).length === 0 && obj2.constructor === Object) // false


For ... in boucle et méthode Object.hasOwnProperty ()



const obj = {}
const obj2 = {key: 'value'}

const isEmpty = obj => {
    for (key in obj) {
        if (obj.hasOwnProperty(key)) return false
    }
    return true
}

console.log(isEmpty(obj)) // true
console.log(isEmpty(obj2)) // false


JSR - Objets JSR

- Object.keys, valeurs, entrées

MDN - Object.entries

MDN - Object.keys

MDN - pour ... dans

MDN - Object.hasOwnProperty



125. Quel est l'objet des arguments?



arguments est un objet de type tableau (pseudo-tableau) contenant les arguments passés à la fonction:



function sum () {
    let total = 0
    for (let i = 0; i < arguments.length; i++) {
        total += arguments[i]
    }
    return total

    // 
    let total = 0
    for (const i of arguments) {
        total += i
    }
    return total

    // 
    return Array.from(arguments).reduce((acc, cur) => acc + cur)

}

sum(1, 2, 3) // 6


Notez que les fonctions fléchées n'ont pas d'arguments. Au lieu d'arguments, il est recommandé d'utiliser l'opérateur rest ... (autres paramètres), qui fonctionne à la fois dans les fonctions ordinaires et fléchées:



const sum = (...rest) => rest.reduce((acc, cur) => acc + cur)

sum(1, 2, 3) // 6


JSR

MDN



126. Comment mettre en majuscule la première lettre d'une chaîne?



Cela peut être fait en utilisant les méthodes charAt (), toUpperCase () et slice ():



String.prototype.capitilize = function () {
    return this.charAt(0).toUpperCase() + this.slice(1)
}

console.log('hello'.capitilize()) // Hello


JSR

MDN - charAt

MDN - toUpperCase

MDN - tranche



127. Comment obtenir la date actuelle?



Cela peut ĂŞtre fait Ă  l'aide d'un objet Date ou du constructeur Intl.DateTimeFormat:



console.log(new Date().toLocaleDateString()) // 02.09.2020

console.log(new Intl.DateTimeFormat(
    'ru-Ru',
    {
        weekday: 'long',
        day: 'numeric',
        month: 'long',
        year: 'numeric'
    }
).format(new Date())) // , 2  2020 .


JSR - Date

JSR = Intl

MDN - Date

MDN - Intl.DateTimeFormat



128. Comment comparer deux objets Date?



Pour ce faire, vous ne devez pas comparer les objets eux-mêmes, mais, par exemple, les valeurs renvoyées par la méthode getTime ():



const d1 = new Date()
const d2 = new Date(d1)

console.log(d1.getTime() === d2.getTime()) // true
console.log(d1 === d2) // false


JSR

MDN



129. Comment vérifier qu'une ligne commence sur une autre ligne?



Vous pouvez utiliser la méthode intégrée startsWith () pour ce faire:



console.log('Good morning'.startsWith('Good')) // true
console.log('Good morning'.startsWith('morning')) // false


Selon CanIUse, cette méthode est prise en charge par près de 94% des navigateurs



JSR

MDN



130. Comment supprimer les problèmes d'une ligne?



Pour ce faire, vous pouvez utiliser les méthodes intégrées trimStart () (début de ligne), trimEnd () (fin de ligne) et trim () (début et fin de ligne):



console.log('  hello world   '.trim()) // hello world


la coupe ne fonctionne pas pour les espaces entre les mots. Dans ce cas, vous pouvez utiliser la méthode replace () et l'expression régulière:



console.log('hello   world'.replace(/s+/, ' ')) // hello world
//    
console.log('hello   world'.replace(/s{2,}/, ' ')) // hello world
console.log('key   value'.replace(/s{2,}/, ' -> ')) // key -> value


Selon CanIUse , les méthodes trimStart () et trimEnd () sont prises en charge par 93% des navigateurs.



MDN



131. Comment ajouter une nouvelle propriété à un objet?



Il y a deux façons de faire ça. Supposons que nous ayons un objet comme celui-ci:



const obj = {
    name: '',
    age: 30
}


Nous pouvons y ajouter une nouvelle propriété en utilisant la notation par points ou par crochets:



obj.job = ''
obj['job'] = ''


L'une des différences entre ces méthodes est que lors de l'utilisation de la notation entre parenthèses, la clé ajoutée peut être un nombre:



const obj = {}
obj[1] = ''
console.log(obj) // { 1: '' }
obj.2 = '' // SyntaxError: Unexpected number


JSR

MDN



132. L'expression! - est-elle un opérateur spécial?



Non ce n'est pas. C'est une combinaison de deux opérateurs: opérateur! (logique non) et opérateur - (décrémenter). Si vous utilisez l'expression spécifiée avec une valeur quelconque, cette valeur sera d'abord diminuée de un, puis convertie en un type booléen et inversée:



const fun = val => !--val
const a = 1
const b = 2
console.log(fun(a)) // !0 -> not false -> true
console.log(fun(b)) // !1 -> not true -> false


JSR

MDN - logique PAS

MDN - décrémentation



133. Comment affecter une valeur par défaut à une variable?



Pour ce faire, vous pouvez utiliser le || (booléen ou):



const a = b || 'default'


Dans ce cas, la variable a se verra attribuer la valeur par défaut si la valeur de la variable b est false (false, undefined, null, NaN, 0, '').

Si nous parlons des valeurs standard des paramètres de fonction, elles peuvent être affectées comme suit:



const greet = (name = '') => \`, ${name}!\`
console.log(greet('')) // , !
console.log(greet()) // , !


De plus, les paramètres suivants peuvent utiliser les valeurs des précédents comme valeurs standard:



const sum = (a = 1, b = a + 2) => a + b
console.log(sum()) // 4


JSR

MDN



134. Comment créer une chaîne multiligne?



Auparavant, il était fait quelque chose comme ceci (caractères de contrôle de concaténation et de saut de ligne):



const str =
    ' ' + ' ' +
    ' ' + ' ' +
    '!'

// 
const str = '  a
  
 !'
console.log(str)
/*
     
     
    !
*/


Maintenant, ils le font comme ceci (modèle littéral):



const str =
    \` 
     
    !\`


JSR

MDN



135. Pouvons-nous ajouter des propriétés aux fonctions?



Puisque les fonctions sont également des objets, nous pouvons facilement leur ajouter des propriétés. La valeur de la propriété de la fonction peut être une autre fonction:



function someFun () {}
someFun.somePropName = 'somePropValue'

console.log(someFun.somePropName) // somePropValue
//  
console.log(someFun.name) // someFun

const sum = (x, y) => x + y
console.log(sum(1, 2)) // 3

sum.curry = x => y => x + y
console.log(sum.curry(1)(2)) // 3


JSR

MDN



136. Comment savoir combien d'arguments une fonction s'attend Ă  recevoir?



La propriété length peut être utilisée pour cela:



const sum = (a, b, c) => +a + +b + +c
console.log(sum(1, '1', true)) // 3
console.log(sum(0, '', [])) // 0

console.log(sum.length) // 3


MDN



137. Qu'est-ce qu'un polyfill?



Les polyfills sont utilisés pour faire fonctionner JavaScript moderne dans les anciens navigateurs. Cela se fait en implémentant de nouvelles fonctionnalités du langage en utilisant l'ancienne syntaxe. Le processus même de conversion d'un nouveau code en ancien code s'appelle la transpilation. Le transpilateur le plus populaire pour le code JavaScript est Babel.

Par exemple, l'une des dernières fonctionnalités JavaScript est la méthode Promise.allSettled (), qui, contrairement à Promise.all (), ne se termine pas lorsqu'une des promesses qui lui sont transmises est rejetée.

Cependant, à partir d'aujourd'hui, le support de son navigateur selon les données CanIUse est de 80%, donc un polyfill est nécessaire:



const promise1 = Promise.resolve('promise1')
const promise2 = Promise.reject('promise2')
const promise3 = Promise.resolve('promise3')

//     Promise.allSettled()
Promise
    .allSettled([promise1, promise2, promise3])
    .then(console.log)
/*
    [
        {status: "fulfilled", value: "promise1"},
        {status: "rejected", reason: "promise2"},
        {status: "fulfilled", value: "promise3"},
    ]
*/

//    
//  Promise.all() = 94%
const allSettled = promises => {
    const wrappedPromises = promises
        .map(p => Promise.resolve(p)
        .then(
            val => ({
                status: 'fulfilled',
                value: val
            }),
            err => ({
                status: 'rejected',
                reason: err
            })))
    return Promise.all(wrappedPromises)
}
allSettled([promise1,promise2,promise3])
    .then(console.log)


JSR

MDN



138. À quoi servent les instructions continue et break?



L'instruction break est utilisée pour sortir de la boucle. Après avoir arrêté l'itération, le code continue:



const obj = {
    1: 'Everything',
    2: 'is',
    3: 'impossible'
}

for (key in obj) {
    if (obj[key] === 'impossible') break

    console.log(obj[key]) // Everything is
}

console.log('possible') // possible


L'instruction continue est utilisée pour ignorer l'itération:



const obj = {
    1: 'Everything',
    2: 'is',
    3: 'impossible',
    4: 'possible'
}

for (key in obj) {
    if (obj[key] === 'impossible') continue

    console.log(obj[key]) // Everything is possible
}


MDN - briser

MDN - continuer



139. Qu'est-ce qu'une Ă©tiquette?



Les étiquettes vous permettent de nommer des boucles et des blocs de code. Ils peuvent être utilisés, par exemple, pour sortir d'une boucle ou comme condition pour exécuter du code:



loop1:
for (let i = 0; i < 3; i++) {
    loop2:
    for (let j = 0; j < 3; j++) {
        if (i === j) continue loop1

        console.log(\`i = ${i}, j = ${j}\`)
    }
}

/*
    i = 1, j = 0
    i = 2, j = 0
    i = 2, j = 1
*/


L'utilisation d'étiquettes est considérée comme une mauvaise pratique.



MDN



140. Quels sont les avantages de déclarer des variables au début du code?



Il est recommandé de déclarer les variables au début de chaque script ou fonction. Cela offre les avantages suivants:



  • Garde le code propre
  • Toutes les variables sont au mĂŞme endroit
  • Évite la crĂ©ation accidentelle de variables globales
  • EmpĂŞche les remplacements de variables indĂ©sirables


JSR

MDN



141. Quels sont les avantages de l'initialisation d'une variable lorsqu'elle est déclarée?



Il est recommandé d'initialiser toutes les variables au moment de la déclaration. Cela offre les avantages suivants:



  • Garde le code propre
  • Les variables et leurs valeurs sont au mĂŞme endroit
  • EmpĂŞche les variables non initialisĂ©es d'ĂŞtre affectĂ©es non dĂ©finies


JSR

MDN



142. Quelles sont les principales recommandations pour créer un objet



Pour créer un objet, au lieu du constructeur d'objet new Object (), il est recommandé d'utiliser la notation entre parenthèses {}. En outre, selon le type de valeur, il est recommandé d'utiliser les éléments suivants:



  • string comme '' au lieu de new String ()
  • un nombre, par exemple 0 au lieu du nouveau nombre ()
  • valeur boolĂ©enne comme false au lieu de new Boolean ()
  • [] au lieu de new Array ()
  • // au lieu de new RegExp ()
  • function () {} au lieu de new Function ()


JSR

MDN



143. Comment définir un tableau au format JSON?



Le tableau JSON est un tableau d'objets JSON, par exemple:



[
    { "name": "", "age": 30 },
    { "name": "", "age": 20 }
]


JSR

MDN



144. Comment implémenter une fonction qui renvoie un entier aléatoire dans une plage donnée?



Cette fonction peut être implémentée à l'aide des méthodes Math.random () et Math.floor () de l'objet Math:



const getRandomInteger = (min, max) => Math.floor(min + Math.random() * (max + 1 - min))


JSR

MDN - Math.random ()

MDN - Math.floor ()



145. Qu'est-ce que le tremblement des arbres?



La secousse d'arbre est la suppression du code des modules inutilisés. Ces modules ne sont pas inclus dans l'assemblage final (bundle). Pour que le générateur de modules (bundler) détermine quels modules sont utilisés et lesquels ne le sont pas, la structure du programme doit être basée sur des modules ES6. Cette technique a été popularisée par le bundler Rollup.



MDN



146. À quoi sert le secouage des arbres?



La secousse d'arbre peut réduire considérablement la taille d'un assembly (bundle) en supprimant le code des modules inutilisés. Plus la taille de l'assemblage est petite, meilleures sont les performances de l'application. La secousse d'arbre est implémentée dans les générateurs de modules tels que Rollup et Webpack.



MDN



147. Qu'est-ce qu'une expression régulière?



Une expression régulière est une séquence de caractères qui forment un modèle de recherche. Ce modèle peut être utilisé pour rechercher des données dans du texte, telles que des sous-chaînes dans une chaîne. Les expressions régulières sont largement utilisées par de nombreux langages de programmation pour les opérations de recherche et de remplacement de texte. Le modèle général de regex ressemble à ceci:



//


Exemple:



const regex = /java/i
const str = 'JavaScript'
console.log(regex.test(str)) // true


Vous pouvez également utiliser le constructeur RegExp pour créer une expression régulière:



const regex = new RegExp('java', 'i')
const str = 'JavaScript'
console.log(regex.test(str)) // true


JSR

MDN



148. Quelles méthodes sont utilisées dans les expressions régulières?



Il existe deux méthodes principales utilisées dans les expressions régulières: exec () et test ().

La méthode exec () recherche une correspondance d'expression régulière dans la chaîne qui lui est transmise en tant qu'argument. Le comportement de cette méthode dépend de si l'expression régulière a l'indicateur g. Sinon, la première correspondance est renvoyée. Si l'indicateur g est présent, alors:



  • L'appel exec () renvoie la première correspondance et stocke la position après celle-ci dans la propriĂ©tĂ© lastIndex.
  • Le prochain appel de ce type dĂ©marre la recherche Ă  la position lastIndex, retourne la correspondance suivante et se souvient de la position après celle-ci dans lastIndex.
  • S'il n'y a plus de correspondances, exec () retourne null et lastIndex est mis Ă  0.


const str = 'Java  JavaScript -   '
const regex = /Java/g

let result
while (result = regex.exec(str)) {
    console.log(
        \` ${result[0]}   ${result.index}\`
    )
}
/*
     Java   0
     Java   7
*/


La méthode test () renvoie une valeur booléenne selon qu'une correspondance est trouvée dans la chaîne:



const str = '  JavaScript'

console.log(
    / /.test(str) // true
)


JSR

MDN



149. Quels indicateurs sont utilisés dans les expressions régulières?



Drapeau La description
g comparaison globale
je ignorer la casse lors de la correspondance
m correspondance sur plusieurs lignes


const regex = /([-]+)s([-]+)/i
const str = ' '
const newStr = str.replace(regex, '$2 $1')
console.log(newStr) //  


JSR

MDN



150. Quels caractères spéciaux sont utilisés dans les expressions régulières?



Les caractères spéciaux utilisés dans les expressions régulières peuvent être divisés en plusieurs groupes.

Classes de caractères de base:

symbole Valeur
\. n'importe quel caractère à quelques exceptions près
\ ré numéral
\ RÉ pas un nombre
\ w Caractère latin et trait de soulignement
\ W pas de caractère latin ni de soulignement
\ s caractère d'espacement
\ S pas de caractère d'espacement
\ s'Ă©chapper comme \. Est le point


Jeux de caractères:

symbole Valeur
[a-yayo-yo] n'importe quelle lettre de l'alphabet russe
[^ a-yyoA-yyo] tout caractère sauf les lettres de l'alphabet russe


Les frontières:

symbole Valeur
^ début de ligne
$ fin de ligne
\ b limite de mot de largeur nulle
\ B limite de mot de largeur différente de zéro


Regroupement:

symbole Valeur
(X) correspond à x, la correspondance est mémorisée
(?: X) correspond à x, la correspondance n'est pas mémorisée


Quantificateurs:

symbole Valeur
* zéro caractère ou plus
+ un ou plusieurs caractères
*? et +? similaire Ă  * et +, mais Ă  la recherche de la correspondance minimale
? zéro ou un caractère
x (? = y) correspond Ă  x si x est suivi de y
x (?! y) correspond Ă  x si x n'est pas suivi de y
(? <= y) x correspond à x si x précède y
(?! y) x correspond à x si x ne précède pas y
x | y x ou y
x {n} n est le nombre exact de x
x {n,} n - nombre minimum de x
x {n, m} n - nombre minimum x, m - maximum (de, Ă )


JSR

MDN



151. Comment changer les styles d'un élément HTML?



Cela peut être fait soit en utilisant la propriété style, soit en attribuant une classe appropriée à l'élément:



document
    .querySelector(selector)
    .style.property = value
document
    .querySelector('title')
    .fontSize = '2rem'

document.querySelector(selector)
    .className = 'class-name'
document.querySelector(selector)
    .classList.add('class-name')
document.querySelector('button')
    .classList.add('active')


JSR

MDN - style

MDN - className

MDN - classList



152. Qu'est-ce qu'un débogueur?



L'expression du débogueur donne accès à toutes les fonctionnalités de débogage disponibles dans un environnement spécifique, par exemple, la définition de points d'arrêt (points d'arrêt, points d'arrêt). Si la fonctionnalité de débogage n'est pas disponible au moment de l'exécution, cette expression n'aura aucun effet:



const fun = () => {
    // 
    debugger //       
    // 
}


JSR

MDN



153. À quoi servent les points d'arrêt du débogueur?



Les points de contrôle sont utilisés pour suspendre l'exécution d'une fonction ou d'un autre code à un emplacement spécifique afin de découvrir pourquoi un programme ne fonctionne pas correctement. Une fois arrêtée, la fonction peut être poursuivie.



JSR

MDN



154. Des mots réservés peuvent-ils être utilisés comme identifiants?



Non, vous ne pouvez pas utiliser de mots réservés comme noms pour des variables, des étiquettes, des fonctions ou des objets:



const class = '    ' // SyntaxError: Unexpected token 'class'


155. Comment déterminer la largeur et la hauteur de l'image?



Cela peut être fait de plusieurs manières. Voici l'un d'entre eux:



const getImgSize = src => {
    const img = new Image()
    img.src = src
    img.addEventListener('load', () => console.log(\`${img.width} x ${img.height}\`)) // 276 x 110
    document.body.append(img)
}
getImgSize('http://www.google.com/ intl/en_ALL/images/logo.gif')


MDN



156. Comment envoyer une requĂŞte HTTP synchrone?



Pour ce faire, vous pouvez utiliser l'objet XMLHttpRequest en le passant à la méthode open () avec un troisième argument facultatif avec la valeur false:



const getUsers = url => {
    const xhr = new XMLHttpRequest()
    xhr.open('GET', url, false)
    xhr.send()
    console.table(xhr.response)

    const response = JSON.parse(xhr.response)
    const template = \`
        <table>
            ${response.reduce((html, user) => html += \`
                <tr>
                    <td>${user.name}</td>
                    <td>${user.username}</td>
                    <td>${user.email}</td>
                </tr>\`, '')}
        <table>
    \`
    document.body
        .insertAdjacentHTML('beforeend', template)
}

getUsers('https://jsonplaceholder. typicode.com/users')


JSR

MDN



157. Comment faire une requĂŞte HTTP asynchrone?



La méthode fetch () peut être utilisée pour cela:



const getUsers = async url => {
    const response = await fetch(url)
    const data = await response.json()
    console.table(data)

    const template = \`
        <table>
            ${data.reduce((html, user) => html += \`
                <tr>
                    <td>${user.name}</td>
                    <td>${user.username}</td>
                    <td>${user.email}</td>
                </tr>\`, '')}
        <table>
    \`
    document.body.insertAdjacentHTML('beforeend', template)
}

getUsers('https://jsonplaceholder. typicode.com/users')


JSR

MDN



158. Comment obtenir la date au format requis?



La méthode toLocaleString () peut être utilisée pour cela:



console.log(
    new Date().toLocaleString('ru-Ru', {
        weekday: 'long',
        year: 'numeric',
        month: 'long',
        day: 'numeric'
    })
) // , 6  2020 .


MDN



159. Comment obtenir les tailles de page maximales?



Pour ce faire, vous devez rechercher les valeurs maximales des propriétés scrollWidth, offsetWidth, clientWidth et scrollHeight, offsetHeight, clientHeight des objets document.body et document.documentElement:



const pageWidth = Math.max(
    document.body.scrollWidth, document.documentElement.scrollWidth,
    document.body.offsetWidth, document.documentElement.offsetWidth,
    document.body.clientWidth, document.documentElement.clientWidth
)
const pageHeight = Math.max(
    document.body.scrollHeight, document.documentElement.scrollHeight,
    document.body.offsetHeight, document.documentElement.offsetHeight,
    document.body.clientHeight, document.documentElement.clientHeight
)
const pageSize = {
    width: pageWidth,
    heigth: pageHeight
}
console.log(pageSize)

const pageCenter = {
    centerX: pageWidth / 2,
    centerY: pageHeight / 2
}
console.log(pageCenter)


JSR



160. Qu'est-ce qu'un opérateur conditionnel ou ternaire?



L'opérateur ternaire est une manière abrégée d'écrire le bloc if ... else:



let accesAllowed
const age = propmt('  ?')

// if...else
if (age > 18) {
    accesAllowed = true
} else {
    accessAllowed = false
}

//  
(age > 18)
    ? accesAllowed = true
    : accessAllowed = false


JSR

MDN



161. Peut-on utiliser une chaîne d'opérateurs ternaires?



Oui, dans ce cas, l'opérateur ternaire est une alternative au bloc if ... else if ... else:



let accessAllowed
const getAge = () => prompt('  ?')

//     -    
// if...else if...else
const checkAge = (age = getAge()) => {
    console.log(age)
    if (isNaN(age)) {
        Promise.resolve(alert('   ')).then(accessAllowed = false).then(checkAge)
    } else if (age === null || age === '') {
        Promise.resolve(alert('  ')).then(accessAllowed = false).then(checkAge)
    } else if (age < 0) {
        Promise.resolve(alert('     0')).then(accessAllowed = false).then(checkAge)
    } else if (age > 100) {
        Promise.resolve(alert('     100')).then(accessAllowed = false).then(checkAge)
    } else if (age < 18) {
        Promise.resolve(alert(',   ')).then(accessAllowed = false)
    } else {
        Promise.resolve(alert(' !')).then(accessAllowed = true)
    }
    console.log(accessAllowed)
}

//  
const checkAge = (age = getAge()) => {
    isNaN(age)
        ? Promise.resolve(alert('   ')).then(accessAllowed = false).then(checkAge)
        : (age === null || age === '')
          ? Promise.resolve(alert('  ')).then(accessAllowed = false).then(checkAge)
          : (age < 0)
            ? Promise.resolve(alert('     0')).then(accessAllowed = false).then(checkAge)
            : (age > 100)
            ? Promise.resolve(alert('     100')).then(accessAllowed = false).then(checkAge)
            : (age < 18)
                ? Promise.resolve(alert(',   ')).then(accessAllowed = false)
                : Promise.resolve(alert(' !')).then(accessAllowed = true)
    console.log(accessAllowed)
}


JSR

MDN



162. Comment démarrer l'exécution du code après le chargement complet de la page?



Cela peut être fait de plusieurs manières.

Placez la balise de script avant la balise de fermeture du corps ou ajoutez-lui un attribut defer:



<body>
    ...
    <script src="script.js"></script>
</body>

<!--  -->
<head>
    ...
    <script src="script.js" defer></script>
</head>


Si votre script est un module, au lieu de l'attribut defer, vous devez spécifier l'attribut type avec le module de valeur:



<script src="script.js" type="module"></script>


Ajoutez un attribut onload Ă  la balise body:



<body onload="script()"></body>


Ajoutez du code pour gérer l'événement load de l'objet window:



window.onload = () => console.log('  ')

// 
window.addEventListener('load', () => console.log('  '))


Faites de mĂŞme pour document.body:



document.body.onload = () => console.log('  ')


163. Quelle est la différence entre __proto__ et prototype?



La propriété __proto__ (propriété cachée interne [[Prototype]]) est un objet dont une instance hérite des champs et des méthodes. Et prototype est un objet utilisé pour créer __proto__ lorsqu'il est instancié à l'aide du nouveau mot-clé:



class Person {
    constructor(firstName, secondName) {
        this.firstName = firstName
        this.secondName = secondName
    }
    getFullName() {
        return \`${this.firstName} ${this.secondName}\`
    }

}

const user = new Person('', '')
console.log(user.getFullName()) //  
console.log(user.__proto__.getFullName === Person.prototype.getFullName) // true
console.log(Person.prototype) // {constructor: Ć’, getFullName: Ć’}
console.log(user.prototype === undefined) // true


JSR

MDN



164. Donnez un exemple de l'utilisation obligatoire d'un point-virgule



L'une des utilisations obligatoires des points-virgules est l'utilisation de IIFE (Immediately Invoked Fuction Expression):

Par exemple, le code suivant:



try {
    const x = ''

    (() => {
        console.log(x)
    })()
} catch {
    console.log(' ')
}


Sera interprété comme ceci:



try {
    const x = ''(() => {
        console.log(x)
    })()
} catch {
    console.log(' ')
}


Par conséquent, dans le bloc try, nous obtenons une TypeError: "To be" n'est pas une fonction, le contrôle est passé au bloc catch et "Not to be" est envoyé à la console.

Pour que le code fonctionne comme prévu, il doit ressembler à ceci:



try {
    //       
    const x = '';
    //  
    ;(() => {
        console.log(x)
    })()
} catch {
    console.log(' ')
}


N'oubliez pas non plus les cas de placement automatique de points-virgules.



165. A quoi sert la méthode freeze ()?



Cette méthode, comme son nom l'indique, sert à "figer" un objet. Un objet gelé est immuable (immuable). Cela signifie que vous ne pouvez pas ajouter de nouvelles propriétés à un tel objet, supprimer ou modifier celles existantes. Cette méthode définit également configurable: false et writable: false pour les propriétés existantes. La méthode renvoie un objet gelé.



'use strict'
const obj = {
    mission: 'possible'
}

Object.freeze(obj)
obj.mission = 'impossible' // TypeError: Cannot assign to read only property 'mission' of object '#<Object>'

delete obj.mission // TypeError: Cannot delete property 'mission' of #<Object>


Notez qu'en mode non strict, aucune exception n'est levée, le code ne s'exécute tout simplement pas.



JSR

MDN



166. Pourquoi avons-nous besoin de la méthode freeze ()?



Le paradigme de la programmation orientée objet dit qu'une interface contenant un certain nombre d'éléments doit être immuable, c'est-à-dire il doit être impossible d'étendre, de modifier ou d'utiliser des éléments en dehors du contexte actuel. Cette méthode est un alias pour le mot-clé final dans certains autres langages de programmation.



JSR

MDN



167. Comment mettre en majuscule la première lettre de chaque mot d'une ligne?



Une façon de procéder est la suivante:



const capitilize = str => str.replace(
    /[-]S+/gi,
    txt => txt[0].toUpperCase() + txt.slice(1).toLowerCase()
)

console.log(capitilize(', , ')) // , , 


168. Comment savoir si JavaScript est désactivé sur une page?



Vous pouvez utiliser la balise noscript pour cela. Le code à l'intérieur de cette balise ne sera exécuté que si JavaScript est désactivé sur la page:



    console.log('JavaScript ')

<noscript>
    <p> JavaScript,    </p>
</noscript>


Pour désactiver JavaScript dans Chrome, allez dans les paramètres -> section "Confidentialité et sécurité" -> Paramètres du site -> section "Contenu" -> JavaScript.



MDN



169. Quels opérateurs sont pris en charge par JavaScript?



Les opérateurs sont utilisés pour travailler avec des valeurs ou des opérandes. JavaScript prend en charge les opérateurs suivants:



  • ArithmĂ©tique: + (addition, conversion en un nombre, concatĂ©nation), - (soustraction), * (multiplication), / (division),% (modulo, avec reste), ++ (incrĂ©mentation), - (dĂ©crĂ©mentation), * * (exponentiation)
  • opĂ©rateurs de comparaison: == (Ă©galitĂ© abstraite, lâche),! = (inĂ©galitĂ© abstraite), === (Ă©galitĂ© stricte, contrĂ´le d'identitĂ©) ,! == (inĂ©galitĂ© stricte),>,> =, <, <=
  • logique: && (et), || (ou),! (not) (!!! (double nĂ©gation) n'est pas un opĂ©rateur sĂ©parĂ©)
  • opĂ©rateurs d'affectation: =, + =, - =, * =, / =,% =
  • ternaire :? ...: (si ... sinon)
  • opĂ©rateur typeof: dĂ©finit le type de l'opĂ©rande
  • au niveau du bit: & (et), | (ou), ^ (exclusif ou), ~ (pas), << (dĂ©calage gauche), >> (dĂ©calage droit), >>> (dĂ©calage droit avec un remplissage nul)
  • nouveau :? .. ​​(chaĂ®ne optionnelle), ?? (fusion nulle)


//  
const obj = {
    foo: {
        baz: {
            qux: 'bar'
        }
    }
}

// 
console.log(obj.foo.bar.baz.qux) // TypeError: Cannot read property 'baz' of undefined

if (
    obj.foo !== undefined &&
    obj.foo.bar !== undefined &&
    obj.foo.bar.baz !== undefined
) {
    console.log(obj.foo.bar.baz.qux) //   
}

// 
console.log(obj?.foo?.bar?.baz?.qux) // undefined

//   null
console.log(
    0 || 'default null', // 'default null'
    0 ?? 'default null', // 0
    '' || 'default string', // default string
    '' ?? 'default string', // ''
)


JSR - Opérateurs JSR - Opérateurs

logiques

JSR - Opérateurs de comparaison JSR - Opérateurs

JSR conditionnels -

Opérateurs binaires

MDN - Opérateur de séquence facultatif

MDN - Opérateur de fusion nul



170. A quoi sert l'opérateur rest ... (autres paramètres)?



L'opérateur rest est une alternative à l'objet arguments et renvoie un tableau des arguments passés à la fonction:



const sum = (...rest) => rest.reduce((acc, cur) => acc + cur)

console.log(sum(1, 2, 3)) // 6


Veuillez noter que l'opérateur rest doit être passé comme dernier argument:



const fun = (x, ...rest, y) => console.log(rest) // SyntaxError: Rest parameter must be last formal parameter


JSR

MDN



171. À quoi sert l'opérateur de diffusion?



L'opérateur de diffusion est utilisé pour développer (décompresser, développer) les entités itératives (tableaux, chaînes). Déballer signifie convertir, par exemple, un tableau de nombres en un ensemble de valeurs simples:



const sum = (x, y, z) => x + y + z

const nums = [1, 2, 3]

console.log(sum(...nums)) // 6


JSR

MDN



172. Comment déterminer si un objet est gelé?



Afin de déterminer si un objet est gelé, c'est-à-dire est-il immuable (immuable) la méthode isFrozen () est utilisée:



const obj = {
    prop: '    JavaScript!'
}

Object.freeze(obj)

console.log(Object.isFrozen(obj)) // true


MDN



173. Comment déterminer l'égalité des valeurs à l'aide d'un objet?



La méthode is () peut être utilisée pour cela:



Object.is('  ', '  ') // true
Object.is(0.1 + 0.2, 0.3) // false
Object.is(window, window) // true
Object.is(+0, -0) // false

const objA = {}
const objB = objA
Object.is(objA, objB) // true
Object.is({}, {}) // false


Les valeurs sont Ă©gales si:



  • les deux ne sont pas dĂ©finis
  • les deux sont nuls
  • les deux sont vrais ou faux
  • les deux sont des chaĂ®nes de mĂŞme longueur avec les mĂŞmes caractères
  • tous deux font rĂ©fĂ©rence au mĂŞme objet
  • les deux sont des nombres, +0, -0 ou NaN


JSR

MDN



174. Comment créer une copie d'un objet?



L'un des moyens les plus fiables de le faire est d'utiliser la méthode assign ():



const objA = {a: 1, b: 2}
const objB = Object.assign(objA)

console.log(objB) // {a: 1, b: 2}

console.log(objA === objB) // true


En outre, cette méthode vous permet de combiner des objets, à l'exclusion des doublons:



const objA = {a: 1, b: 2}
const objB = {b: 2, c: 3}

const objC = Object.assign(objA, objB)
console.log(objC) {a: 1, b: 2, c: 3}


Vous pouvez utiliser la liaison JSON.parse-JSON.stringify pour copier des objets simples:



const objA = {a: 1, b: 2}

const objB = JSON.parse(JSON.stringify(objA))

console.log(objB) // {a: 1, b: 2}


JSR

MDN



175. Qu'est-ce qu'un proxy?



L'objet Proxy «s'enroule» autour d'un autre objet et peut intercepter (et, si désiré, traiter indépendamment) diverses actions avec lui, par exemple, lire / écrire des propriétés et autres.



const handler = {
    get: (obj, prop) => prop in obj
        ? obj[prop]
        : 0
}

// new Proxy(, )
const p = new Proxy({}, handler)

p.a = 1
p.b = true

console.log(p.a, p.b) // 1 true
console.log( 'c' in p, p.c) // false 0


176. À quoi sert la méthode seal ()?



Cette méthode "scelle" l'objet, empêchant l'ajout / la suppression de propriétés. Il définit également configurable: false pour toutes les propriétés existantes. Cependant, les valeurs des propriétés d'un tel objet peuvent être modifiées. La méthode isSealed () est utilisée pour vérifier si un objet est scellé.



'use strict'
const obj = {
    prop: '    JavaScript!'
}

Object.seal(obj)

obj.prop = ' ,   '
console.log(Object.isSealed(obj)) // true
delete obj.prop // TypeError: Cannot delete property 'prop' of #<Object>
console.log(obj.prop) //  ,   


Notez qu'en mode laxiste, une tentative de suppression d'une propriété sur un objet scellé échouera silencieusement.



JSR

MDN



177. Quelle est la différence entre les méthodes freeze () et seal ()?



La méthode Object.seal (), contrairement à la méthode Object.freeze (), vous permet de modifier les propriétés existantes d'un objet.



'use strict'
const objA = {
    prop: ''
}
Object.freeze(objA)
objA.prop = ' ' // TypeError: Cannot assign to read only property 'prop' of object '#<Object>'

const objB = {
    prop: ' '
}
Object.seal(objB)
objB.prop = ''
console.log(objB.prop) // 


178. Comment obtenir les paires clé / valeur énumérées d'un objet?



La méthode Object.entries () renvoie un tableau de paires clé / valeur d'objet énumérées sous forme de sous-tableaux dans le même ordre que la boucle for ... in:



const obj = {
    x: 1,
    y: 2
}

console.log(Object.entries(obj)) // [["x", 1], ["y", 2]]

for (let [key, value] of Object.entries(obj)) {
    console.log(\`${key}: ${value}\`) // x: 1 y: 2
}


JSR

MDN



179. Quelle est la principale différence entre les méthodes Object.keys (), Object.values ​​() et Object.entries ()?



La méthode Object.keys () renvoie les clés d'un objet, la méthode Object.values ​​() renvoie les valeurs de ses propriétés et Object.entries () renvoie un tableau de paires clé / valeur:



const user = {
    name: '',
    age: 30
}

console.log(Object.keys(user)) // ["name", "age"]
console.log(Object.values(user)) // ["", 30]
console.log(Object.entries(user)) // [["name", ""], ["age", 30]]


JSR

MDN - Object.keys ()

MDN - Object.values ​​()

MDN - Object.entries ()



180. Comment créer un objet avec un prototype spécifique sans utiliser de fonction constructeur et de classes?



La méthode Object.create () peut être utilisée pour cela:



const firstUser = {
    name: '',
    sayHi() {
        console.log(\`,   ${this.name}!\`)
    }
}

const secondUser = Object.create(firstUser)

secondUser.name = ''
secondUser.sayHi() // ,   !


JSR

MDN



181. À quoi sert WeakSet?



WeakSet est utilisé pour stocker une collection d'objets faiblement référencés. En d'autres termes, il sert de stockage supplémentaire pour les objets utilisés par d'autres codes. Ces objets sont automatiquement supprimés par le ramasse-miettes lorsqu'ils deviennent inaccessibles (inutilisés), c'est-à-dire lorsque seule la clé reste de l'objet dans le WeakSet.



const ws = new WeakSet()
let user = {}

ws.add(user)
console.log(ws.has(user)) // true

user = null
console.log(ws.has(user)) // false,    


JSR

MDN



182. Quelle est la différence entre Set et WeakSet?



Leur principale différence est que les objets stockés dans le WeakSet sont faiblement référencés, c'est-à-dire sont automatiquement supprimés dès qu'ils deviennent inaccessibles. Les autres différences sont les suivantes:



  • Set peut stocker n'importe quelle valeur et WeakSet ne peut stocker que des objets
  • WeakSet n'a pas de propriĂ©tĂ© de taille
  • WeakSet n'a pas de mĂ©thodes clear (), keys (), values ​​(), forEach ()
  • WeakSet n'est pas une entitĂ© itĂ©rable


JSR

MDN



183. Quelles méthodes sont disponibles dans le WeakSet?



WeakSet a les méthodes suivantes:



  • add (): ajoute un objet Ă  la collection
  • delete (): supprime un objet d'une collection
  • has (): dĂ©termine si un objet est dans la collection
  • length (): renvoie la longueur de la collection


const ws = new WeakSet()
const objA = {}
const objB = {}

ws.add(objA)
ws.add(objB)
console.log(ws.has(objA)) // true
console.log(ws.lenghth()) // 2
ws.delete(objA)
console.log(ws.has(objA)) // false


JSR

MDN



184. À quoi sert WeakMap?



WeakMap est utilisé pour stocker des paires clé / valeur où les clés sont faiblement référencées. En d'autres termes, il sert de référentiel supplémentaire pour les clés utilisées par d'autres codes. Ces clés sont automatiquement supprimées par le ramasse-miettes lorsqu'elles deviennent inaccessibles (inutilisées), c'est-à-dire lorsque seule la clé reste dans le WeakMap.



const wm = new WeakMap()
let user = {}
wm.set(user, 'user')
console.log(wm.has(user)) // true
user = null
console.log(wm.has(user)) // false,    


JSR

MDN



185. Quelle est la différence entre Map et WeakMap?



Leur principale différence est que les clés stockées dans WeakMap sont faiblement référencées, c'est-à-dire sont automatiquement supprimés dès qu'ils deviennent inaccessibles. Les autres différences sont les suivantes:



  • Map peut utiliser n'importe quelle valeur comme clĂ©, tandis que WeakMap ne peut utiliser que des objets
  • WeakMap n'a pas de propriĂ©tĂ© de taille
  • WeakMap n'a pas de mĂ©thodes clear (), keys (), values ​​(), entries (), forEach ()
  • WeakMap n'est pas une entitĂ© itĂ©rable


JSR

MDN



186. Quelles méthodes sont disponibles dans WeakMap?



WeakMap a les méthodes suivantes:



  • set (): ajoute une paire clĂ© / valeur Ă  un objet
  • delete (): supprime une valeur par clĂ©
  • has (): dĂ©termine si une valeur est prĂ©sente par clĂ©
  • get (): renvoie la valeur par clĂ©


const wm = new WeakMap()
const firstUser = {}
const secondUser = {}

wm.set(firstUser, '')
wm.set(secondUser, '')
console.log(wm.has(firstUser)) // true
console.log(wm.get(firstUser)) // 
wm.delete(secondUser)
console.log(wm.has(secondUser)) // false


JSR

MDN



187. Comment encoder une URL?



Vous pouvez utiliser la méthode encodeURI () pour cela. Cette méthode convertit tous les caractères spéciaux sauf /?: @ = + $ #



const url = 'https://ru.wikipedia.org/wiki/,__'
const encoded = encodeURI(url)
console.log(encoded) // https://ru.wikipedia.org/wiki/%D0%9B%D0...


JSR

MDN



188. Comment décoder une URL?



La méthode decodeURI () peut être utilisée pour cela:



const url = 'https://ru.wikipedia.org/wiki/%D0%9B%D0...'
const decoded = decodeURI(url)
console.log(decoded) // https://ru.wikipedia.org/wiki/,__


JSR

MDN



189. Comment imprimer le contenu de la page?



Vous pouvez utiliser la méthode globale print () pour cela. Cette méthode ouvre une boîte de dialogue spéciale avec les paramètres d'impression:



<button></button>

document.querySelector('button')
    .addEventListener('click', () => print())


MDN



190. Qu'est-ce qu'une fonction anonyme?



Une fonction anonyme est une fonction sans nom. Ces fonctions sont souvent attribuées à des variables et également utilisées comme rappels:



const sayHi = function () {
    console.log('')
}
sayHi() // 
// 
const sayBye = () => console.log('')
sayBye() // 

window.addEventListener('click', function () {
    console.log('  ,   ')
})
// 
window.addEventListener('contextmenu', e => {
    e.preventDefault()
    console.log('  -   ')
})


JSR

MDN



191. Quelle est la priorité de l'utilisation des variables locales et globales?



Les variables locales ont priorité sur les globaux du même nom:



let question = ' '

function toBe () {
    question = ''
    console.log(question)
}
toBe() // 


JSR

MDN



192. Que sont les accesseurs?



Les accesseurs ou propriétés calculées sont des getters et des setters. Les getters sont utilisés pour obtenir les valeurs des propriétés d'un objet, et les setters sont utilisés pour les définir:



class User {
    constructor (name, age) {
        this.name = name
        this.age = age
    }

    #access = false

    get access () {
        return this.#access
    }

    set access (bool) {
        this.#access = bool
    }
}

const user = new User('', 30)
console.log(user.#access) // SyntaxError: Private field '#access' must be declared in an enclosing class

console.log(user.access) // false
user.access = true
console.log(user.access) // true


Les getters et les setters sont des propriétés, et les méthodes sont des fonctions:



class User {
    constructor (name, age) {
        this.name = name
        this.age = age
    }

    #access = false

    getAccess () {
        return this.#access
    }

    setAccess(bool) {
        this.#access = bool
    }
}

const user = new User('', 30)
console.log(user.#access) // SyntaxError: Private field '#access' must be declared in an enclosing class

console.log(user.getAccess()) // false
user.setAccess(true)
console.log(user.getAccess()) // true


JSR



193. Comment définir une propriété dans un constructeur d'objet?



La méthode Object.defineProperty () peut être utilisée pour cela. Cette méthode vous permet d'ajouter de nouvelles propriétés à l'objet et de modifier celles existantes, ainsi que de modifier les paramètres d'accès à l'objet:



'use strict'
const obj = {}

Object.defineProperty(obj, 'prop', {
    value: 1,
    writable: false
})

console.log(obj.prop) // 1
obj.prop = 2 // TypeError: Cannot assign to read only property 'prop' of object '#<Object>'


En mode laxiste, une tentative de modification d'une propriété en lecture seule échouera silencieusement.



JSR

MDN



194. Quelles sont les caractéristiques des getters et des setters?



Les principales caractéristiques des getters et des setters sont les suivantes:



  • Ils ont une syntaxe plus simple que les mĂ©thodes.
  • UtilisĂ© pour dĂ©finir les propriĂ©tĂ©s calculĂ©es - accesseurs
  • Permet la mĂŞme relation entre les propriĂ©tĂ©s et les mĂ©thodes
  • Peut fournir une meilleure qualitĂ© des donnĂ©es
  • Vous permet d'effectuer des tâches dans les coulisses en matière d'encapsulation


JSR



195. Des getters et des setters peuvent-ils être ajoutés à un objet à l'aide de la méthode Object.defineProperty ()?



Assez:



const obj = {counter: 0}

Object.defineProperty(obj, 'increment', {
    get() {return ++this.counter}
})
Object.defineProperty(obj, 'decrement', {
    get() {return --this.counter}
})

Object.defineProperty(obj, 'sum', {
    set(val) {return this.counter += val}
})
Object.defineProperty(obj, 'sub', {
    set(val) {return this.counter -= val}
})

obj.sum = 10
obj.sub = 5
console.log(obj) // {counter: 5}
console.log(obj.increment) // 6
console.log(obj.decrement) // 5


JSR

MDN



196. A quoi sert le boîtier interrupteur ...?



switch ... case est une alternative à if ... else et est une manière plus visuelle d'exécuter du code en fonction de la condition passée:



const calc = (x, y, operator) => {
    let result

    try {
        switch (operator) {
            case '+':
                result = x + y
                break
            case '-':
                result = x - y
                break
            case '*':
                result = x * y
                break
            case '/':
                result = x / y
                break
            default:
                throw new Error(' ')
        }

        if (isNaN(result)) {
            throw new Error('   ')
        }

        console.log(result)
        return result
    } catch (e) {
        console.error(e.message)
    }
}

calc(1, 2, '+') // 3
calc(3, 4, '*') // 12
calc('a', 1, '-') //    
calc(5, 6, 'x') //  


JSR

MDN



197. Nommez les règles d'utilisation de switch ... case



Lorsque vous utilisez la construction de boîtier interrupteur ..., vous devez respecter les règles suivantes:



  • la condition peut ĂŞtre un nombre ou une chaĂ®ne
  • les valeurs en double ne sont pas autorisĂ©es
  • l'instruction par dĂ©faut est facultative. Si aucun cas n'est trouvĂ©, le bloc par dĂ©faut est exĂ©cutĂ©
  • break est utilisĂ© pour arrĂŞter la boucle
  • break est Ă©galement facultatif, mais sans lui, l'exĂ©cution de la boucle continuera


JSR

MDN



198. Nommez les types de données primitifs.



Les types de données primitifs ("primitives") en JavaScript sont les valeurs suivantes:



  • nombre pour tout nombre: entier ou virgule flottante, les valeurs entières sont limitĂ©es Ă  ± 2 53
  • bigint pour les entiers de longueur arbitraire
  • string pour les chaĂ®nes. Une chaĂ®ne peut contenir un ou plusieurs caractères, il n'y a pas de type de caractère distinct
  • boolĂ©en pour vrai / faux
  • null pour les valeurs inconnues - un type distinct avec une seule valeur nulle
  • non dĂ©fini pour les valeurs non attribuĂ©es - un type distinct ayant une valeur non dĂ©finie
  • symbole pour les identifiants uniques




MDN





Habr — JavaScript?

Habr — JavaScript ?

JavaScript ?

Medium — Advanced JavaScript ES6 — Temporal Dead Zone, Default Parameters And Let vs Var — Deep dive!

JavaScript:

̆ JavaScript

Medium — JavaScript.

Habr — JavaScript

Medium — Understanding Prototypes in JavaScript

Medium — apply(), call() bind(), JavaScript

JavaScript:

Medium — JavaScript Classes: An In-Depth look (Part 1)

Medium — JavaScript slice(), splice() split()

JavaScript

JavaScript- .map(), .filter() .reduce()

reduce() JavaScript

̆ ̆ ECMAScript 2019, for-of

ES2020,

DigitalOcean — map set JavaScript

Medium — JavaScript

Medium — What is Memoization in Javascript?

Redd — Debounce vs Throttle: Definitive Visual Guide

JavaScript

Habr — 5 JSON.stringify()

Habr — () «» JavaScript

Habr — JavaScript- : . 1

Habr — -

GoogleDevelopers — Service Workers: an Introduction

Habr —

WebDevBlog — IndexedDB

GoogleDevelopers — Working with IndexedDB

Habr — Web Storage API:

Habr — -

Medium — A Simple Introduction to Web Workers in JavaScript

Habr — JavaScript,

Habr — Async/Await

Habr — CORS:



All Articles