JavaScript의 물건을 나는 매우 이상하게 생각했는데, 결과적으로 일리가 있다는 것이 증명되었다

내가 처음으로 자바스크립트를 배우기 시작했을 때, 나는 그것에 적응하고, 그것을 내 마음에 맞게 그려내는 좋은 방법이 있을 것이다.코드에 대한 나의 논쟁은 기본적으로 팔꿈치 윤활유와 파이프 테이프일 뿐이다. 나는 많은 것들을 귀여운 작은 비밀로 분류하고, 자바스크립트가 그들의 개성적인 괴벽을 보존한다고 가정한다.

그러나 대다수 내가 완전히 미쳤다고 생각하는 것들은 당신이 구체적인 세부 사항에 깊이 파고들 때 확실히 의미가 있다는 사실이 증명된다.
내가 이 글을 쓴 것은 가장 좋아하는 예에 관한 것이다.다음은 올바른 코드 세그먼트 두 세그먼트입니다.
let uno = 1

function topple (arg){
    arg += 1 
}

topple(uno)

console.log(uno)
    => 1

let arr = []

function topple (arg){
    arg[0] = "toodledoo"
}

topple(arr)

console.log(arr)
    => ["toodledoo"]
초보 프로그래머로서 이것은 절대로 의미가 없다.어떤 경우, 매개 변수를 전달하고 변경을 실행하지만, 변수를 변경하지 않습니다.두 번째 상황에서 그것은 변수를 완전히 바꾸었다.나도 훈련소 졸업생이었기 때문에 당시에 나는 내가 깊이 연구할 수 있는 주제를 선택해야 했다. 이것은 그 중의 하나가 아니었다.나는 하나의 사실을 기억하기로 결정했다. 너는 수조와 산열을 바꿀 수 있지만, 어떤 이유로 문자열이나 숫자를 가리키는 변수에서 같은 기능을 얻을 수 없다.나는...어쩌면 너무 물결을 잘 따라다니는지 한동안 나는 그것을 어리석은 이상한 물건으로 여기고 떠났다.
나는 더 많은 시간과 더 많은 자유를 가지고 흥미로운 화제를 탐색하기 때문에 코드에 관한 매우 재미있는 일을 발견했다.
먼저, JavaScript의 모든 코드에는 제한된 유형이 있다는 것을 알게 되었습니다.모두 다음과 같습니다.
  • 문자열
  • 번호
  • 부울 값
  • 객체
  • 기능
  • 정의되지 않음
  • 비어 있음
  • 기호
  • Bigint
  • 이렇게네가 만지고, 본 모든 것, 그리고 잘못된 정보로 뺨을 맞은 것 중 하나가 될 것이다.상술한 이상한 점을 설명하기 위해서 나는 단지 NumbersObjects만 이야기하고 싶다.
    계속하기 전에 정의Objects가 가장 중요하다. 왜냐하면 이것은 많은 다른 의미가 있을 것이라고 생각하기 때문이다.MDN Docs는 JavaScript의 기본 프레임에 대해 다음과 같이 정의합니다Object.

    In computer science, an object is a value in memory which is possibly referenced by an identifier.


    이것은 너무 쓸모가 없다.이게 도대체 무슨 뜻이야?"JavaScript의 모든 것이 하나의 대상이라는 것을 다른 곳에서 들은 적이 있을 것이다. 나는 이것이 더욱 가깝다고 생각한다.이것은 거의 진짜다.수조, 산열, 정규 표현식, 이것들은 모두 대상이다.중요한 것은 Objects는 가변적이다.변덕이 심하다.산열과 수조는 그 내용을 끊임없이 변경할 수 있다.
    JS에는 objects가 아니라 numbers가 그 중 하나다.Numbers JS에서는'원어'라고 불리는 특수한 것으로 여겨진다원어는 변할 수 없다.너는 1의 값을 바꿀 수 있니?생각해 봐, 1+5를 더하면...1 이 더 이상 1 이 아닌가요?아니오, 1은 영원히 존재할 것입니다. 원시 상태에서 변하지 않습니다.
    그래서 이것은 우리로 하여금 우리의 예로 돌아가게 한다.첫 번째 예를 자세히 살펴보겠습니다.
    let uno = 1
    
    function topple (arg){
        arg += 1 
    }
    
    topple(uno)
    
    console.log(uno)
        => 1
    
    첫 번째 단계: uno라는 변수를 설정하고 이 변수는 원어number1을 가리킨다.
    2단계: 매개 변수를 받아들이는 함수를 정의하고 함수체에서 이 매개 변수를 영구적으로 1씩 증가시킨다.
    3단계: 함수를 호출합니다.그것을 우리의 uno 변수에 건네주시오.이 단계는 비밀 마법이 발생하는 곳인데, 나는 이전에 이해하지 못했다."hand it a variable"같은 말을 했지만 JavaScript에서 어떤 것도 변수로 사용할 수 없다는 것을 깨닫지 못했습니다.너는 그런 미친 소리를 들었니?당신의 생명 중 몇 년 동안, 당신은 코드에서 변수를 사용하여 정보를 전달한다고 생각해 왔다. 이것은 완전히 거짓말이다.JavaScript에서는 객체에 변수를 전달할 수 없습니다.
    이것은 변수가 즉시 계산되기 때문이다.세 번째 단계에서, 우리는 이 함수에 uno라는 어떤 것도 주지 않고, 작은 수수께끼를 주었다. 자바스크립트는 매개 변수에서 즉석에서 해결할 것이다.이것은 uno 반환 소스 코드를 따라 우리가 그것을 지향 숫자 1로 설정한 것을 발견했고, 실제로는 숫자 1을 함수체에 전달했을 뿐이다.우리의 변수가 함수 반대편에서 변하지 않는 이유는 우리 몸이 변수를 본 적이 없거나 접촉한 적이 없기 때문이다.
    네.지금, 이것은 매우 멋있다. 자바스크립트의 비밀을 실시간으로 볼 수 있다는 것은 매우 흥분된다. 만약 내가 인간의 뼈와 힘줄이 살아있는 사람의 피부 아래에서 완벽한 선명도로 상호작용하는 것을 볼 수 있다면, 나는 이런 느낌을 느낄 수 있을 것이라고 생각한다.나는 외과 의사가 이런 느낌을 가지고 있는지 알고 싶다.
    그러나 우리 손에는 또 다른 수수께끼가 있다. 첫 번째 예가 변수를 바꿀 수 없다면 왜 하느님의 녹색 지구에서 두 번째, 거의 같은 예에서 변수를 바꿀 수 있겠는가?
    우리가 가변항과 불가변항의 차이에 대해 토론한 거 기억나?우리가 전에 말한 바와 같이 오직 하나뿐이다.너는 숫자 1을 바꿀 수 없다. 언제든지 그것을 인용하면, 너는 항상 같은 숫자 1을 가리킨다.가변적인 증상 중 하나는 다중성을 지닌다.진열은 바뀔 수 있기 때문에, 컴퓨터 메모리에 존재하는 여러 가지 실례가 있을 수 있다.브라우저 콘솔에서 간단한 테스트를 실행하면 이 점을 잘 알 수 있습니다.먼저 다음 코드를 실행합니다.
    for(let i=0;i<10;i++){
         console.log(1)
    }
    
    결과에 주의하다.이제 화면을 지우지 말고 다음 코드를 실행하십시오.
    for(let i=0;i<10;i++){
         console.log([])
    }
    
    첫 번째 숫자 1의 왼쪽에 작은 10이 있는 것을 보실 수 있습니다. 이것은 이 숫자가 10번 연속으로 기록되었음을 나타냅니다.다음 거 왜?동업자가 아닌 10개의 스토리지에 표시되는 이유는 무엇입니까?
    그래, 그것은 어떤 일도 반복하지 않았다.모두 다른 패턴입니다.
    멋있다. 그래서 너는 내가 말하고자 하는 내용을 이미 준비했을지도 모르지만, 그것을 완성해도 무방하다.우리는 첫 번째 예처럼 두 번째 예를 깊이 연구합시다.
    let arr = []
    
    function topple (arg){
        arg[0] = "toodledoo"
    }
    
    topple(arr)
    
    console.log(arr)
        => ["toodledoo"]
    
    첫 번째 단계: arr라는 변수를 설정합니다. 이것은 새로운 object를 가리킵니다.
    두 번째 단계: 수조를 받아들이는 함수를 정의하고 함수체에 "toodledoo"를 영구적으로 추가합니다.
    3단계: 함수를 호출합니다.그것을 우리의 arr 변수에 건네주시오.
    하지만!우리가 알고 있는 바와 같이 JS 중 어느 곳에서도 변수를 전달할 수 없다.따라서 arr는 즉시 계산되고 자바스크립트는 수조 자체를 함수체에 전달한다.이것이 바로 이 모든 것들이 한데 결합된 곳이다.
    하나의 인코딩 항목에 여러 개의 그룹이 있을 수 있고, 각각의 그룹이 메모리에 있는 위치가 다르기 때문에, 함수가 주어진 그룹에'toodledoo '를 추가할 때 실제 컴퓨터의 값이 바뀔 수 있습니다.따라서 우리가 변수를 다시 검사할 때, 새로운 그룹을 가져오려고 하지 않고, 메모리에 저장된 그룹의 위치로 돌아가며, 이 특정한 사례가 변경된 것을 발견합니다.
    요컨대, 만약 당신이 함수를 숫자 1에 전달한다면, 그것은 이 숫자를 바꿀 수 없을 것이다.10000개의 변수를 숫자 1로 설정해도, 수학을 흐트러뜨릴 수 있는 사람은 없기 때문에 메모리의 같은 위치를 가리킨다.그러나 함수 anobject을 전달하면 모든 새 대상은 메모리의 다른 위치를 가리키기 때문에 이 그룹을 변경하면 나중에 변경 사항을 볼 수 있습니다.
    내가 말한 대로 매혹적이다.마지막 한 가지.이 코드도 정확합니다.
    let uno = 1
    
    function topple (){
        uno += 1 
    }
    
    topple()
    
    console.log(uno)
        => 2
    
    왜 그런 것 같아요?
    단 아브라모프와 그의 멋진 시사 통신에 감사드리며, 제가 더욱 밝은 프로그래머가 되도록 도와주었습니다.

    좋은 웹페이지 즐겨찾기