JavaScript의 취약한 부분과 그 작업 원리는 무엇입니까

WeakSet은 JavaScript 컬렉션에서 가장 새로운 객체 중 하나입니다.이 시리즈는 좀 심오해 보인다.많은 JavaScript 개발자들은 이에 대해 잘 모르거나 전혀 모른다.이 강좌에서는 JavaScript의 WeakSet이 무엇인지, 어떻게 작동하는지, 그리고 언제 유용할지 알 수 있습니다.

간단하게 소개를 해드릴게요.
약집은 Sets과 매우 비슷하다.만약 네가 세트에 익숙하지 않다면 걱정하지 마라.너는 사전에 집합을 알 필요가 없다.약한 부분으로 돌아가다.그것들은 모두 소장품이다.이 집합을 사용해서 값을 저장할 수 있습니다.이 점을 이해하는 데 도움을 줄 수 있는 것이 하나 있다. 바로 arrays이다.
수조는 약집합과 집합처럼 집합이다.숫자와 문자열부터 브리 값과 대상, 심지어 집합까지 다양한 값을 저장할 수 있습니다.이것이 바로 유사성이 끝나고 차이가 나타나기 시작하는 부분이다.하나의 차이점은 수조와 달리 집합은 유일한 값만 포함할 수 있다는 것이다.
취약한 부분에 대해서는 이런 차이가 더 크다.비고정 세트에는 객체만 포함할 수 있습니다.객체 이외의 내용을 추가하려고 하면 JavaScript에서 오류가 발생합니다.이 대상들도 반드시 유일해야 한다.객체를 두 번 추가하려고 하면 두 번째 객체가 추가되지 않습니다.
약집의 또 다른 중요한 부분은 명칭의'약'부분이다.약한 부분은 약한 집합에 저장된 모든 대상이 약하게 보유되었다는 것을 의미한다.따라서 WeakSet에 저장된 대상에 대한 모든 다른 인용을 삭제하면 이 대상은 garbage collected이 됩니다.
객체가 메모리에서 해제됩니다.그러나 이는 대상이 즉각 석방된다는 뜻은 아니다.그것은 쓰레기 수집으로만 표시될 것이다.이런 상황이 발생할 때만 그것은 석방될 수 있다.집합과 약한 집합, 그리고 수조 사이에는 또 다른 중요한 차이가 있다.약점은 용납할 수 없다.
항목을 추가하거나 기존 항목을 삭제할 수 있습니다.또한 WeakSet에 특정 항목이 있는지 확인할 수 있습니다.그러나, 너는 순환으로 그것을 교체할 수 없다.size 속성도 없어요. 특정한 약점 중 몇 개의 아이템이 집중되어 있는지 알려줄 수 있어요.이제 새로운 약점집을 만드는 방법을 살펴봅시다.

새 취약점 세트 만들기
새로운 약점 집합을 만들고 싶을 때, WeakSet() 구조 함수를 사용해야 합니다.이렇게 하면 새 WeakSet이 만들어지고 값을 저장할 수 있습니다.WeakSet() 구조 함수를 사용할 수 있는 두 가지 방법이 있다.우선 빈 WeakSet을 만들고 나중에 값을 추가할 수 있습니다.
그리고 너는 다른 일을 할 수 있다.iterable를 사용하여 새 WeakSet을 만들 때 값이 있는iterable를 매개 변수로 구조 함수에 전달할 수 있습니다."iterable"라는 단어를 들었을 때 가치관의 집합을 상상해 보세요.이 예에서iterable는 하나의 그룹입니다.그래서 대상을 포함하는 그룹을 전송합니다.
// Creating new WeakSets no.1: Empty
const myWeakSet = new WeakSet()

// Creating new WeakSets no.2: Passing some objects
const myWeakSet = new WeakSet([myObj1, myObj1])

약집법
우리는 이미 weakset이 네가 무엇을 할 수 있도록 허락하는지에 관한 몇 가지 문제를 토론했다.항목을 weakset에 추가하거나 삭제할 수 있습니다.일부 WeakSet에 특정 항목이 있는지 확인할 수도 있습니다.모든 임무에는 특정한 방법이 있다.어디 보자.

비고정 세트에 새 객체 추가
약집에 대상을 추가하고 싶을 때 두 가지를 할 수 있다.우선, 새로운 WeakSet을 만들 때, 이 대상들을 WeakSet() 구조 함수에 전달할 수 있다.그 다음에 나중에 add() 방법으로 대상을 추가할 수 있습니다.이 방법은 매개 변수, 즉 저장할 대상을 받아들인다.
이것은 네가 반드시 기억해야 할 것이다.그것은 실제로는 한 대상만 받아들이는 것이지 더 많은 대상이 아니다.여러 객체를 가져오려고 하면 첫 번째 객체만 WeakSet에 추가됩니다.나머지는 무시됩니다.따라서 여러 객체를 추가하려면 각 객체에 대해 여러 add() 메서드를 사용합니다.
// Adding items no.1: via constructor
// Create some objects
let myObj1 = { name: 'Toby' }

let myObj2 = { name: 'Christine' }

// Create new WeakSet
const myWeakSet = new WeakSet([myObj1, myObj2])


// Adding items no.1: with add() method
// Create some objects
let myObj1 = { name: 'Rafael' }

let myObj2 = { name: 'Victoria' }

// Create new WeakSet
const myWeakSet = new WeakSet()

// Add objects
myWeakSet.add(myObj1)
myWeakSet.add(myObj2)


// This will not work:
// Create some objects
let myObj1 = { name: 'Jack' }

let myObj2 = { name: 'Julie' }

// Create new WeakSet
const myWeakSet = new WeakSet()

// Add objects
// The "myObj2" will not be added to the set
myWeakSet.add(myObj1, myObj2)

비고정 세트에서 객체 제거
weakset에서 대상을 삭제하는 것은 간단하면서도 직접적입니다.어떤 물체를 제거하고 싶을 때, 너는 한 가지 방법을 사용할 수 있다.이 방법은 delete()입니다.이 방법은 삭제할 대상의 이름을 매개 변수로 받아들인다.add()과 유사하며 한 대상에도 적용된다.
따라서 여러 개의 대상을 삭제하려면 각각 하나의 delete() 방법을 사용해야 한다.이 방법을 사용하면 항상 boolean으로 돌아갑니다.객체를 삭제하면 true이 반환됩니다.객체가 WeakSet에 저장되지 않으면 false으로 돌아갑니다.
// Create some objects
let myObj1 = {
  language: 'JavaScript'
}

let myObj2 = {
  language: 'TypeScript'
}

let myObj3 = {
  language: 'Python'
}

// Create new WeakSet
// and add first two objects
const myWeakSet = new WeakSet([myObj1, myObj2])

// Remove "myObj1" object
myWeakSet.delete(myObj1)
// true

// Remove "myObj2" object
myWeakSet.delete(myObj2)
// true

// Try to remove "myObj3" object
myWeakSet.delete(myObj3)
// false
// Object "myObj3" is not stored in myWeakSet


// This will not work:
let myObj1 = {
  language: 'JavaScript'
}

let myObj2 = {
  language: 'TypeScript'
}

// Create new WeakSet
const myWeakSet = new WeakSet([myObj1, myObj2])

// Try to remove two objects at the same time
myWeakSet.delete(myObj1, myObj2)
// true
// It will successfully remove "myObj1",
// but ignore "myObj2"

약한 세트에 개체가 있는지 확인
weakset은 이식할 수 없고 size 속성이 없습니다.특정 대상이 취약한 부분에 존재하는지 알기 어려울 것이다.다행히도 답을 찾을 수 있는 방법이 있다.이 방법은 has()입니다.delete()add()과 유사하며 매개 변수를 받아들인다.
이 매개 변수는 검사할 대상의 이름입니다.이 방법을 사용할 때, 그것은 delete()과 같은 브리 값을 되돌려줍니다.약한 집중 대상이 존재하면 true, 대상이 존재하지 않으면 false으로 돌아간다.
// Create some objects
let myObj1 = {
  language: 'React'
}

let myObj2 = {
  language: 'Vue.js'
}

let myObj3 = {
  language: 'Angular'
}

// Create new WeakSet
// and add first two objects
const myWeakSet = new WeakSet([myObj1, myObj2])

// Check if "myObj1" exists in "myWeakSet"
myWeakSet.has(myObj1)
// Output:
// true

// Check if "myObj2" exists in "myWeakSet"
myWeakSet.has(myObj2)
// Output:
// true

// Check if "myObj3" exists in "myWeakSet"
myWeakSet.has(myObj3)
// Output:
// false

반복 및 크기 속성 없음
알다시피 약집과 집합 사이의 차이는 약집은 편집할 수 없는 것이다.또 다른 차이점은 weakset에 size 속성이 없다는 것이다.이것은 이치에 맞지 않을 수도 있다.만약 네가 자세히 생각해 본다면, 이것은 확실히 일리가 있는 것이다.우리가 논의한 바와 같이 약집중의 모든 대상은 약보유이다.
만약 이 대상 중 하나가 모든 인용을 잃어버렸다면, 그것은 쓰레기 수집으로 표시될 것이다.쓰레기 수집이 발생할 때, 이 대상은 메모리에서 방출될 것이다.없어졌어요.쓰레기 수집의 장점은 언제든지 일할 수 있다는 데 있다.너는 그것이 언제 발생할지 예측할 수 없다.
목표가 있다고 가정해 봐.비고정 세트에 객체를 추가합니다.코드의 다른 부분에서 이 대상을 삭제하면?정답은 상황을 보고 정하는 것이다.이것은 쓰레기 수집이 운행할 시간이 있느냐 없느냐에 달려 있다.만약 그것이 이렇게 한다면 대상은 메모리에서 방출되고, 그것도 약한 부분에서 사라질 것이다.size을 사용하거나 WeakSet에서 교체할 수 있다고 상상해 봅시다.쓰레기를 수집하기 전에 교체하면 결과가 나온다.쓰레기 수집 후 교체하면 결과가 달라진다.size과 같습니다.너는 두 개의 다른 숫자를 얻을 수 있을 것이다.
이것이 바로 weakset은 이식할 수 없고 size이 없는 이유입니다.이 두 사람은 미덥지 못하다.그들은 지금 너에게 한 가지 일을 알려줄 것이다. 1초 후에 너에게 완전히 다른 일을 알려줄 것이다.이것은 마치 주사위를 던지는 것과 같다.

나하스
나는 네가 왜iterable Weakset과 size 속성이 의미가 없는지 이해하길 바란다.그럼 has() 방법은요?has()은 별개의 일이다.이 방법이 어떻게 작동하는지, 아니면 그것을 어떻게 사용하는지 생각해 보세요.그것을 사용할 때, 검사하고 싶은 대상의 이름을 입력해야 합니다.
이 명칭, 변수 이름, 인용입니다.네가 들어왔을 때, 너는 대상 자체에 들어오지 않을 것이다.반대로 너는 그 인용을 전달해야 한다.Reference는 변수의 메모리 주소입니다.이것은 변수를 저장하는 메모리 위치를 가리키는 지침이다.
쓰레기 수집으로 돌아가다.쓰레기 수집은 대상의 모든 인용이 삭제되었을 때만 수집됩니다.그렇지 않으면 그들만 남는다.has() 방법을 사용하여 대상에 대한 인용을 전달할 때, 이것은 최소한 대상에 대한 인용이 있다는 것을 의미한다.
이것은 이 대상이 쓰레기로 수집되지 않았다는 것을 의미한다.그것은 여전히 존재한다.따라서 has() 방법을 사용하면 신뢰할 수 있는 정보를 얻을 수 있습니다.이것이 바로 has() 방법은 의미가 있지만 교체와 size 속성은 의미가 없다. has()은 기존 대상을 인용해야 한다.교체와 size 속성이 없습니다.

약집용례
그것들의 작업 방식 때문에,weakset은 자주 사용하지 않는다.값, 대상을 저장하거나 저장하지 않으려면, 그룹이나 Map이 더 좋은 선택입니다.weakset에서 사용할 수 있는 장면은 기존 대상을 추적하는 것입니다.이 대상에 대한 인용을 그룹이나 지도에 저장할 수 있습니다.
만약 이 대상에 대한 모든 다른 인용이 사라진다면, 이것은 쓰레기 수집이 이 대상들 중 어느 하나를 수집하는 것을 막을 것이다.이 대상들은 메모리에 보존되어 메모리 유출을 초래할 수 있습니다.이 대상들을 weakset으로 저장하면 더 이상 이 문제가 없습니다.
간단한 예는 로그인 시스템이다.온라인 사용자 (대상) 를 WeakSet에 추가해서 그들을 추적할 수 있습니다.이들 사용자 중 한 명이 떠나면 해당 객체가 삭제됩니다.잠시 후 has() 방법을 사용하여 특정 사용자가 여전히 온라인인지, 적당한 대상이 있는지 확인할 수 있습니다.
// Create three users that are logged into a system
let user1 = { username: 'joey' }
let user2 = { username: 'jack15' }
let user3 = { username: 'skylar' }

// Create new WeakSet
const loggedUsers = new WeakSet()

// Add "user1" to "loggedUsers"
loggedUsers.add(user1)

// Add "user2" to "loggedUsers"
loggedUsers.add(user2)

// Add "user3" to "loggedUsers"
loggedUsers.add(user3)

// Check if all users are present
// loggedUsers.has(user1)
// // Output:
// // true

// loggedUsers.has(user2)
// // Output:
// // true

// loggedUsers.has(user3)
// // Output:
// // true

// Let "user2" and "user3" log out
user2 = null
user3 = null

// Check if all users are still logged in
loggedUsers.has(user1)
// Output:
// true

loggedUsers.has(user2)
// Output:
// false

loggedUsers.has(user3)
// Output:
// false

요약: JavaScript의 취약한 부분이 무엇인지, 그리고 그것이 어떻게 작동하는지
WeakSet은 자주 사용하지 않을 수 있는 기능 중 하나입니다.그러나 이것은 그것이 완전히 쓸모가 없다는 것을 의미하지는 않는다.사실은 그렇지 않다.어떤 면에서는 다른 기능보다 더 잘 할 수 있다.나는 이 강좌가 당신이 취약한 부분이 무엇인지, 그들이 어떻게 일을 하는지, 그리고 언제 편리할지 이해하는 데 도움을 줄 수 있기를 바랍니다.

좋은 웹페이지 즐겨찾기