200 questões teóricas de JavaScript





Bom dia amigos!



Aqui está uma lista das cem perguntas básicas sobre JavaScript deste repositório, com respostas curtas e links para o Tutorial de JavaScript moderno (JSR) e MDN de Ilya Kantor.



Esta lista e mais de 300 questões práticas estão disponíveis em meu aplicativo .



O aplicativo implementa um mecanismo de memorização da questão estudada, além de possibilitar o trabalho offline.



Peço desculpas por quaisquer possíveis erros e erros tipográficos. Qualquer forma de feedback é apreciada.



Edição de 14.09.



Veja as primeiras 100 perguntas aqui .



101. Para que stopPropagation () é usado?



Este método é usado para evitar que o evento borbulhe ou suba na cadeia dos ancestrais do elemento de destino. Em outras palavras, ele para de enviar o evento do elemento de destino para seus ancestrais. Vamos considerar um exemplo:



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

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

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


Ao clicar em um contêiner aninhado, a mensagem "Recipiente interno" é exibida no console. Se você remover event.stopPropagation (), ao clicar no contêiner aninhado, ambas as mensagens serão exibidas no console.



JSR

MDN



102. O que return false faz?



Esta instrução é usada em manipuladores de eventos para:



  • Cancelando o comportamento padrão do navegador
  • Impedindo a propagação de eventos através do DOM
  • Parando a execução do retorno de chamada e retornando o controle para a função de chamada


Observe que, sem especificar um valor de retorno, a instrução return retorna indefinido.



JSR

MDN



103. O que é BOM?



O BOM ou (Browser Object Model) permite que o JavaScript interaja com o navegador. Este modelo inclui objetos como navegador, localização, histórico, tela, XMLHttpRequest, etc. Em outras palavras, BOMs são objetos adicionais fornecidos pelo navegador para funcionar com tudo, exceto com o documento.

Observe que o BOM não é padronizado, portanto, sua implementação pode ser diferente em navegadores diferentes.







JSR



104. Para que é usado setTimeout ()?



Este método é usado para a execução adiada de uma tarefa. Em outras palavras, permite que você execute a execução de uma função ou a avaliação de uma expressão após um certo tempo (em milissegundos). No exemplo a seguir, imprimimos uma mensagem no console após 2 segundos:



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

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


JSR

MDN



105. Para que setInterval () é usado?



Este método é usado para executar uma tarefa periodicamente. Em outras palavras, permite que você execute a execução de uma função ou a avaliação de uma expressão após um determinado período de tempo (em milissegundos). No exemplo a seguir, imprimimos uma mensagem no console a cada 2 segundos:



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

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

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


No segundo exemplo, a mensagem "Hello!" imprimirá no console duas vezes, após o que o cronômetro será interrompido



JSR

MDN



106. Por que o JavaScript é chamado de single threated?



JavaScript é uma linguagem de programação de encadeamento único ou síncrona. Isso significa que apenas uma tarefa pode ser executada por vez. Se a tarefa for complexa, pode levar muito tempo para ser concluída e, durante esse tempo, o thread principal de execução do código será bloqueado. Bloquear um stream, por sua vez, significa que não há interatividade na página. O navegador para de responder às ações do usuário e outros eventos. Para resolver este problema, são usados ​​callbacks, promises, async / await, workers e outras ferramentas para trabalhar com código assíncrono. Em JavaScript, ao contrário, por exemplo, de Java, Go ou C ++, não há como criar threads ou processos adicionais.



JSR

MDN



107. O que é delegação de eventos?



Delegação de evento é uma técnica em que um evento é registrado em um pai para manipular eventos gerados por filhos.

Geralmente usado para lidar com cliques de botão em um contêiner de agrupamento ou para modificar campos de entrada de texto em formulários, por exemplo:



<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)
})


No exemplo acima, em vez de registrar manipuladores nos elementos filhos, nós os registramos nos elementos pais. Inserir texto em um campo ou pressionar um botão resulta na saída do nome da classe do elemento correspondente para o console.



JSR



108. O que é ECMAScript?



ECMAScript é a linguagem de programação por trás do JavaScript. Este é um tipo de padrão ou projeto pelo qual o JavaScript é "construído". ECMAScript é padronizado na especificação ECMA-262 pela organização de padrões Ecma International.



JSR

MDN



109. Nomeie os recursos da sintaxe JSON



A sintaxe JSON possui os seguintes recursos:



  • Os dados são pares chave / valor
  • A chave e o valor são colocados entre aspas duplas, a menos que o valor seja um número ("chave": "valor")
  • Os dados são separados por vírgulas
  • Os objetos são colocados entre chaves
  • Matrizes - para quadrado


JSR

MDN



110. O que JSON.stringify () faz?



Ao enviar dados para o servidor, ele deve ter um formato de string especial. O método JSON.stringify () é usado para converter um objeto em uma string JSON:



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


JSR

MDN



111. O que JSON.parse () faz?



Ao receber dados do servidor, eles têm um formato de string especial. O método JSON.parse () é usado para converter esses dados em um objeto JavaScript:



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


JSR

MDN



112. Para que serve o JSON?



Ao trocar dados entre o cliente e o servidor, esses dados podem ser apenas strings. Como JSON é texto, é perfeito para isso. Ele também pode ser usado como um formato de dados por qualquer linguagem de programação, junto com outros formatos como XML ou Protobuf.



JSR

MDN



113. O que é PWA (Progressive Web Application - Progressive Web Application)?



Resumindo, os PWAs são sites que se comportam como aplicativos nativos. Eles podem ser instalados em um telefone ou computador e, via de regra, funcionam offline. Para o último, são usados ​​service workers e uma interface de cache. A vantagem dos PWAs sobre os aplicativos móveis é seu tamanho e relativa facilidade de desenvolvimento. Além disso, você não precisa gastar recursos na criação de dois aplicativos para um site - web e móvel. Ele também mantém uma boa experiência do usuário.



MDN



114. Para que é usado clearTimeout ()?



Este método é usado para parar um cronômetro iniciado por setTimeout (). Para fazer isso, o identificador do temporizador é gravado em uma variável, que é então passada para clearTimeout () como um argumento.



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


No exemplo acima, dois segundos depois, a mensagem “Hello!” É exibida no console, após o qual o cronômetro para. Isso é feito para que o coletor de lixo possa remover o cronômetro que foi executado.



JSR

MDN



115. Qual é a finalidade de clearInterval ()?



Este método é usado para parar um cronômetro iniciado com setInterval (). Para fazer isso, o identificador do temporizador é gravado em uma variável, que é então passada para clearInterval () como um argumento.



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

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


No exemplo acima, o valor da variável i é impresso no console a cada segundo, que é incrementado em 1 (1, 2) a cada vez. Quando i se torna 3, o cronômetro para.



JSR

MDN



116. Como faço para redirecionar?



Para fazer isso, você pode usar a propriedade location do objeto window:



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


MDN



117. Como verificar se uma substring existe em uma string?



Existem pelo menos três maneiras de fazer isso.

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 - inclui

MDN - indexOf

MDN - teste



118. Como verificar a correção do endereço de e-mail?



Isso pode ser feito usando HTML, definindo o tipo do campo de entrada para o valor email (<input type = "email">). No entanto, este método não é considerado muito confiável. Portanto, geralmente, o email é validado usando uma expressão regular. Recomenda-se fazer isso no lado do servidor, pois o JavaScript pode estar desativado no cliente:



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


Este exemplo usa uma das expressões regulares mais simples para validar um endereço de e-mail. Uma expressão mais confiável se parece com esta (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. Como obtenho o URL atual?



Para fazer isso, você pode usar a propriedade location do objeto window ou a propriedade URL do objeto document:



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


MDN - localização

MDN - document.URL



120. Quais propriedades o objeto de localização tem?



As propriedades do objeto de localização podem ser usadas para obter partes do URL da página atual:



  • href - URL completo
  • origem - protocolo, host e porta (origem, usado na Política de Origem Comum (SOP) e Compartilhamento de Recursos (CORS))
  • protocolo
  • host - host e porta
  • hostname - host
  • porta
  • pathname - path
  • search - a string de consulta depois?
  • hash - string de consulta após # (âncora)
  • nome de usuário - nome de usuário antes do domínio
  • senha - senha antes do domínio


MDN



121. Como obter a string de consulta?



Você pode usar o construtor de URL para isso:



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. Como verificar se uma propriedade existe em um objeto?



Existem pelo menos três maneiras de fazer isso.

Em operadora



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


Método HasOwnProperty ()



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


Comparação com indefinido



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


JSR

MDN - para ... em

MDN - hasOwnProperty



123. Como iterar sobre as propriedades enumeradas de um objeto?



Para fazer isso, você pode usar um loop for ... in com o método hasOwnProperty () para excluir propriedades herdadas.



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

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


JSR

MDN



124. Como verificar se o objeto está vazio?



Existem pelo menos três maneiras de fazer isso.

Método Object.entries ()



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


Método Object.keys ()



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 loop e método 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 - Objetos JSR

- Object.keys, valores, entradas

MDN - Object.entries

MDN - Object.keys

MDN - para ... em

MDN - Object.hasOwnProperty



125. Qual é o objeto de argumentos?



argumentos é um objeto semelhante a uma matriz (pseudomatriz) contendo os argumentos passados ​​para a função:



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


Observe que as funções de seta não têm argumentos. Em vez de argumentos, é recomendável usar o operador rest ... (outros parâmetros), que funciona tanto nas funções comuns quanto nas de seta:



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

sum(1, 2, 3) // 6


JSR

MDN



126. Como colocar a primeira letra de uma string em maiúscula?



Isso pode ser feito usando os métodos charAt (), toUpperCase () e slice ():



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

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


JSR

MDN -

charAt MDN - toUpperCase

MDN - fatia



127. Como obter a data atual?



Isso pode ser feito usando um objeto Date ou o construtor 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 - Data

JSR = Intl

MDN - Data

MDN - Intl.DateTimeFormat



128. Como comparar dois objetos Date?



Para fazer isso, você não deve comparar os próprios objetos, mas, por exemplo, os valores retornados pelo método 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. Como verificar se uma linha começa em uma linha diferente?



Você pode usar o método startedWith () integrado para fazer isso:



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


De acordo com CanIUse, este método é compatível com quase 94% dos navegadores



JSR

MDN



130. Como remover problemas em uma linha?



Para fazer isso, você pode usar os métodos integrados trimStart () (início da linha), trimEnd () (fim da linha) e trim () (início e fim da linha):



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


trim não funciona para espaços entre palavras. Nesse caso, você pode usar o método replace () e a expressão regular:



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


De acordo com CanIUse , trimStart () e trimEnd () são suportados por 93% dos navegadores.



MDN



131. Como adicionar uma nova propriedade a um objeto?



Existem duas maneiras de fazer isso. Vamos supor que temos um objeto como este:



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


Podemos adicionar uma nova propriedade a ele usando a notação de ponto ou colchete:



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


Uma das diferenças entre esses métodos é que, ao usar a notação entre parênteses, a chave adicionada pode ser um número:



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


JSR

MDN



132. A expressão! - é um operador especial?



Não, não é. É uma combinação de dois operadores: operador! (não lógico) e operador - (decremento). Se você usar a expressão especificada com qualquer valor, primeiro esse valor será diminuído em um, depois convertido para um tipo booleano e invertido:



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 - Lógico NÃO

MDN - Decremento



133. Como atribuir um valor padrão a uma variável?



Para fazer isso, você pode usar o || (booleano ou):



const a = b || 'default'


Nesse caso, a variável a terá o valor padrão atribuído se o valor da variável b for falso (falso, indefinido, nulo, NaN, 0, '').

Se estamos falando sobre os valores padrão dos parâmetros da função, eles podem ser atribuídos da seguinte forma:



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


Além disso, os parâmetros subsequentes podem usar os valores dos anteriores como valores padrão:



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


JSR

MDN



134. Como criar uma string multilinha?



Anteriormente, era feito algo assim (caracteres de controle de concatenação e quebra de linha):



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

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


Agora eles fazem assim (literal de modelo):



const str =
    \` 
     
    !\`


JSR

MDN



135. Podemos adicionar propriedades às funções?



Como as funções também são objetos, podemos facilmente adicionar propriedades a elas. O valor da propriedade da função pode ser outra função:



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. Como descobrir quantos argumentos uma função espera receber?



A propriedade length pode ser usada para:



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. O que é um polyfill?



Polyfills são usados ​​para fazer o JavaScript moderno funcionar em navegadores mais antigos. Isso é feito implementando novos recursos da linguagem usando a sintaxe antiga. O próprio processo de conversão de novo código em código antigo é chamado de transpilação. O transpiler mais popular para código JavaScript é o Babel.

Por exemplo, um dos recursos mais recentes de JavaScript é o método Promise.allSettled (), que, ao contrário de Promise.all (), não termina quando qualquer uma das promessas passadas a ele é rejeitada.

No entanto, a partir de hoje, o suporte do navegador de acordo com os dados do CanIUse é de 80%, então um polyfill é necessário:



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. Para que são usadas as instruções continue e break?



A instrução break é usada para sair do loop. Depois de parar a iteração, o código continua:



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


A instrução continue é usada para pular a iteração:



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 - interromper

MDN - continuar



139. O que é um rótulo?



Os rótulos permitem nomear loops e blocos de código. Eles podem ser usados, por exemplo, para sair de um loop ou como uma condição para a execução de código:



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
*/


O uso de tags é considerado uma prática inadequada.



MDN



140. Quais são as vantagens de declarar variáveis ​​no início do código?



Recomenda-se declarar variáveis ​​no início de cada script ou função. Isso oferece os seguintes benefícios:



  • Mantém o código limpo
  • Todas as variáveis ​​estão em um só lugar
  • Evita a criação acidental de variáveis ​​globais
  • Previne sobreposições de variáveis ​​indesejadas


JSR

MDN



141. Quais são as vantagens de inicializar uma variável quando declarada?



Recomenda-se inicializar todas as variáveis ​​no momento da declaração. Isso oferece os seguintes benefícios:



  • Mantém o código limpo
  • Variáveis ​​e seus valores estão em um só lugar
  • Impede que variáveis ​​não inicializadas sejam atribuídas indefinidas


JSR

MDN



142. Quais são as principais recomendações para a criação de um objeto



Para criar um objeto, em vez do construtor de objeto new Object (), é recomendável usar a notação de parênteses {}. Além disso, dependendo do tipo de valor, é recomendável usar o seguinte:



  • string como '' em vez de new String ()
  • um número, por exemplo 0 em vez de um novo número ()
  • valor booleano como falso em vez de novo Boolean ()
  • [] em vez de novo Array ()
  • // em vez de novo RegExp ()
  • function () {} em vez de new Function ()


JSR

MDN



143. Como definir um array no formato JSON?



A matriz JSON é uma matriz de objetos JSON, por exemplo:



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


JSR

MDN



144. Como implementar uma função que retorna um inteiro aleatório em um determinado intervalo?



Essa função pode ser implementada usando os métodos Math.random () e Math.floor () do objeto Math:



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


JSR

MDN - Math.random ()

MDN - Math.floor ()



145. O que é árvore tremendo?



A agitação da árvore é a remoção do código de módulos não utilizados. Esses módulos não são incluídos na montagem final (pacote). Para que o construtor de módulo (bundler) seja capaz de determinar quais módulos são usados ​​e quais não são, a estrutura do programa deve ser baseada em módulos ES6. Essa técnica foi popularizada pelo empacotador Rollup.



MDN



146. Para que é usado o sacudir de árvores?



A agitação da árvore pode reduzir significativamente o tamanho de uma montagem (pacote), removendo o código de módulos não utilizados dela. Quanto menor o tamanho da montagem, melhor será o desempenho do aplicativo. A agitação da árvore é implementada em construtores de módulo, como Rollup e Webpack.



MDN



147. O que é uma expressão regular?



Uma expressão regular é uma sequência de caracteres que formam um padrão de pesquisa. Esse padrão pode ser usado para localizar dados em texto, como substrings em uma string. As expressões regulares são amplamente utilizadas por muitas linguagens de programação para pesquisa de texto e operações de substituição. O padrão regex geral é assim:



//


Exemplo:



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


Você também pode usar o construtor RegExp para criar uma expressão regular:



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


JSR

MDN



148. Quais métodos são usados ​​em expressões regulares?



Existem dois métodos principais usados ​​em expressões regulares: exec () e test ().

O método exec () procura uma correspondência de expressão regular na string passada a ele como um argumento. O comportamento desse método depende se a expressão regular tem o sinalizador g. Caso contrário, a primeira correspondência é retornada. Se o sinalizador g estiver presente, então:



  • A chamada exec () retorna a primeira correspondência e armazena a posição depois dela na propriedade lastIndex.
  • A próxima chamada inicia a pesquisa na posição lastIndex, retorna a próxima correspondência e lembra a posição depois dela em lastIndex.
  • Se não houver mais correspondências, exec () retorna nulo e lastIndex é definido como 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
*/


O método test () retorna um valor booleano dependendo se uma correspondência for encontrada na string:



const str = '  JavaScript'

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


JSR

MDN



149. Quais sinalizadores são usados ​​em expressões regulares?



Bandeira Descrição
g comparação global
Eu ignorar maiúsculas e minúsculas ao combinar
m correspondência em várias linhas


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


JSR

MDN



150. Quais caracteres especiais são usados ​​em expressões regulares?



Os caracteres especiais usados ​​em expressões regulares podem ser divididos em vários grupos.

Classes básicas de personagens:

Símbolo Valor
\. qualquer personagem com algumas exceções
\ d numeral
\ D não um número
\ W Caráter latino e sublinhado
\ W caractere não latino e sublinhado
\ s caractere de espaço em branco
\ S nenhum caractere de espaço em branco
\ escapando como \. É o ponto


Conjuntos de caracteres:

Símbolo Valor
[a-yayo-yo] qualquer letra do alfabeto russo
[^ a-yyoA-yyo] qualquer caractere, exceto as letras do alfabeto russo


Fronteiras:

Símbolo Valor
^ começo da linha
$ fim da linha
\ b limite de palavra de largura zero
\ B limite de palavra de largura diferente de zero


Agrupamento:

Símbolo Valor
(x) corresponde a x, a combinação é lembrada
(?: x) corresponde a x, a combinação não é lembrada


Quantificadores:

Símbolo Valor
* zero ou mais caracteres
+ um ou mais personagens
*? e +? semelhante a * e +, mas procurando a correspondência mínima
? zero ou um caractere
x (? = y) corresponde a x se x for seguido por y
x (?! y) corresponde a x se x não for seguido por y
(? <= y) x corresponde a x se x precede y
(?! y) x corresponde a x se x não preceder y
x | y x ou y
x {n} n é o número exato de x
x {n,} n - número mínimo de x
x {n, m} n - número mínimo x, m - máximo (de, a)


JSR

MDN



151. Como mudo os estilos de um elemento HTML?



Isso pode ser feito usando a propriedade style ou atribuindo uma classe apropriada ao elemento:



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 - estilo

MDN - className

MDN - classList



152. O que é um depurador?



A expressão do depurador fornece acesso a qualquer funcionalidade de depuração disponível em um ambiente específico, por exemplo, definir pontos de interrupção (pontos de interrupção, pontos de interrupção). Se a funcionalidade de depuração não estiver disponível no tempo de execução, esta expressão não terá efeito:



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


JSR

MDN



153. Para que são usados ​​os pontos de interrupção do depurador?



Os pontos de verificação são usados ​​para pausar a execução de uma função ou outro código em um local específico para descobrir porque um programa não está funcionando corretamente. Uma vez interrompida, a função pode ser continuada.



JSR

MDN



154. As palavras reservadas podem ser usadas como identificadores?



Não, você não pode usar palavras reservadas como nomes para variáveis, rótulos, funções ou objetos:



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


155. Como determinar a largura e altura da imagem?



Isso pode ser feito de várias maneiras. Aqui está um deles:



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. Como enviar uma solicitação HTTP síncrona?



Para fazer isso, você pode usar o objeto XMLHttpRequest passando-o para o método open () com um terceiro argumento opcional com o valor 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. Como fazer uma solicitação HTTP assíncrona?



O método fetch () pode ser usado para isso:



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. Como obter a data no formato exigido?



O método toLocaleString () pode ser usado para isso:



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


MDN



159. Como obter os tamanhos máximos de página?



Para fazer isso, você precisa encontrar os valores máximos das propriedades scrollWidth, offsetWidth, clientWidth e scrollHeight, offsetHeight, clientHeight dos objetos document.body e 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. O que é um operador condicional ou ternário?



O operador ternário é uma forma abreviada de escrever o bloco 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. Uma cadeia de operadores ternários pode ser usada?



Sim, neste caso, o operador ternário é uma alternativa ao bloco 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. Como iniciar a execução do código depois que a página estiver totalmente carregada?



Isto pode ser feito de várias maneiras.

Coloque a tag de script antes da tag de fechamento do corpo ou adicione um atributo defer a ela:



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

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


Se o seu script for um módulo, em vez do atributo defer, você precisa especificar o atributo type com o módulo value:



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


Adicione um atributo onload à tag body:



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


Adicione o código como um manipulador para o evento load do objeto window:



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

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


Faça o mesmo para document.body:



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


163. Qual é a diferença entre __proto__ e protótipo?



A propriedade __proto__ ([[Prototype]] propriedade oculta interna) é um objeto do qual uma instância herda campos e métodos. E prototype é um objeto que é usado para criar __proto__ quando instanciado usando a nova palavra-chave:



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. Dê um exemplo do uso obrigatório de um ponto e vírgula



Um dos usos obrigatórios de ponto-e-vírgulas é o uso de IIFE (Immediately Invoked Fuction Expression):

Por exemplo, o código a seguir:



try {
    const x = ''

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


Será interpretado assim:



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


Portanto, no bloco try, obtemos um TypeError: "To be" não é uma função, o controle é passado para o bloco catch e "Not to be" é enviado para o console.

Para que o código funcione conforme o esperado, ele deve ter a seguinte aparência:



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


Além disso, não se esqueça dos casos de posicionamento automático de ponto e vírgula.



165. Para que é usado o método freeze ()?



Este método, como o próprio nome indica, serve para "congelar" um objeto. Um objeto congelado é imutável (imutável). Isso significa que você não pode adicionar novas propriedades a esse objeto, excluir ou modificar as existentes. Além disso, este método define configurável: falso e gravável: falso para propriedades existentes. O método retorna um objeto congelado.



'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>


Observe que no modo não estrito, nenhuma exceção é lançada, o código simplesmente não é executado.



JSR

MDN



166. Por que precisamos do método freeze ()?



O paradigma da programação orientada a objetos diz que uma interface contendo um certo número de elementos deve ser imutável, ou seja, deve ser impossível estender, modificar ou usar elementos fora do contexto atual. Este método é um apelido para a palavra-chave final em algumas outras linguagens de programação.



JSR

MDN



167. Como capitalizar a primeira letra de cada palavra em uma linha?



Uma maneira de fazer isso é a seguinte:



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

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


168. Como posso saber se o JavaScript está desabilitado em uma página?



Você pode usar a tag noscript para isso. O código dentro desta tag só será executado se o JavaScript estiver desabilitado na página:



    console.log('JavaScript ')

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


Para desativar o JavaScript no Chrome, vá para configurações -> seção "Privacidade e segurança" -> Configurações do site -> seção "Conteúdo" -> JavaScript.



MDN



169. Quais operadores são suportados por JavaScript?



Os operadores são usados ​​para trabalhar com valores ou operandos. JavaScript suporta os seguintes operadores:



  • Aritmética: + (adição, conversão para um número, concatenação), - (subtração), * (multiplicação), / (divisão),% (módulo, com resto), ++ (incremento), - (decremento), * * (exponenciação)
  • operadores de comparação: == (abstrato, igualdade flexível) ,! = (desigualdade abstrata), === (igualdade estrita, verificação de identidade) ,! == (desigualdade estrita),>,> =, <, <=
  • lógico: && (e), || (ou),! (não) (!!! (negação dupla) não é um operador separado)
  • operadores de atribuição: =, + =, - =, * =, / =,% =
  • ternário :? ...: (se ... senão)
  • operador typeof: define o tipo de operando
  • bit a bit: & (e), | (ou), ^ (exclusivo ou), ~ (não), << (deslocamento para a esquerda), >> (deslocamento para a direita), >>> (deslocamento para a direita com preenchimento zero)
  • novo :? .. ​​(cadeia opcional), ?? (mesclagem nula)


//  
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 - Operadores JSR - Operadores

lógicos

JSR - Operadores de comparação JSR - Operadores

JSR condicionais

-

Operadores MDN bit a bit - Operador de sequência opcional

MDN - Operador de mesclagem nula



170. Para que serve o operador resto ... (outros parâmetros)?



O operador rest é uma alternativa ao objeto de argumentos e retorna uma matriz dos argumentos passados ​​para a função:



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

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


Observe que o operador rest deve ser passado como o último argumento:



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


JSR

MDN



171. Para que é usado o operador de spread?



O operador spread é usado para expandir (desempacotar, expandir) entidades iteráveis ​​(arrays, strings). Descompactar significa converter, por exemplo, uma matriz de números em um conjunto de valores simples:



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

const nums = [1, 2, 3]

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


JSR

MDN



172. Como determinar se um objeto está congelado?



Para determinar se um objeto está congelado, ou seja, é imutável (imutável), o método isFrozen () é usado:



const obj = {
    prop: '    JavaScript!'
}

Object.freeze(obj)

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


MDN



173. Como determinar a igualdade de valores usando um objeto?



O método is () pode ser usado para isso:



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


Os valores são iguais se:



  • ambos são indefinidos
  • ambos são nulos
  • ambos são verdadeiros ou falsos
  • ambos são strings do mesmo comprimento com os mesmos caracteres
  • ambos se referem ao mesmo objeto
  • ambos são números, +0, -0 ou NaN


JSR

MDN



174. Como criar uma cópia de um objeto?



Uma das maneiras mais confiáveis ​​de fazer isso é usando o método assign ():



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

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

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


Além disso, este método permite combinar objetos, excluindo duplicatas:



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}


Você pode usar a vinculação JSON.parse-JSON.stringify para copiar objetos simples:



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

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

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


JSR

MDN



175. O que é um proxy?



O objeto Proxy "envolve" outro objeto e pode interceptar (e, se desejado, processar de forma independente) várias ações com ele, por exemplo, propriedades de leitura / gravação e outras.



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. Para que é usado o método seal ()?



Este método "sela" o objeto, evitando adicionar / remover propriedades. Ele também define configurável: falso para todas as propriedades existentes. No entanto, os valores das propriedades de tal objeto podem ser alterados. O método isSealed () é usado para verificar se um objeto está lacrado.



'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) //  ,   


Observe que, no modo frouxo, uma tentativa de excluir uma propriedade em um objeto selado falhará silenciosamente.



JSR

MDN



177. Qual é a diferença entre os métodos freeze () e seal ()?



O método Object.seal (), ao contrário do método Object.freeze (), permite que você modifique as propriedades existentes de um objeto.



'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. Como obter pares de chave / valor enumerados de um objeto?



O método Object.entries () retorna uma matriz de pares de chave / valor de objeto enumerados como submatrizes na mesma ordem que o loop 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. Qual é a principal diferença entre os métodos Object.keys (), Object.values ​​() e Object.entries ()?



O método Object.keys () retorna as chaves de um objeto, o método Object.values ​​() retorna os valores de suas propriedades e Object.entries () retorna uma matriz de pares chave / valor:



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. Como criar um objeto com um protótipo específico sem usar uma função construtora e classes?



O método Object.create () pode ser usado para isso:



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

const secondUser = Object.create(firstUser)

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


JSR

MDN



181. Para que é usado o WeakSet?



WeakSet é usado para armazenar uma coleção de objetos fracos referenciados. Em outras palavras, ele serve como armazenamento adicional para objetos usados ​​por outro código. Esses objetos são removidos automaticamente pelo coletor de lixo quando se tornam inacessíveis (não utilizados), ou seja, quando apenas a chave permanece no 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. Qual é a diferença entre Set e WeakSet?



Sua principal diferença é que os objetos armazenados no WeakSet são fracamente referenciados, ou seja, são excluídos automaticamente assim que se tornam inacessíveis. Outras diferenças são as seguintes:



  • Set pode armazenar qualquer valor, e WeakSet só pode armazenar objetos.
  • WeakSet não tem propriedade de tamanho
  • WeakSet não tem métodos clear (), keys (), values ​​(), forEach ()
  • WeakSet não é uma entidade iterável


JSR

MDN



183. Quais métodos estão disponíveis no WeakSet?



WeakSet tem os seguintes métodos:



  • add (): adiciona um objeto à coleção
  • delete (): remove um objeto de uma coleção
  • has (): determina se um objeto está na coleção
  • length (): retorna o comprimento da coleção


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. Para que é usado o WeakMap?



WeakMap é usado para armazenar pares de chave / valor onde as chaves são fracamente referenciadas. Em outras palavras, ele serve como um repositório adicional para chaves usadas por outro código. Essas chaves são removidas automaticamente pelo coletor de lixo quando se tornam inacessíveis (não utilizadas), ou seja, quando apenas a chave permanece no 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. Qual é a diferença entre Map e WeakMap?



Sua principal diferença é que as chaves armazenadas no WeakMap são fracamente referenciadas, ou seja, são excluídos automaticamente assim que se tornam inacessíveis. Outras diferenças são as seguintes:



  • O mapa pode usar quaisquer valores como chaves, enquanto o WeakMap pode usar apenas objetos
  • WeakMap não tem propriedade de tamanho
  • WeakMap não tem métodos clear (), keys (), values ​​(), entries (), forEach ()
  • WeakMap não é uma entidade iterável


JSR

MDN



186. Quais métodos estão disponíveis no WeakMap?



WeakMap tem os seguintes métodos:



  • set (): adiciona um par chave / valor a um objeto
  • delete (): exclui um valor por chave
  • has (): determina se um valor está presente por chave
  • get (): retorna o valor por chave


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. Como codificar um URL?



Você pode usar o método encodeURI () para isso. Este método converte todos os caracteres especiais, exceto /?: @ = + $ #



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. Como decodificar um URL?



O método decodeURI () pode ser usado para isso:



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. Como imprimir o conteúdo da página?



Você pode usar o método global print () para isso. Este método abre uma caixa de diálogo especial com configurações de impressão:



<button></button>

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


MDN



190. O que é uma função anônima?



Uma função anônima é uma função sem nome. Essas funções são frequentemente atribuídas a variáveis ​​e também usadas como retornos de chamada:



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. Qual é a prioridade de usar variáveis ​​locais e globais?



Variáveis ​​locais têm precedência sobre globais com o mesmo nome:



let question = ' '

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


JSR

MDN



192. O que são acessores?



Acessores ou propriedades computadas são getters e setters. Getters são usados ​​para obter os valores das propriedades de um objeto, e setters são usados ​​para defini-los:



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


Getters e setters são propriedades e métodos são funções:



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. Como definir uma propriedade em um construtor de objetos?



O método Object.defineProperty () pode ser usado para isso. Este método permite adicionar novas propriedades ao objeto e modificar as existentes, bem como alterar as configurações de acesso ao objeto:



'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>'


No modo relaxado, uma tentativa de alterar uma propriedade somente leitura falhará silenciosamente.



JSR

MDN



194. Quais são os recursos de getters e setters?



Os principais recursos de getters e setters são os seguintes:



  • Eles têm uma sintaxe mais simples em comparação aos métodos.
  • Usado para definir propriedades computadas - acessores
  • Permite a mesma relação entre propriedades e métodos
  • Pode fornecer melhor qualidade de dados
  • Permite que você execute tarefas nos bastidores quando se trata de encapsulamento


JSR



195. Os getters e setters podem ser adicionados a um objeto usando o método Object.defineProperty ()?



Bastante:



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. Para que é usado switch ... case?



switch ... case é uma alternativa para if ... else e é uma maneira mais visual de executar o código, dependendo da condição passada:



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. Cite as regras para usar switch ... case



Ao usar a construção de switch ... case, você deve seguir as seguintes regras:



  • a condição pode ser um número ou uma string
  • valores duplicados não são permitidos
  • a instrução padrão é opcional. Se nenhum caso for encontrado, o bloco padrão é executado
  • break é usado para parar o loop
  • break também é opcional, mas sem ele, a execução do loop continuará


JSR

MDN



198. Nomeie os tipos de dados primitivos.



Os tipos de dados primitivos ("primitivos") em JavaScript são os seguintes valores:



  • number : , ±253
  • bigint
  • string . ,
  • boolean true/false
  • null – , null
  • undefined – , undefined
  • symbol




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