Part1 Código manuscrito
Hoje em dia, o código manuscrito no local é um tipo muito comum de perguntas de entrevista em entrevistas, examinando estruturas de dados básicas e recursos de algoritmo.
1. Implementação da desduplicação da matriz
Desduplicação básica da matriz
Array.prototype.unique = function () {var result = []; this.foreach (function (v) {if (resultado.indexOf (v) <0) {resultado.push (v);}}); resultado de retorno;}• Use a tabela de hash para deduzir, esta é uma maneira de trocar espaço pelo tempo
Array.prototype.unique = function () {var resultado = [], hash = {}; this.foreach (function (v) {if (! hash [v]) {hash [v] = true; resultado.push (v);}}); resultado de retorno;}Há um bug no método acima. Para matrizes [1,2, '1', '2', 3], o resultado da desduplicação é [1,2,3]. O motivo é que o objeto lançará o índice de atributo quando o objeto indexar. Arr ['1'] e arr [1] ambos obtêm os valores de arr [1], então algumas mudanças precisam ser feitas:
Array.prototype.unique = function () {var resultado = [], hash = {}; this.ForEach (function (v) {var type = typeof (v); // obtenha o tipo de elemento hash [v] || (hash [v] = new Array ()); if (hash [v] .IndexOf (type) <0) {hash [v] .push (tipo); // tipo de armazenamento resultado.push (v); resultado de retorno;}• Classifique primeiro e depois remova a repetição
Array.prototype.unique = function () {var result = [this [0]]; this.sort (); this.ForEach (function (v) {v!2 Implementação rápida de classificação
Método 1 (não use o método JS Array o máximo possível):
função Quicksort (arr) {qsort (arr, 0, arr.length - 1);} função qsort (arr, baixa, alta) {if (baixa <alta) {var partkey = partition (arr, baixa, alta); QSORT (ARR, Low, Partkey - 1); QSORT (ARR, Partkey + 1, alto); }} Partição da função (arr, baixa, alta) {var key = arr [baixo]; // Use o primeiro elemento como base de classificação enquanto (baixo <alto) {while (BOW <High && arr [High]> = arr [key]) High--; arr [baixo] = arr [alto]; while (baixo <alto && arr [baixo] <= arr [key]) baixo ++; arr [alto] = arr [baixo]; } arr [baixo] = key; retornar baixo;}Método 2 (usando o método JS Array):
função QuickSort (arr) {if (arr.length <= 1) retornar arr; var index = math.floor (arr.length/2); var key = arr.splice (índice, 1) [0]; var esquerdo = [], direita = []; Arr.ForEach (function (v) {v <= key? Left.push (v): Right.push (v);}); Retorne Quicksort (esquerda) .CONCAT ([KEY], Quicksort (à direita));}Além disso, deve -se notar que a complexidade média do tempo de classificação rápida O (nLogn), o pior caso é um caso ordenado, a complexidade do tempo é quadrada n e a classificação rápida é instável.
Part2 JavaScript relacionado
1 Tipos de dados básicos de JavaScript
Os tipos de dados de JavaScript incluem tipos primitivos e tipos de referência, e existem cinco tipos primitivos:
Número (Value) String (String) boolean (boolean) nulo (vazio) indefinido (indefinido)
Existe um tipo de referência:
Objeto (objeto)
Através do tipoof (x), você pode retornar os tipos de dados "número", "string", "booleano", "indefinido" e "objeto" de uma variável x. Uma coisa a observar aqui: o operador TIPOOF retorna objeto para tipos nulos.
"Javascript Avançado Programming":
Na verdade, este é um bug na implementação inicial do JavaScript, que foi posteriormente usado pelo ECMAScript. Null agora é considerado um espaço reservado para o objeto, explicando essa contradição. Mas tecnicamente ainda é o valor original.
2 Fale sobre a cadeia de escopo JavaScript
Ao executar uma parte do código JavaScript (código ou função global), o mecanismo JavaScript criará um escopo para ele, também conhecido como contexto de execução. Depois que a página for carregada, um escopo global será criado primeiro e, em seguida, cada função será executada, um escopo correspondente será estabelecido, formando assim uma cadeia de escopo. Cada escopo possui uma cadeia de escopo correspondente, a cabeça da cadeia é o escopo global e a cauda da cadeia é o escopo da função atual.
O objetivo da cadeia de escopo é analisar identificadores. Quando a função é criada (não executada), isso, argumentos, parâmetros nomeados e todas as variáveis locais na função serão adicionadas ao escopo atual. Quando o JavaScript precisa encontrar a variável x (esse processo é chamado de resolução variável), ele primeiro procurará se existe um atributo x do final da cadeia na cadeia de escopo, ou seja, o escopo atual. Se não for encontrado, continue pesquisando ao longo da corrente de escopo até a cabeça da corrente, ou seja, a cadeia de escopo global e a variável não é encontrada, acredita -se que não exista uma variável X na cadeia de escopo desse código e uma exceção de erro de referência (referenceError) é atribuída.
3 Como entender a cadeia de protótipo JavaScript
Cada objeto no JavaScript possui um atributo de protótipo, que chamamos de protótipo, e o valor do protótipo também é um objeto, portanto também possui seu próprio protótipo, que conecta uma cadeia de protótipo. O cabeçalho da cadeia de protótipo é objeto e seu protótipo é relativamente especial, com um valor de nulo.
A função da cadeia do protótipo é usada para herança de objetos. A propriedade do protótipo da função A é um objeto. Quando essa função é usada como construtor para criar uma instância, a propriedade do protótipo da função será atribuída a todas as instâncias de objetos como um protótipo. Por exemplo, se criarmos uma nova matriz, o método da matriz será herdado do protótipo da matriz.
Ao acessar um atributo de um objeto, primeiro procure o próprio objeto e retorne se for encontrado; Se não for encontrado, continue procurando as propriedades de seu objeto de protótipo (se ainda não for encontrado, ele realmente pesquisará para cima ao longo da cadeia de protótipo até a raiz). Desde que não seja substituído, as propriedades do protótipo de objeto podem ser encontradas em todos os casos e, se toda a cadeia de protótipo não for encontrada, ele retornará indefinido;
4 Declaração de variável JavaScript com antecedência
O guia autoritário do JavaScript explica o seguinte: as variáveis de JavaScript estão disponíveis antes da declaração, e esse recurso do JavaScript é informalmente chamado de elevação, ou seja, todas as variáveis declaradas nas funções JavaScript (mas não envolvem atribuições) são "avançadas" para o topo da função.
De um exemplo:
var scope = "global"; function myfunc () {console.log (escopo); var scope = "local";}O que o console impressa não é "global", mas "indefinido". Isso ocorre porque, no escopo da função myfunc, a declaração de escopo da variável local é avançada para o topo da função. No momento, o escopo declara e não atribui valores; portanto, a saída é indefinida. De fato, o código acima é o mesmo que o seguinte:
var scope = "global"; function myfunc () {var scope; console.log (escopo); scope = "local";}5 Como entender e aplicar o fechamento de JavaScript
Os conceitos dados na literatura sobre a definição específica de fechamentos são muito abstratos. Eu acho que os fechamentos são um mecanismo de sintaxe que permite funções para todas as variáveis locais de outras funções.
Por exemplo:
função outfunc () {var name = "vicfeel"; function infunc () {console.log (nome); } retornar infunc;} infunc (); // console exibe "vicfeel"Podemos ver este exemplo de que o nome da variável local do Outfunc ainda pode ser acessado no Infuncão da função.
Exemplos de aplicação de fechamento, simula as propriedades privadas de uma classe. Aproveitando as propriedades do fechamento, as variáveis locais só podem ser acessadas no método Sayage, e o nome também é acessado externamente, implementando assim as propriedades privadas da classe.
função user () {this.name = "vicfeel"; // o atributo total var idade = 23; // atributo privado this.sayage: function () {console.log ("minha idade é" + idade); }} var user = new User (); console.log (user.name); // "vicfeel" console.log (user.age); // "indefinido" user.sayage (); // "Minha idade tem 23 anos"Para saber mais sobre o fechamento, recomendo o registro de rede de Ruan Yifeng - Aprenda o fechamento do JavaScript (fechamento).
6 A essência do novo objeto de construção
function user () {this.name = "vicfeel"; this.age = 23;} var user = new user ();Através do novo operador, as seguintes operações são realmente concluídas no usuário do construtor:
• Crie um novo objeto cujo tipo é objeto;
• Defina as propriedades internas, acessíveis e de protótipo deste novo objeto, conforme definido no construtor (referindo -se ao construtor apontado por prototype.construtor);
• Executar construtor;
• Retorna o objeto recém -criado.
função user () {// this = {}; //this.constructor = usuário; this.name = "vicfeel"; this.age = 23; // retorna isso; } var user = new User ();Se o construtor retornar um objeto recém -criado por padrão, se uma variável for retornada manualmente, será inválido se a variável for do tipo original e, se for um objeto, será retornado.
7 Javascript Agent
Quando precisamos adicionar eventos a muitos elementos, podemos acionar a função de processamento adicionando eventos ao nó dos pais e delegando eventos ao nó pai.
Por exemplo, precisamos adicionar dinamicamente muitos LI a um UL, e precisamos atravessar Li para adicionar eventos de clique um por um.
<ul id = 'list'> </ul> var count = 100; var ullist = document.getElementById ("list"); // nó de construção dinâmica para (var i = count; i-;) {var lidom = document.createElement ('li'); Ullist.appendChild (Lidom); } // encadernação clique no evento var linode = ullist.getElementByTagName ("li"); for (var i = 0, l = linodes.length; i <l; i ++) {linode [i] .OnClick = function () {// Li Click Event}}Como todos sabemos, as operações da DOM são muito consumidas por desempenho. A ligação a eventos tão repetidos é simplesmente um assassino de desempenho. A idéia principal de proxy de eventos é ouvir o maior número possível de eventos através do menor número possível de ligações. Como fazer isso? A resposta é usar o mecanismo de bolhas de eventos para ligar o nó pai (bolha de eventos) e usar o Event.Target para determinar qual nó desencadeia o evento, reduzindo assim a ligação de muitos manipuladores de eventos.
var count = 100; var ullist = document.getElementById ("list"); // nó de construção dinâmica para (var i = count; i-;) {var lidom = document.createElement ('li'); Ullist.appendChild (Lidom); } // encadernação clique no evento var linode = ullist.getElementByTagName ("li"); Linode.OnClick = function (e) {if (e.target && e.target.nodename.Touppercase == "Li") {// Li Click Event}}Novo conteúdo será atualizado continuamente ...