Este artigo compartilha a cópia superficial e o código de cópia profundo dos objetos JavaScript para sua referência. O conteúdo específico é o seguinte
1. Cópia leve
Cópia significa copiar todas as propriedades do objeto pai para o objeto filho.
A seguinte função é copiar:
var chinês = {nação: 'China'} var médico = {Career: 'doutor'} função ExtendCopy (p) {var c = {}; for (var i em p) {c [i] = p [i]; } c.UBER = P; retornar c; }Ao usá -lo, escreva isso:
var médico = extendcopy (chinês); doutor.career = 'doutor'; alerta (médico.nation); // China
No entanto, há um problema com essa cópia. Ou seja, se a propriedade do objeto pai for igual a uma matriz ou outro objeto; de fato, o objeto filho recebe apenas um endereço de memória, não uma cópia real; portanto, existe a possibilidade de o objeto pai ser adulterado.
Por favor, consulte agora, adicione uma propriedade de "local de nascimento" aos chineses, cujo valor é uma matriz.
Chinês.birthplaces = ['Pequim', 'Shanghai', 'Hong Kong'];
Através da função ExtendCopy (), o médico herda chinês.
var médico = extendcopy (chinês);
Então adicionamos uma cidade ao "local de nascimento" do médico:
Médico.birthplaces.push ('xiamen');
Confira os resultados de entrada
alerta (Doctor.birthplaces); // Pequim, Xangai, Hong Kong, Xiamen
alerta (chinês.birthplaces); // Pequim, Xangai, Hong Kong, Xiamen
Como resultado, ambos os locais de nascimento foram alterados.
Portanto, estendCopy () apenas copia dados do tipo básico e chamamos essa cópia de "cópia rasa".
2 cópia profunda
Como a cópia rasa e profunda tem tais desvantagens, vamos dar uma olhada na cópia profunda a seguir
A chamada "cópia profunda" significa que pode realizar a cópia real de matrizes e objetos. Sua implementação não é difícil, basta chamar de "cópia superficial" recursivamente.
função Deepcopy (p, c) {var c = c || {}; for (var i em p) {if (typeof p [i] === 'objeto') {c [i] = (p [i] .Constructor === Array)? []: {}; Deepcopy (p [i], c [i]); } else {c [i] = p [i]; }} retornar c; }Dê uma olhada em como usá -lo:
var médico = Deepcopy (chinês);
Agora, adicione uma propriedade ao objeto pai com o valor como uma matriz. Em seguida, modifique esta propriedade no objeto filho:
Chinês.birthplaces = ['Pequim', 'shanghai', 'hong kong']; doutor.birthplaces.push ('xiamen'); alert (moctor.birthplaces); // Pequim, Xangai, Hong Kong, Xiamen Alert (chinês.birthplaces); // Pequim, Xangai, Hong KongIsso completa a cópia;
$ .Extend ()
$ .extend () em jQuery é o mesmo.
$ .Extend ([Deep], Target, Object1 [, ObjectN])
•profundo
Tipo: booleano
Se verdadeiro, a mesclagem se torna recursiva (também chamada de cópia profunda).
•alvo
Tipo: objeto
Extensão do objeto. Isso receberá novas propriedades.
• Objeto1
Tipo: objeto
Um objeto que contém propriedades adicionais mescladas no primeiro parâmetro.
• ObjectN
Tipo: objeto
Contém atributos adicionais para se fundir no primeiro parâmetro
Quando fornecemos dois ou mais objetos para $ .extend (), todas as propriedades do objeto são adicionadas ao objeto de destino (parâmetro de destino).
Se apenas um parâmetro for fornecido para $ .extend (), isso significa que o parâmetro de destino será omitido. Nesse caso, o próprio objeto jQuery é padrão para o objeto de destino. Dessa forma, podemos adicionar novos recursos no espaço para nome do jQuery. Isso é útil para desenvolvedores de plug -in quando eles desejam adicionar novas funções ao jQuery.
Lembre -se de que o objeto de destino (primeiro parâmetro) será modificado e será retornado por $ .extend (). No entanto, se queremos manter o objeto original, podemos passar um objeto vazio como o objeto de destino:
var object = $ .Extend ({}, object1, object2);
Por padrão, a operação de mesclagem via $ .extend () não é recursiva; Se a propriedade do primeiro objeto for um objeto ou matriz, ele substituirá completamente uma propriedade com a mesma chave do segundo objeto. Esses valores não serão mesclados. Isso pode ser entendido verificando o valor da banana no exemplo abaixo. No entanto, se o verdadeiro for usado como o primeiro argumento da função, as mescladas recursivas serão realizadas no objeto.
Aviso: Passar falsa para o primeiro parâmetro não é suportado.
1. Mesclar dois objetos e modifique o primeiro objeto.
var object1 = {Apple: 0, banana: {peso: 52, preço: 100}, cereja: 97}; var object2 = {banana: {preço: 200}, durian: 100}; // mesclar object2 em object1 $ .extend (object1); // assumindo json.stringy - não disponível em ie (object1); ); // {"Apple": 0, "Banana": {"Price": 200}, "Cherry": 97, "Durian": 100}2. Mesclar dois objetos de maneira recursiva e modifique o primeiro objeto.
var object1 = {Apple: 0, banana: {Peso: 52, preço: 100}, cereja: 97}; var object2 = {banana: {price: 200}, durian: 100}; // mescle objeto 2 no objeto1, recursivamente $ .extend1, object1); // // assumindo json. Object1)); // {"Apple": 0, "Banana": {"Weight": 52, "Price": 200}, "Cherry": 97, "Durian": 100}3. Mesclar os objetos de padrões e opções e não modifique o objeto Padrões. Este é um modelo de desenvolvimento de plug-in comumente usado.
var defaults = { validate: false, limit: 5, name: "foo" };var options = { validate: true, name: "bar" };// Merge defaults and options, without modifying defaultsvar settings = $.extend( {}, defaults, options );console.log(JSON.stringify( defaults ));console.log(JSON.stringify( options ));console.log(JSON.stringify( settings ));//defaults -- {"validate":false,"limit":5,"name":"foo"}//options -- {"validate":true,"name":"bar"}//settings -- {"validate":true,"limit":5,"name":"bar"}JavaScript determina se os objetos são iguais
No JavaScript, as operações de igualdade incluem "==", "===" Consistência. Não há necessidade de ser a maioria das diferenças entre os dois. Neste artigo, falaremos sobre como determinar se dois objetos são iguais? Você pode pensar que, se dois objetos tiverem as mesmas propriedades e suas propriedades tiverem os mesmos valores, os dois objetos são iguais. Então vamos usar um exemplo para demonstrar:
var obj1 = {nome: "benjamin", sexo: "masculino"} var obj2 = {name: "benjamin", sexo: "masculino"} // saídas: false Secondso.log (obj1 == obj2); // saídas: false Secondso.log (obj1 ======);A partir do exemplo acima, podemos ver que, se você usa "==" ou "==", False é retornado. O principal motivo é que a sequência e o número de tipos básicos são comparados pelos valores, enquanto objetos (data, matriz) e objetos comuns são comparados pelo endereço na memória apontados pelos ponteiros. Veja o seguinte exemplo:
var obj1 = {nome: "benjamin", sexo: "masculino"}; var obj2 = {name: "benjamin", sexo: "masculino"}; var obj3 = obj1; // saídas: trueconsole.log (obj1 ==); FalSeconsole.log (obj2 === obj3); // saídas: falseconsole.log (obj2 === obj3);O exemplo acima retorna true porque os ponteiros de OBJ1 e OB3 apontam para o mesmo endereço na memória. É semelhante ao conceito de passagem de valor e passagem de referência em idiomas orientados a objetos (Java/C ++). Porque, se você deseja determinar se dois objetos são iguais, você deve ficar claro, está tentando determinar se as propriedades dos dois objetos são iguais ou se os valores correspondentes às propriedades são iguais ou o quê?
função pessoa (nome) {this.name = name; } var p1 = nova pessoa ("p1"); var p2 = nova pessoa ("p2"); console.log (p1 == p2); // false Person.prototype.sayhi = function () {// Sayhi aqui} console.log (p1.sayhi () == p2.sayhi ()); // True Console.log (p1.sayhi () == p2.sayhi ()); // True Console.log (p1.sayhi () === P2.sayhi ()); //verdadeiroO exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.