assign は es6 メソッドですか?

Mar 23, 2022 pm 02:52 PM
assign es6

assign は es6 メソッドです。 assign() は、es6 Object オブジェクトの新しいメソッドです。「Object.assign()」メソッドは、オブジェクトをマージするために使用されます。ソース オブジェクトのすべての列挙可能なプロパティをターゲット オブジェクトにコピーできます。このメソッドの最初のメソッドは、パラメータはターゲット オブジェクトであり、後続のパラメータはすべてソース オブジェクトです。

assign は es6 メソッドですか?

このチュートリアルの動作環境: Windows 7 システム、ECMAScript バージョン 6、Dell G3 コンピューター。

assign は es6 メソッドです。

Object.assign() は es6 の新しいメソッドで、オブジェクトをマージし、ソース オブジェクト (ソース) のすべての列挙可能なプロパティをターゲット上のターゲットにコピーするために使用されます。

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 }
ログイン後にコピー

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}
ログイン後にコピー

パラメータが 1 つだけの場合、Object.assign はパラメータを直接返します。

const obj = {a: 1}

Object.assign(obj) // {a: 1}
Object.assign(obj) === obj // true
ログイン後にコピー

パラメータがオブジェクトでない場合は、まずオブジェクトに変換されてから返されます。

typeof Object.assign(2) // "object"
ログイン後にコピー

unknown と null はオブジェクトに変換できないため、パラメータとして使用するとエラーが報告されます。

Object.assign(undefined) // 报错
Object.assign(null) // 报错
ログイン後にコピー

非オブジェクト パラメータがソース オブジェクトの位置にある (つまり、最初のパラメータではない) 場合、処理規則は異なります。まずこれらのパラメータはオブジェクト化されますが、オブジェクト化できない場合はスキップされます。これは、最初のパラメータに未定義と 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コピーされる属性は制限されています。ソース オブジェクト自身の属性のみがコピーされ (継承された属性はコピーされません)、列挙不可能な属性はコピーされません (列挙可能: false)。

Object.assign({b: 'c'},
  Object.defineProperty({}, 'invisible', {
    enumerable: false,
    value: 'hello'
  })
)
// { b: 'c' }
ログイン後にコピー

上記のコードでは、Object.assignコピーされるオブジェクトには列挙不可能なプロパティ invisible が 1 つだけあり、このプロパティはコピーされていません。

Symbol という名前の属性の値も、Object.assign によってコピーされます。

Object.assign({ a: 'b' }, { [Symbol('c')]: 'd' })
// { a: 'b', Symbol(c): 'd' }
ログイン後にコピー

Notes

(1) 浅いコピー

Object.assign このメソッドは深いコピーではなく浅いコピーを実装します。つまり、ソース オブジェクトの特定の属性の値がオブジェクトの場合、ターゲット オブジェクトのコピーはこのオブジェクトへの参照を取得します。

const obj1 = {a: {b: 1}}
const obj2 = Object.assign({}, obj1)

obj1.a.b = 2
obj2.a.b // 2
ログイン後にコピー

上記のコードでは、ソース オブジェクト obj1a 属性の値がオブジェクトであり、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 はこの値をコピーしませんfunction では、値を取得した後にのみコピーされます。

Object.assign の使用法

Object.assign メソッドには多くの用途があります。

(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方法将DEFAULTSoptions合并成一个新对象,如果两者有同名属性,则option的属性值会覆盖DEFAULTS的属性值。

注意:由于存在浅拷贝的问题,DEFAULTS对象和options对象的所有属性的值,最好都是简单类型,不要指向另一个对象。否则,DEFAULTS对象的该属性很可能不起作用。

const DEFAULTS = {
  url: {
    host: 'example.com',
    port: 7070
  },
}

processContent({ url: {port: 8000} })
// {
//   url: {port: 8000}
// }
ログイン後にコピー

上面代码的原意是将 url.port改成 8000url.host不变。实际结果却是options.url覆盖掉DEFAULTS.url,所以url.host就不存在了。

【相关推荐:javascript视频教程web前端

以上がassign は es6 メソッドですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ES6 で配列を反転する方法 ES6 で配列を反転する方法 Oct 26, 2022 pm 06:19 PM

ES6 では、配列オブジェクトの reverse() メソッドを使用して、配列の反転を実現できます。このメソッドは、配列内の要素の順序を逆にして、最後の要素を最初に、最初の要素を最後に配置するために使用されます。構文「array」 。逆行する()"。 reverse() メソッドは元の配列を変更します。変更したくない場合は、拡張演算子 "..." とともに使用する必要があり、構文は "[...array].reverse() 」。

非同期は es6 または es7 用ですか? 非同期は es6 または es7 用ですか? Jan 29, 2023 pm 05:36 PM

非同期はes7です。 async と await は ES7 に新しく追加されたもので、非同期操作のソリューションです。async/await は co モジュールとジェネレーター関数の糖衣構文と言え、より明確なセマンティクスで JS 非同期コードを解決します。名前が示すように、async は「非同期」を意味します。async は関数が非同期であることを宣言するために使用されます。async と await の間には厳密な規則があります。両方を互いに分離することはできず、await は async 関数内でのみ記述できます。

ミニ プログラムで es6 を es5 に変換する必要があるのはなぜですか? ミニ プログラムで es6 を es5 に変換する必要があるのはなぜですか? Nov 21, 2022 pm 06:15 PM

ブラウザの互換性のため。 ES6 は JS の新しい仕様として、多くの新しい構文と API を追加していますが、最新のブラウザーは ES6 の新機能を高度にサポートしていないため、ES6 コードを ES5 コードに変換する必要があります。 WeChat Web 開発者ツールでは、デフォルトで babel が使用され、開発者の ES6 構文コードを 3 つの端末すべてで適切にサポートされる ES5 コードに変換し、開発者がさまざまな環境によって引き起こされる開発上の問題を解決できるようにします。プロジェクト内でのみ設定して確認するだけです。 「ES6~ES5」オプション。

es6 の 2 つの配列で異なる項目を見つける方法 es6 の 2 つの配列で異なる項目を見つける方法 Nov 01, 2022 pm 06:07 PM

手順: 1. 構文 "newA=new Set(a); newB=new Set(b);" を使用して、2 つの配列をそれぞれセット型に変換します; 2. has() と filter() を使用して差分セットを検索します、構文 " new Set([...newA].filter(x =>!newB.has(x)))" では、差分セット要素がセット コレクションに含まれて返されます。 3. 配列を使用します。 from セットを配列に変換するタイプ、構文は「Array.from(collection)」です。

es5 および es6 で配列重複排除を実装する方法 es5 および es6 で配列重複排除を実装する方法 Jan 16, 2023 pm 05:09 PM

es5 では、for ステートメントと IndexOf() 関数を使用して配列の重複排除を実現できます。構文 "for(i=0;i<配列長;i++){a=newArr.indexOf(arr[i]);if( a== -1){...}}」。 es6 では、スプレッド演算子 Array.from() および Set を使用して重複を削除できます。まず配列を Set オブジェクトに変換して重複を削除してから、スプレッド演算子または Array.from() 関数を使用する必要があります。 Set オブジェクトを配列に変換してグループ化するだけです。

es6 の一時的なデッドゾーンとは何を意味しますか? es6 の一時的なデッドゾーンとは何を意味しますか? Jan 03, 2023 pm 03:56 PM

es6 では、一時的なデッド ゾーンは構文エラーであり、ブロックを閉じたスコープにする let および const コマンドを指します。コード ブロック内では、let/const コマンドを使用して変数が宣言される前に、変数は使用できず、変数が宣言される前は変数の「デッド ゾーン」に属します。これは構文上「一時デッド ゾーン」と呼ばれます。 ES6 では、一時的なデッド ゾーンや let ステートメントや const ステートメントでは変数のプロモーションが発生しないことを規定しています。これは主に実行時エラーを減らし、変数が宣言される前に使用されて予期しない動作が発生するのを防ぐためです。

es6 構文が必要ですか? es6 構文が必要ですか? Oct 21, 2022 pm 04:09 PM

いいえ、require は CommonJS 仕様のモジュール構文であり、es6 仕様のモジュール構文は import です。 require は実行時にロードされ、import はコンパイル時にロードされます。require はコード内のどこにでも記述できます。import はファイルの先頭にのみ記述でき、条件文や関数スコープでは使用できません。モジュール属性は導入されるだけです。 require を実行した場合、そのためパフォーマンスは比較的低くなりますが、インポート コンパイル中に導入されたモジュールのプロパティのパフォーマンスはわずかに高くなります。

es6 の配列にある項目の数を確認する方法 es6 の配列にある項目の数を確認する方法 Jan 18, 2023 pm 07:22 PM

ES6 では、配列オブジェクトの length 属性を使用して、配列内にある項目の数を決定する、つまり、配列内の要素の数を取得できます。この属性は、配列内の要素の数を返すことができます。 "array.length" ステートメントを使用すると、配列オブジェクトの要素の数を表す値、つまり長さの値が返されます。

See all articles