Coleta de perguntas da entrevista

  1. Navegadores convencionais e seus kernels no mercado.
    Os navegadores são divididos em shell (estilo shell) e kernel.
    Insira a descrição da imagem aqui
    Aqui está uma citação de um artigo de um cara grande: Cinco navegadores principais e quatro kernels.

  2. Em js, quando a expressão após a instrução switch é comparada com a expressão após a instrução case, o operador de igualdade estrita (= = =) é usado em vez do operador de igualdade (==) , o que significa que ao comparar Nenhuma conversão de tipo ocorre .

  3. Em js, variáveis ​​globais criadas usando var (essencialmente propriedades de janela) não podem ser excluídas usando delete, mas variáveis ​​globais criadas sem var (essencialmente propriedades de janela) podem ser excluídas usando delete. Como o atributo configurável nas propriedades integradas das variáveis ​​criadas usando var é padronizado como false, eles não podem ser excluídos.

  4. Em js, os valores booleanos correspondentes a matrizes vazias ([]) e objetos vazios ({}) são verdadeiros.

  5. Não há números inteiros na parte inferior da linguagem JavaScript. Todos os números são armazenados na forma de números de ponto flutuante de 64 bits, até mesmo números inteiros.

1 === 1.0 // true
0.1 + 0.2 === 0.3 // false
0.3 / 0.1 // 2.9999999999999996
(0.3 - 0.2) === (0.2 - 0.1) // false
  1. Em js, observe que para o comando var, as variáveis ​​locais só podem ser declaradas dentro da função. Se declaradas em outros blocos, são todas variáveis ​​globais.
  2. Em js, a função em si também é um valor e possui seu próprio escopo. Seu escopo é igual ao de uma variável, que é o escopo em que ela é declarada, independente do escopo em que é executada.
var a = 1;
var x = function () {
    
    
  console.log(a);
};

function f() {
    
    
  var a = 2;
  x();
}

f() // 1
  1. Closures
    Existem dois grandes usos para os encerramentos: um é para ler as variáveis ​​dentro da função externa e o outro é manter essas variáveis ​​na memória, ou seja, o encerramento pode fazer com que o ambiente em que nasceu sempre exista.
    Observe** que toda vez que a função externa for executada, um novo fechamento será gerado, e esse fechamento reterá as variáveis ​​internas da função externa, portanto o consumo de memória é muito grande. **Portanto, os fechamentos não podem ser abusados, caso contrário causarão problemas de desempenho na página web.
  2. Em js, é importante notar que, como um array é essencialmente um objeto, você pode adicionar atributos ao array, mas isso não afeta o valor do atributo length.
var a = [];

a['p'] = 'abc';
a.length // 0
a['p'] //abc

a[2.1] = '123';
a.length // 0
a[2.1] // 123
  1. Existe uma aplicação especial de "operação OR exclusiva", execute três operações OR exclusivas consecutivas em dois números a e b, a^=b; b^=a; a^=b;, e seus valores podem ser trocados . Isso significa que o uso da "operação XOR" pode trocar os valores de duas variáveis ​​sem introduzir variáveis ​​temporárias.
var a = 10;
var b = 99;

a ^= b, b ^= a, a ^= b;

a // 99
b // 10
  1. Em js, observe que uma vez definida a função de valor get (ou conjunto de funções de valor), o atributo gravável não pode ser definido como verdadeiro ou o atributo de valor pode ser definido ao mesmo tempo, caso contrário, um erro será relatado.
var obj = {
    
    };

Object.defineProperty(obj, 'p', {
    
    
  value: 123,
  get: function() {
    
     return 456; }
});
// TypeError: Invalid property.
// A property cannot both have accessors and be writable or have a value

Object.defineProperty(obj, 'p', {
    
    
  writable: true,
  get: function() {
    
     return 456; }
});
// TypeError: Invalid property descriptor.
// Cannot both specify accessors and a value or writable attribute

No código acima, se o atributo get e o atributo value forem definidos ao mesmo tempo, e o atributo gravável for definido como verdadeiro, um erro será relatado.

  1. Número(), String(), Boolean()
var v1 = new Number(123);
var v2 = new String('abc');
var v3 = new Boolean(true);

typeof v1 // "object"
typeof v2 // "object"
typeof v3 // "object"

v1 === 123 // false
v2 === 'abc' // false
v3 === true // false
// 字符串转为数值
Number('123') // 123

// 数值转为字符串
String(123) // "123"

// 数值转为布尔值
Boolean(123) // true

Para resumir, quando esses três objetos são usados ​​como construtores (com new), os valores do tipo primitivo podem ser convertidos em objetos; quando usados ​​como funções comuns (sem new), qualquer tipo de valor pode ser convertido em tipo primitivo de valor.

  1. O método hasOwnProperty de uma instância de objeto retorna um valor booleano, que é usado para determinar se uma propriedade está definida no próprio objeto ou na cadeia de protótipo.
Date.hasOwnProperty('length') // true
Date.hasOwnProperty('toString') // false

O código acima mostra que Date.length (quantos parâmetros o construtor Date pode aceitar) é uma propriedade do próprio Date e Date.toString é uma propriedade herdada.

Além disso, o método hasOwnProperty é o único método em JavaScript que não atravessa a cadeia de protótipos ao processar as propriedades do objeto.

  1. A função de retorno de chamada do Promise não é uma tarefa assíncrona normal, mas uma microtarefa. A diferença entre eles é que as tarefas normais são anexadas à próxima rodada do loop de eventos** e as microtarefas são anexadas a esta rodada do loop de eventos. Isso significa que as microtarefas devem ser executadas antes das tarefas assíncronas normais. **
setTimeout(function() {
    
    
  console.log(1);
}, 0);

new Promise(function (resolve, reject) {
    
    
  resolve(2);
}).then(console.log);

console.log(3);
// 3
// 2
// 1

A saída do código acima é 321. Isso mostra que o tempo de execução da função de retorno de chamada é anterior a setTimeout(fn, 0). Como then é executado nesta rodada do loop de eventos, setTimeout(fn, 0) é executado no início da próxima rodada do loop de eventos.

Acho que você gosta

Origin blog.csdn.net/weixin_46683645/article/details/121517100
Recomendado
Clasificación