assign est une méthode es6. assign() est une nouvelle méthode de l'objet es6 Object. La méthode "Object.assign()" est utilisée pour fusionner des objets. Elle peut copier toutes les propriétés énumérables de l'objet source vers la première de cette méthode ; Le paramètre est l'objet cible et les paramètres suivants sont tous des objets source.
L'environnement d'exploitation de ce tutoriel : système Windows 7, ECMAScript version 6, ordinateur Dell G3.
assign est une méthode es6.
Object.assign() est une nouvelle méthode dans es6, qui est utilisée pour fusionner des objets et copier toutes les propriétés énumérables de l'objet source (source) vers l'objet cible (cible).
const target = { a: 1, b: 2 } const source = { b: 4, c: 5 } const returnedTarget = Object.assign(target, source) target // { a: 1, b: 4, c: 5 } returnedTarget // { a: 1, b: 4, c: 5 }
Le premier paramètre de la méthode Object.assign
est l'objet cible, et les paramètres suivants sont tous des objets source. Object.assign
方法的第一个参数是目标对象,后面的参数都是源对象。
注意:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
const target = { a: 1, b: 1 } const source1 = { b: 2, c: 2 } const source2 = { c: 3 } Object.assign(target, source1, source2) target // {a:1, b:2, c:3}
如果只有一个参数,Object.assign
会直接返回该参数。
const obj = {a: 1} Object.assign(obj) // {a: 1} Object.assign(obj) === obj // true
如果该参数不是对象,则会先转成对象,然后返回。
typeof Object.assign(2) // "object"
由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。
Object.assign(undefined) // 报错 Object.assign(null) // 报错
如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着,如果undefined和null不在首参数,就不会报错。
let obj = {a: 1} Object.assign(obj, undefined) === obj // true Object.assign(obj, null) === obj // true
其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。
const v1 = 'abc' const v2 = true const v3 = 10 const obj = Object.assign({}, v1, v2, v3) obj // { "0": "a", "1": "b", "2": "c" }
上面代码中,v1、v2、v3分别是字符串、布尔值和数值,结果只有字符串合入目标对象(以字符数组的形式),数值和布尔值都会被忽略。这是因为只有字符串的包装对象,会产生可枚举属性。
Object.assign(true) // {[[PrimitiveValue]]: true} Object.assign(10) // {[[PrimitiveValue]]: 10} Object.assign('abc') // {0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"}
上面代码中,布尔值、数值、字符串分别转成对应的包装对象,可以看到它们的原始值都在包装对象的内部属性 [[PrimitiveValue]]
上面,这个属性是不会被Object.assign
拷贝的。只有字符串的包装对象,会产生可枚举的实义属性,那些属性则会被拷贝。
Object.assign
拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false
)。
Object.assign({b: 'c'}, Object.defineProperty({}, 'invisible', { enumerable: false, value: 'hello' }) ) // { b: 'c' }
上面代码中,Object.assign
要拷贝的对象只有一个不可枚举属性invisible
,这个属性并没有被拷贝进去。
属性名为 Symbol
值的属性,也会被Object.assign
拷贝。
Object.assign({ a: 'b' }, { [Symbol('c')]: 'd' }) // { a: 'b', Symbol(c): 'd' }
注意点
(1)浅拷贝
Object.assign
方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。
const obj1 = {a: {b: 1}} const obj2 = Object.assign({}, obj1) obj1.a.b = 2 obj2.a.b // 2
上面代码中,源对象obj1
的a
属性的值是一个对象,Object.assign
拷贝得到的是这个对象的引用。这个对象的任何变化,都会反映到目标对象上面。
(2)同名属性的替换
对于这种嵌套的对象,一旦遇到同名属性,Object.assign
的处理方法是替换,而不是添加。
const target = { a: { b: 'c', d: 'e' } } const source = { a: { b: 'hello' } } Object.assign(target, source) // { a: { b: 'hello' } }
上面代码中,target
对象的a
属性被source
对象的a
属性整个替换掉了,而不会得到{ a: { b: 'hello', d: 'e' } }
的结果。这通常不是开发者想要的,需要特别小心。
一些函数库提供 Object.assign
的定制版本(比如 Lodash
的_.defaultsDeep
方法),可以得到深拷贝的合并。
(3)数组的处理Object.assign
可以用来处理数组,但是会把数组视为对象。
Object.assign([1, 2, 3], [4, 5]) // [4, 5, 3]
上面代码中,Object.assign
把数组视为属性名为 0、1、2
的对象,因此源数组的 0
号属性4
覆盖了目标数组的 0
号属性1
。
(4)取值函数的处理
Object.assign
只能进行值的复制,如果要复制的值是一个取值函数,那么将求值后再复制。
const source = { get foo() { return 1 } } const target = {} Object.assign(target, source) // { foo: 1 }
上面代码中, source
对象的foo
属性是一个取值函数,Object.assign
不会复制这个取值函数,只会拿到值以后,将这个值复制过去。
Object.assign的用法
Object.assign
class Point { constructor(x, y) { Object.assign(this, {x, y}) } }🎜S'il n'y a qu'un seul paramètre,
Object.assign
renverra directement le paramètre. 🎜Object.assign(SomeClass.prototype, { someMethod(arg1, arg2) { ··· }, anotherMethod() { ··· } }) // 等同于下面的写法 SomeClass.prototype.someMethod = function (arg1, arg2) { ··· } SomeClass.prototype.anotherMethod = function () { ··· }🎜Si le paramètre n'est pas un objet, il sera d'abord converti en objet puis renvoyé. 🎜
function clone(origin) { return Object.assign({}, origin) }🎜Étant donné qu'undefined et null ne peuvent pas être convertis en objets, s'ils sont utilisés comme paramètres, une erreur sera signalée. 🎜
function clone(origin) { let originProto = Object.getPrototypeOf(origin) return Object.assign(Object.create(originProto), origin) }🎜Si le paramètre non-objet apparaît à la position de l'objet source (c'est-à-dire pas le premier paramètre), alors les règles de traitement sont différentes. Tout d'abord, ces paramètres seront convertis en objets. S'ils ne peuvent pas être convertis en objets, ils seront ignorés. Cela signifie que si undefined et null ne sont pas dans le premier paramètre, aucune erreur ne sera signalée. 🎜
const merge = (target, ...sources) => Object.assign(target, ...sources)🎜Les autres types de valeurs (c'est-à-dire les valeurs numériques, les chaînes et les valeurs booléennes) ne sont pas inclus dans le premier paramètre et aucune erreur ne sera signalée. Cependant, sauf que la chaîne sera copiée dans l'objet cible sous forme de tableau, les autres valeurs n'auront aucun effet. 🎜
const merge = (...sources) => Object.assign({}, ...sources)🎜Dans le code ci-dessus, v1, v2 et v3 sont respectivement des chaînes, des valeurs booléennes et des valeurs numériques. Par conséquent, seules les chaînes sont combinées dans l'objet cible (sous la forme d'un tableau de caractères) et. les valeurs numériques et les valeurs booléennes seront ignorées. En effet, seuls les objets wrapper de chaîne produisent des propriétés énumérables. 🎜
const DEFAULTS = { logLevel: 0, outputFormat: 'html' } function processContent(options) { options = Object.assign({}, DEFAULTS, options) console.log(options) // ... }🎜Dans le code ci-dessus, les valeurs booléennes, les valeurs numériques et les chaînes sont converties en objets d'emballage correspondants. Vous pouvez voir que leurs valeurs d'originesont au-dessus des propriétés internes de l'objet d'emballage
[[PrimitiveValue]. ]
. Cette propriété ne sera pas copiée par Object.assign
. Seuls les objets wrapper de chaîne produiront des propriétés littérales énumérables, et ces propriétés seront copiées. 🎜🎜
Object.assign
Les attributs copiés sont limités. Seuls les propres attributs de l'objet source sont copiés (les attributs hérités ne sont pas copiés) et les attributs non énumérables ne sont pas copiés (. énumérable : faux
). 🎜const DEFAULTS = { url: { host: 'example.com', port: 7070 }, } processContent({ url: {port: 8000} }) // { // url: {port: 8000} // }🎜Dans le code ci-dessus, l'objet à copier par
Object.assign
n'a qu'une seule propriété non énumérable invisible
, et cette propriété n'est pas copiée. 🎜🎜Les attributs avec des noms d'attribut de valeurs Symbol
seront également copiés par Object.assign
. 🎜rrreee🎜🎜Notes🎜🎜🎜🎜 (1) La méthode de copie superficielle🎜🎜🎜Object.assign
implémente la copie superficielle, pas copie profonde. C'est-à-dire que si la valeur d'un certain attribut de l'objet source est un objet, alors la copie de l'objet cible obtiendra une référence à cet objet. 🎜rrreee🎜Dans le code ci-dessus, la valeur de l'attribut a
de l'objet source obj1
est un objet, et ce qui est copié par Object.assign code> est cet objet. Toute modification apportée à cet objet sera reflétée sur l'objet cible. 🎜🎜🎜(2) Remplacement des attributs du même nom🎜🎜🎜Pour ce type d'objet imbriqué, une fois qu'un attribut du même nom est rencontré, la méthode de traitement de <code>Object.assign
consiste à remplacer , pour ne pas ajouter. 🎜rrreee🎜Dans le code ci-dessus, l'attribut a
de l'objet target
est complètement remplacé par l'attribut a
de la source object , au lieu d'obtenir le résultat de <code>{ a: { b: 'hello', d: 'e' } }
. Ce n’est généralement pas ce que souhaitent les développeurs et nécessite une attention particulière. 🎜🎜Certaines bibliothèques de fonctions fournissent des versions personnalisées de Object.assign
(telles que la méthode _.defaultsDeep
de Lodash
), qui peuvent obtenir une copie complète fusionner. 🎜🎜(3) Le traitement des tableaux Object.assign
peut être utilisé pour traiter des tableaux, mais le tableau sera traité comme un objet. 🎜rrreee🎜Dans le code ci-dessus, Object.assign
traite le tableau comme un objet avec des noms d'attribut 0, 1, 2
, donc le tableau source est 0 L'attribut numérique <code>4
écrase l'attribut numérique 0
1
du tableau cible. 🎜🎜🎜(4) Traitement des fonctions de valeur🎜🎜🎜Object.assign
ne peut copier que des valeurs. Si la valeur à copier est une fonction de valeur, elle sera évaluée puis copiée. 🎜rrreee🎜Dans le code ci-dessus, l'attribut foo
de l'objet source
est une fonction de valeur, et Object.assign
ne copiera pas cette valeur fonction. Ce n'est qu'après avoir obtenu la valeur que cette valeur sera copiée. 🎜🎜🎜Utilisation de la méthode Object.assign🎜🎜🎜Object.assign
a de nombreuses utilisations. 🎜(1)为对象添加属性
class Point { constructor(x, y) { Object.assign(this, {x, y}) } }
上面方法通过Object.assign
方法,将x
属性和y
属性添加到Point
类的对象实例。
(2)为对象添加方法
Object.assign(SomeClass.prototype, { someMethod(arg1, arg2) { ··· }, anotherMethod() { ··· } }) // 等同于下面的写法 SomeClass.prototype.someMethod = function (arg1, arg2) { ··· } SomeClass.prototype.anotherMethod = function () { ··· }
上面代码使用了对象属性的简洁表示法,直接将两个函数放在大括号中,再使用assign
方法添加到SomeClass.prototype
之中。
(3)克隆对象
function clone(origin) { return Object.assign({}, origin) }
上面代码将原始对象拷贝到一个空对象,就得到了原始对象的克隆。
不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码。
function clone(origin) { let originProto = Object.getPrototypeOf(origin) return Object.assign(Object.create(originProto), origin) }
(4)合并多个对象
将多个对象合并到某个对象。
const merge = (target, ...sources) => Object.assign(target, ...sources)
如果希望合并后返回一个新对象,可以改写上面函数,对一个空对象合并。
const merge = (...sources) => Object.assign({}, ...sources)
(5)为属性指定默认值
const DEFAULTS = { logLevel: 0, outputFormat: 'html' } function processContent(options) { options = Object.assign({}, DEFAULTS, options) console.log(options) // ... }
上面代码中,DEFAULTS
对象是默认值,options
对象是用户提供的参数。Object.assign
方法将DEFAULTS
和options
合并成一个新对象,如果两者有同名属性,则option
的属性值会覆盖DEFAULTS
的属性值。
注意:由于存在浅拷贝的问题,DEFAULTS
对象和options
对象的所有属性的值,最好都是简单类型,不要指向另一个对象。否则,DEFAULTS
对象的该属性很可能不起作用。
const DEFAULTS = { url: { host: 'example.com', port: 7070 }, } processContent({ url: {port: 8000} }) // { // url: {port: 8000} // }
上面代码的原意是将 url.port
改成 8000
,url.host
不变。实际结果却是options.url
覆盖掉DEFAULTS.url
,所以url.host
就不存在了。
【相关推荐:javascript视频教程、web前端】
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

La relation entre HTML et React est le cœur du développement frontal, et ils créent conjointement l'interface utilisateur des applications Web modernes. 1) HTML définit la structure et la sémantique du contenu, et React construit une interface dynamique par la composontisation. 2) Les composants réagis utilisent la syntaxe JSX pour intégrer HTML pour réaliser un rendu intelligent. 3) Le cycle de vie des composants gère le rendu HTML et se met à jour dynamiquement en fonction de l'état et des attributs. 4) Utilisez des composants pour optimiser la structure HTML et améliorer la maintenabilité. 5) L'optimisation des performances comprend l'évitement du rendu inutile, l'utilisation des attributs clés et la maintenance de la responsabilité unique du composant.

React est l'outil préféré pour construire des expériences frontales interactives. 1) Réagir simplifie le développement de l'interface utilisateur par la composontisation et le DOM virtuel. 2) Les composants sont divisés en composants de fonction et composants de classe. Les composants de fonction sont plus simples et les composants de la classe fournissent plus de méthodes de cycle de vie. 3) Le principe de travail de React repose sur le DOM virtuel et l'algorithme de réconciliation pour améliorer les performances. 4) La gestion de l'État utilise USESTATE ou This. State, et des méthodes de cycle de vie telles que ComponentDidMount sont utilisées pour une logique spécifique. 5) L'utilisation de base comprend la création de composants et la gestion de l'état, et l'utilisation avancée implique des crochets personnalisés et une optimisation des performances. 6) Les erreurs courantes incluent les mises à jour de statut et les problèmes de performance inappropriés, les compétences de débogage comprennent l'utilisation de Reactdevtools et d'excellents

React est une bibliothèque JavaScript pour la construction d'interfaces utilisateur, avec ses composants principaux et sa gestion de l'État. 1) Simplifiez le développement de l'interface utilisateur par la composontisation et la gestion de l'État. 2) Le principe de travail comprend la réconciliation et le rendu, et l'optimisation peut être mise en œuvre via React.Memo et UseMemo. 3) L'utilisation de base est de créer et de rendre des composants, et l'utilisation avancée comprend l'utilisation de crochets et de contextapi. 4) Erreurs courantes telles que la mise à jour du statut incorrect, vous pouvez utiliser ReactDevTools pour déboguer. 5) L'optimisation des performances comprend l'utilisation de React.Memo, des listes de virtualisation et de la circulation des codes, et la maintenance de code et maintenable du code est la meilleure pratique.

React combine JSX et HTML pour améliorer l'expérience utilisateur. 1) JSX incorpore du HTML pour rendre le développement plus intuitif. 2) Le mécanisme DOM virtuel optimise les performances et réduit les opérations DOM. 3) Interface utilisateur de gestion basée sur les composants pour améliorer la maintenabilité. 4) La gestion des états et le traitement des événements améliorent l'interactivité.

Les composants React peuvent être définis par des fonctions ou des classes, encapsulant la logique de l'interface utilisateur et acceptant les données d'entrée via des accessoires. 1) Définissez les composants: utilisez des fonctions ou des classes pour retourner les éléments de réact. 2) Rendre le composant: React Cappel Render Method ou Exécute le composant de fonction. 3) Composants de multiplexage: passer des données à travers des accessoires pour construire une interface utilisateur complexe. L'approche du cycle de vie des composants permet d'exécuter la logique à différentes étapes, améliorant l'efficacité de développement et la maintenabilité du code.

Le mode React Strict est un outil de développement qui met en évidence les problèmes potentiels dans les applications React en activant des vérifications et des avertissements supplémentaires. Il aide à identifier le code hérité, les cycles de vie dangereux et les effets secondaires, encourageant les pratiques de réaction modernes.

Les fragments de réaction permettent de regrouper les enfants sans nœuds DOM supplémentaires, d'amélioration de la structure, des performances et de l'accessibilité. Ils prennent en charge les clés d'un rendu de liste efficace.

L'article traite du processus de réconciliation de React, détaillant comment il met à jour efficacement le DOM. Les étapes clés incluent le déclenchement de la réconciliation, la création d'un Dom virtuel, l'utilisation d'un algorithme de difficulté et l'application de mises à jour MIMM DOM. Il couvre également le perfo


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

DVWA
Damn Vulnerable Web App (DVWA) est une application Web PHP/MySQL très vulnérable. Ses principaux objectifs sont d'aider les professionnels de la sécurité à tester leurs compétences et leurs outils dans un environnement juridique, d'aider les développeurs Web à mieux comprendre le processus de sécurisation des applications Web et d'aider les enseignants/étudiants à enseigner/apprendre dans un environnement de classe. Application Web sécurité. L'objectif de DVWA est de mettre en pratique certaines des vulnérabilités Web les plus courantes via une interface simple et directe, avec différents degrés de difficulté. Veuillez noter que ce logiciel

MinGW - GNU minimaliste pour Windows
Ce projet est en cours de migration vers osdn.net/projects/mingw, vous pouvez continuer à nous suivre là-bas. MinGW : un port Windows natif de GNU Compiler Collection (GCC), des bibliothèques d'importation et des fichiers d'en-tête librement distribuables pour la création d'applications Windows natives ; inclut des extensions du runtime MSVC pour prendre en charge la fonctionnalité C99. Tous les logiciels MinGW peuvent fonctionner sur les plates-formes Windows 64 bits.

Navigateur d'examen sécurisé
Safe Exam Browser est un environnement de navigation sécurisé permettant de passer des examens en ligne en toute sécurité. Ce logiciel transforme n'importe quel ordinateur en poste de travail sécurisé. Il contrôle l'accès à n'importe quel utilitaire et empêche les étudiants d'utiliser des ressources non autorisées.

Télécharger la version Mac de l'éditeur Atom
L'éditeur open source le plus populaire

mPDF
mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),