웹 프론트엔드 프런트엔드 Q&A es6 메소드를 할당합니까?

es6 메소드를 할당합니까?

Mar 23, 2022 pm 02:52 PM
assign es6

signal은 es6 메소드입니다. 할당()은 es6 객체 객체의 새로운 메소드입니다. "Object.sign()" 메소드는 객체를 병합하는 데 사용됩니다. 이 메소드는 소스 객체의 열거 가능한 모든 속성을 이 메소드의 첫 번째 객체에 복사할 수 있습니다. 매개변수는 대상 개체이고 후속 매개변수는 모두 소스 개체입니다.

es6 메소드를 할당합니까?

이 튜토리얼의 운영 환경: Windows 7 시스템, ECMAScript 버전 6, Dell G3 컴퓨터.

Assign은 es6 메소드입니다.

Object.sign()은 es6의 새로운 메소드로, 객체를 병합하고 소스 객체(source)의 열거 가능한 모든 속성을 대상 객체(target)에 복사하는 데 사용됩니다.

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.asse 메소드의 첫 번째 매개변수는 대상 객체이고, 그 다음 매개변수는 모두 소스 객체입니다. 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
로그인 후 복사

上面代码中,源对象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不会复制这个取值函数,只会拿到值以后,将这个值复制过去。

Object.assign的用法

Object.assign

🎜참고🎜: 대상 개체와 소스 개체에 동일한 이름의 속성이 있거나 여러 소스 개체에 동일한 이름의 속성이 있는 경우 이후 속성이 이전 속성을 덮어씁니다. 🎜
class Point {
  constructor(x, y) {
    Object.assign(this, {x, y})
  }
}
로그인 후 복사
로그인 후 복사
🎜매개변수가 하나만 있는 경우 Object.sign은 매개변수를 직접 반환합니다. 🎜
Object.assign(SomeClass.prototype, {
  someMethod(arg1, arg2) {
    ···
  },
  anotherMethod() {
    ···
  }
})

// 等同于下面的写法
SomeClass.prototype.someMethod = function (arg1, arg2) {
  ···
}
SomeClass.prototype.anotherMethod = function () {
  ···
}
로그인 후 복사
로그인 후 복사
🎜매개변수가 객체가 아닌 경우 먼저 객체로 변환된 후 반환됩니다. 🎜
function clone(origin) {
  return Object.assign({}, origin)
}
로그인 후 복사
로그인 후 복사
🎜undefine과 null은 객체로 변환할 수 없기 때문에 매개변수로 사용하면 오류가 발생합니다. 🎜
function clone(origin) {
  let originProto = Object.getPrototypeOf(origin)
  return Object.assign(Object.create(originProto), origin)
}
로그인 후 복사
로그인 후 복사
🎜비객체 매개변수가 원본 객체의 위치에 나타나는 경우(즉, 첫 번째 매개변수가 아닌 경우) 처리 규칙이 다릅니다. 먼저, 이러한 매개변수는 객체로 변환됩니다. 객체로 변환할 수 없으면 건너뜁니다. 즉, 첫 번째 매개변수에 정의되지 않음과 null이 없으면 오류가 보고되지 않습니다. 🎜
const merge = (target, ...sources) => Object.assign(target, ...sources)
로그인 후 복사
로그인 후 복사
🎜다른 유형의 값(예: 숫자 값, 문자열 및 부울 값)은 첫 번째 매개변수에 포함되지 않으며 오류가 보고되지 않습니다. 다만, 문자열이 배열 형태로 대상 객체에 복사된다는 점을 제외하면 다른 값은 아무런 영향을 미치지 않습니다. 🎜
const merge = (...sources) => Object.assign({}, ...sources)
로그인 후 복사
로그인 후 복사
🎜위 코드에서 v1, v2, v3은 각각 문자열, 부울값, 숫자값이므로 결과적으로 문자열만 (문자배열 형태로) 대상객체에 결합되며, 숫자 값과 부울 값은 무시됩니다. 이는 문자열 래퍼 개체만 열거 가능한 속성을 생성하기 때문입니다. 🎜
const DEFAULTS = {
  logLevel: 0,
  outputFormat: 'html'
}

function processContent(options) {
  options = Object.assign({}, DEFAULTS, options)
  console.log(options)
  // ...
}
로그인 후 복사
로그인 후 복사
🎜위 코드에서는 부울 값, 숫자 값, 문자열이 각각 해당 패키징 개체로 변환됩니다. 원래 값이 패키징 개체 [[PrimitiveValue]의 내부 속성보다 위에 있음을 알 수 있습니다. ]]. 이 속성은 Object.sign에 의해 복사되지 않습니다. 문자열 래퍼 개체만 열거 가능한 리터럴 속성을 생성하고 해당 속성은 복사됩니다.
🎜🎜Object.sign복사되는 속성은 소스 객체의 자체 속성만 복사되며(상속된 속성은 복사되지 않음), 열거할 수 없는 속성( 열거 가능: false) ). 🎜
const DEFAULTS = {
  url: {
    host: 'example.com',
    port: 7070
  },
}

processContent({ url: {port: 8000} })
// {
//   url: {port: 8000}
// }
로그인 후 복사
로그인 후 복사
🎜위 코드에서 Object.sign으로 복사할 객체에는 열거 불가능한 invisible 속성이 하나만 있고, 이 속성은 복사되지 않습니다. 🎜🎜속성 이름이 Symbol 값인 속성도 Object.sign에 의해 복사됩니다. 🎜rrreee🎜🎜Notes🎜🎜🎜🎜 (1) 얕은 복사🎜🎜🎜Object.sign 메소드는 얕은 복사를 구현하지 않습니다. 딥 카피. 즉, 소스 개체의 특정 속성 값이 개체인 경우 대상 개체의 복사본은 이 개체에 대한 참조를 얻습니다. 🎜rrreee🎜위 코드에서 소스 객체 obj1a 속성 값이 객체이고, Object.asset</에 의해 복사된 내용입니다. code>가 이 개체입니다. 이 개체에 대한 모든 변경 사항은 대상 개체에 반영됩니다. 🎜🎜🎜(2) 동일한 이름의 속성 대체🎜🎜🎜이러한 중첩 객체의 경우 동일한 이름의 속성이 발견되면 <code>Object.sign의 처리 방법은 대체하는 것입니다. , 추가하지 마세요. 🎜rrreee🎜위 코드에서 target 객체의 a 속성은 source<의 <code>a 속성으로 완전히 대체되었습니다. /code> 객체. { a: { b: 'hello', d: 'e' } }의 결과를 얻는 대신. 이는 일반적으로 개발자가 원하는 것이 아니며 특별한 주의가 필요합니다. 🎜🎜일부 함수 라이브러리는 전체 복사를 얻을 수 있는 Object.sign(예: Lodash_.defaultsDeep 메서드)의 사용자 정의 버전을 제공합니다. 병합. 🎜🎜(3) 배열 처리 Object.sign을 사용하여 배열을 처리할 수 있지만 배열은 객체로 처리됩니다. 🎜rrreee🎜위 코드에서 Object.sign은 배열을 속성 이름이 0, 1, 2인 객체로 처리하므로 소스 배열은 0<입니다. /code > 숫자 속성 <code>4는 대상 배열의 0 숫자 속성 1을 덮어씁니다. 🎜🎜🎜(4) 값 함수 처리🎜🎜🎜Object.sign은 값 복사만 가능합니다. 복사할 값이 값 함수인 경우 평가한 후 복사됩니다. 🎜rrreee🎜위 코드에서 source 객체의 foo 속성은 값 함수이고, Object.sign은 이 값을 복사하지 않습니다. 함수입니다. 값을 가져온 후에만 이 값이 복사됩니다. 🎜🎜🎜Object.sign 사용🎜🎜🎜Object.sign 메서드에는 다양한 용도가 있습니다. 🎜

(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: &#39;html&#39;
}

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: &#39;example.com&#39;,
    port: 7070
  },
}

processContent({ url: {port: 8000} })
// {
//   url: {port: 8000}
// }
로그인 후 복사
로그인 후 복사

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

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

위 내용은 es6 메소드를 할당합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

ES6에서 배열을 뒤집는 방법 ES6에서 배열을 뒤집는 방법 Oct 26, 2022 pm 06:19 PM

ES6에서는 배열 객체의 reverse() 메서드를 사용하여 배열 반전을 달성할 수 있습니다. 이 메서드는 배열의 요소 순서를 반대로 지정하여 마지막 요소를 먼저 배치하고 첫 번째 요소를 마지막에 배치하는 데 사용됩니다. .뒤집다()". reverse() 메서드는 원래 배열을 수정합니다. 수정하지 않으려면 확장 연산자 "..."와 함께 사용해야 하며 구문은 "[...array].reverse()입니다. ".

es6 또는 es7에 비동기가 있습니까? es6 또는 es7에 비동기가 있습니까? Jan 29, 2023 pm 05:36 PM

비동기는 es7입니다. async 및 wait는 ES7에 새로 추가된 기능이며 비동기 작업을 위한 솔루션입니다. async/await는 공동 모듈 및 생성기 기능을 위한 구문 설탕이라고 할 수 있으며, 더 명확한 의미로 js 비동기 코드를 해결합니다. 이름에서 알 수 있듯이 async는 "비동기"를 의미합니다. async는 async와 wait 사이에 엄격한 규칙이 있음을 선언하는 데 사용되며, wait는 비동기 함수로만 작성될 수 있습니다.

미니 프로그램이 es6을 es5로 변환해야 하는 이유는 무엇입니까? 미니 프로그램이 es6을 es5로 변환해야 하는 이유는 무엇입니까? Nov 21, 2022 pm 06:15 PM

브라우저 호환성을 위해. JS의 새로운 사양으로 ES6에는 새로운 구문과 API가 많이 추가되었습니다. 그러나 최신 브라우저는 ES6의 새로운 기능을 잘 지원하지 않으므로 ES6 코드를 ES5 코드로 변환해야 합니다. WeChat 웹 개발자 도구에서는 개발자의 ES6 구문 코드를 세 터미널 모두에서 잘 지원되는 ES5 코드로 변환하는 데 기본적으로 babel이 사용됩니다. 이를 통해 개발자는 프로젝트에서만 서로 다른 환경으로 인해 발생하는 개발 문제를 해결할 수 있습니다. "ES6에서 ES5로" 옵션.

es6의 두 배열에서 서로 다른 항목을 찾는 방법 es6의 두 배열에서 서로 다른 항목을 찾는 방법 Nov 01, 2022 pm 06:07 PM

단계: 1. "newA=new Set(a);newB=new Set(b);" 구문을 사용하여 두 배열을 각각 세트 유형으로 변환합니다. 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<array length;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 맵이 주문되었나요? Nov 03, 2022 pm 07:05 PM

지도가 주문되었습니다. ES6의 맵 유형은 많은 키-값 쌍을 저장하는 정렬된 목록입니다. 키 이름의 동등성은 "Objext.is()" 메소드를 호출하여 결정됩니다. , 따라서 숫자 5와 문자열 "5"는 두 가지 유형으로 판단되며 프로그램에서 두 개의 독립된 키로 나타날 수 있습니다.

See all articles