Kyle Simpson은 JavaScript(그룹)를 여전히 모른다는 것을 증명했습니다.

만약 네가 케일 심슨(Kyle Simpson)의 멋진 연속극 You Don't know JS을 읽은 적이 없다면, 나는 우선 네가 이것을 더 이상 읽지 말고 저것을 읽고 돌아오라고 격려할 것이다.이것은 6주가 걸릴 수 있지만, 괜찮아요.기다릴게요.
...
...
...
나는 네가 돌아오는 것을 보았다.너무 좋아요.자바스크립트 이제 알 것 같은데?확실해?가서 다시 읽어.기다릴게요.이 문장은 어디에도 보낼 수 없다.
...
...
...
이제 JS를 정말 잘 아시는 것 같은데?대단히 좋다가장 간단한 데이터 구조, 수조, 그리고 내가 그 책을 네 번 읽은 후에 몰랐던 일을 이야기합시다.

자바스크립트, 난 널 아는 줄 알았어...


우선, 나는 당신들에게 카일이 어디에서 이 성명을 발표했는지 알려주고 싶습니다.

just for clarity sake, this is what I find surprising...



지금, 나는 그 그림을 보면서 생각했다. "이것은 매우 일리가 있다. 그러나...왜 그것은 의미가 있는가?"
나는 왜 그것이 의미가 있는지 생각할수록 자바스크립트를 모른다는 것을 깨달았다.

우선 제작 진열에 대한 입문 지식입니다.


여러 가지 방법으로 JavaScript에서 배열을 생성할 수 있습니다.그것들은'데이터로 그것들을 실례화할 수도 있고 데이터를 사용하지 않을 수도 있다'에 해당한다.

데이터 실례화 사용


때때로 우리는 기존 데이터를 포함하는 그룹을 작성해야 한다.목록이 성명된 후에 실제로 바뀌기를 원하지 않을 때, 이렇게 하는 것은 결코 드물지 않다.두 가지 방법으로 이 그룹을 실례화할 수 있다.

배열 구조 함수 사용하기


const mistakes = new Array('my liberal arts degree', 'eating 15 slim jims')`
이것은 이상하게 여겨진다. 자바스크립트에서는 보통 나쁜 방법이다.나는 잠시 후에 원인을 설명할 것이다.

배열 문자 사용


const moreMistakes = [tequila', 'Michael Bay\'s TMNT movie'];
이것은 내가 우리 대다수 사람들이 집에서 사용하기를 바라는 더욱 흔히 볼 수 있는 방법이다.

데이터 실례화 없음


데이터를 한 데이터 구조에서 다른 데이터 구조로 이동하는 경우, 우리는 보통 빈 그룹을 설명하고 수정합니다.
가장 흔히 볼 수 있는 패턴은 빈 그룹을 선언하고 밀어넣는 것이다.
const moreFutureMistakes = [];

moreFutureMistakes.push('TMNT sequels')
하지만 당신이 그 사람이 되고 싶다면 당연히 수조 구조 함수를 사용할 수 있다.
const moreUnusualMistakes = new Array();

moreUnusualMistakes.push('what you\'re going to see next');

실례화 수조의 이상한 방식


나는 내가 야외에서 정말 이런 것을 본 적이 있다고 생각하지 않지만, 그것들은 줄곧 내 머릿속에 있다.하와이 5-0 주제가 같아.그곳에 앉아 있는 것 외에는 내 머릿속에 아무것도 하지 않았다.잊지 않을 거예요.
내가 C++ 클래스에서 기억하는 유일한 것은 수조에 크기가 있어야 한다는 것이다.왜 그런지 모르겠어요.왜 그런지 모르겠어요.(답: somethingSomething[memory])
따라서 실례화된 수조의 세 가지 이상한 방법은 수조의 크기를 미리 설정하는 것과 관련이 있다.
const superSizeMe = [];
superSizeMe.length = 3; // SURPRISE! Length is a setter

const preSized = new Array(3); // "This won't confuse anyone," said no one ever.

const commaSized= [,,,]; 

const isWeirdButTrue= (superSizeMe.length === preSized.length === commaSized.length);

Array 구조 함수를 사용하는 것이 왜 좋지 않은 방법으로 여겨지는지 알고 싶다면, 이제 알겠습니다.이것은 매개 변수를 하나만 주고 이 매개 변수가 정수라면 이런 크기의 그룹을 만들 수 있기 때문이다.따라서 수조 구조 함수는 숫자를 처리할 때 의외의 결과를 얻을 수 있다.
그리고 다른 어떤 방법도 최선의 실천과는 거리가 멀지 않다.이것들은 모두 일부 사람들의 이상한 방법이다. 그들은 자신의 이익에 대해 너무 궁금해하거나, 사기꾼 로기 신이 실제로 살고 프로그래밍 언어를 설계했는지 의심할 수도 있다.

이상한 실례화와 이상한 데이터 설정 방식이 이상한 결과를 초래할 수 있다는 것은 완전히 예상한 행동이다.


이제 우리는 다시 켈의 트위터로 돌아왔다. 그는 이것이 얼마나 이상한지 말했다.
[,,,3,4,,5].forEach(x=>console.log(x));
// 3
// 4
// 5
  • 알겠습니다. 쉼표 실례화 수조가 이상하다는 것에 동의합니다.
  • 좋아요.그것은 기록되었다...3,4,5
  • 이거 좋아요.모든 것이 다 좋다.추가 슬롯은 undefined이어야 하거나 사용할 수 없습니다.
    for (let x of [,,,3,4,,5]) { console.log(x); }
    // undefined 
    // undefined
    // undefined
    // 3
    // 4
    // undefined
    // 5
    
    들다

    그 이상한 실례화 그룹 중에는 무엇이 있습니까?


    다음 사전 크기의 스토리지를 살펴보겠습니다.
    const myRegrets = new Array(3);
    const moreRegrets = [,,,];
    const noRegerts = [];
    
    noRegerts.length = 3;
    
    만약 당신이 Firefox를 사용하고 있다면, 컨트롤러를 열고 이것을 실행하세요. 이 진열들을 보세요.
    다음을 볼 수 있습니다.
    Array(3) [undefined, undefined, undefined]
    

    그런데 이 수조는 정말 세 개의 정의되지 않은 원소로 가득 차 있습니까?


    아니오, 아니에요.이것이 바로 켈 샘슨이 적절하게 지적한 것이다.이러한 미리 크기 그룹을 순환하고 값을 기록하려고 하면 로그를 얻지 못합니다.
    const myRegrets = new Array(3);
    myRegrets.forEach((regret, regretIndex) => {
      console.log(regret, regretIndex);
    });
    
    
    for (regretName in myRegrets) {
     console.log(regretName, myRegrets[regretName]);
    }
    
    
    따라서 이곳의 첫 번째 중요한 수확은 크기를 미리 정하는 수조나 쉼표/홈으로 만든 수조가 이 홈에 값이 없다는 것이다.myRegrets은 3개의 undefined을 포함하는 수조가 아니다.세 개의 빈 공간이 있는 어레이입니다.
    이를 증명하기 위해 세 번째 슬롯에 실제 undefined을 추가합니다.
    const myRegrets = new Array(3);
    myRegrets[1] = undefined; 
    myRegrets.forEach((regret, regretIndex) => {
      console.log(regret, regretIndex);
    });
    
    
    for (regretName in myRegrets) {
     console.log(regretName, myRegrets[regretName]);
    }
    
    
    너는 일지가 있지 않니?딱 하나 맞죠?
    Double you 티셔츠 효과

    그룹에 정의되지 않은 은식과 현식이 있습니다.


    이것이 바로 내가 켈이 여기서 말한 것이라고 생각한다.
    이러한 이상한 배열 기법을 사용하여 크기를 미리 조정하거나 쉼표로 위치를 정할 때, 자바스크립트는 실제로 이 위치에 값을 넣지 않습니다.반대로 슬롯이 존재한다고...좀
    만약 존재하는 것이 있지만 가치가 없다면, 우리는 하나의 명칭을 가지고 있다.[,,undefined]
    const myRegrets = [,,undefined];
    const youWillRegretThis;
    
    myRegrets[0] === youWillRegretThis; // true, so very true
    
    그러나 나는'은밀한 미정의'라고 부른다. 왜냐하면 이것은 우리가 하는 어떤 순환에도 기록되지 않기 때문이다.undefined도 아니고 forEach도 아니며 for - in과 그의 파트너가 가치가 없는 홈을 기록할 수도 없다.i, e. 정의되지 않은 것을 포함한다.
    "암시적 정의되지 않음"을 좋아하지 않는 경우 이를 "미선언"이라고 할 수도 있습니다.

    명시적 매핑은 반드시 메모리를 차지해야 한다


    정의되지 않은 그룹을 사용하여 그룹을 순환할 때, 실제 메모리를 사용해야 합니다.이것이 바로 그것이 기록된 원인이다.
    const myRegrets = [,,undefined];
    
    myRegrets.forEach((regret, regretIndex) => {
      console.log(regret, regretIndex);
    });
    // will log 3
    
    for (regretName in myRegrets) {
     console.log(regretName, myRegrets[regretName]);
    }
    
    // will log 3
    
    얘들아, 이 점을 기억해라.배열에 대해 암시적 미정의와 현시적 미정의가 있습니다.
    어레이를 병합하지 않는 한 이것은 곧 걸림돌이 되지 않을 수도 있습니다.
    또는 undefined을 사용...
    기다리다for of ?
    맞다
    (Double you tee ay eff)

    for of는 유일하게 은식이나 현식이 정의되지 않은 순환 메커니즘에 무관심하다.


    다시 한 번 정의되지 않은 억제를 선언되지 않은 의미로 간주합니다.
    
    const myRegrets = [,,undefined];
    
    
    let regretCounter = 0;
    
    for (regret of myRegrets) {
     console.log(regret, regretCounter++)
    }
    // undefined 0
    // undefined 1
    // undefined 2
    
    왜 이 세 개를 기록해야 합니까?
    나는 확실하지 않지만, 나보다 훨씬 똑똑한 사람이 조사를 해야 한다는 이론이 있다.for - of 모델은 iteration protocol을 실현했다
    내 이론은 수조의 교체 프로토콜의 행위는 examples page에서 보듯이 비슷하다는 것이다.
    function makeIterator(array) {
        var nextIndex = 0;
    
        return {
           next: function() {
               return nextIndex < array.length ?
                   {value: array[nextIndex++], done: false} :
                   {done: true};
           }
        };
    }
    
    만약 for of이 백그라운드에서 유사한 것을 실현한다면, 그것은 속성이 아닌 색인에 따라 교체될 것이다.
    그렇다면 우리가 말한 존재지만 가치가 없는 것으로 돌아가자.그거 알아?우리의 오랜 친구.우리는 지금까지 그를 모임에 초대한 적이 없지만, 그는 여전히 나타났다.그를 기억하십니까?for - of나는 정말 그 녀석을 좋아하지 않게 되었다.그는 나를 미치게 만들었다.
    TL;박사
  • 수조의 undefined 속성은 "이 슬롯들은 가치가 있다"
  • 과 다르다
  • 수조는'은식 미정의'와'현식 미정의'가 있을 수 있습니다. 이것은 공간에 실제 값이 있는지에 달려 있습니다. 은식 미정의는'미성명'
  • 과 같습니다.
  • 만약 당신이 이상한 방식으로 수조를 만들지 않거나 수조로 이상한 일을 하지 않는다면, 당신은 이
  • 을 영원히 만나지 못할 것이다
  • 만약 당신이 사기꾼의 신 로기나 팬이고 이상한 방식으로 수조를 만들거나 이상한 방식으로 수조를 조작한다면 .length을 사용하여 순환할 때 가장 일치하는 결과를 얻어야 할 수도 있다.
  • JavaScript는 아침에 매우 의미가 있습니다.늦은 밤 아니야.

    [편집: 일부 보충]


    이 게시물의 일부 평론은 나로 하여금 연구와 테스트를 하게 하였는데, 어떤 사람들은 아마도 유용하다고 느낄 것이다.이 책은 이미 오랫동안 읽었기 때문에, 늦은 밤에 치즈를 많이 먹어서 욕실 노점에서 캠핑을 하거나, 규격에 대해 정말 흥미를 느끼지 않으면, 이 책을 뛰어넘을 수 있다.

    열거할 수 없는 그룹 속성만 설정되어 있습니까?


    나는 그렇게 생각하지 않는다.
    나는 ECMA specs을 훑어보고 이런 행위가 어느 곳에서든 정의되었는지 보았다.

    규범에 따르면 값 표현식의 그룹 요소를 정의하지 않았습니다.


    제12.2.5절 규정

    Whenever a comma in the element list is not preceded by an AssignmentExpression (i.e., a comma at the beginning or after another comma), the missing array element contributes to the length of the Array and increases the index of subsequent elements. Elided array elements are not defined.


    따라서 for of이 있으면 쉼표 뒤에 어떤 표현식이 없는 그룹 요소는 생략됩니다.
    또한 사양에 따르면 [,,'foo']은 패턴의 길이에 영향을 미치지 않습니다.
    또 주의해야 할 것은 값을 길이 이상으로 미루는 무작위 인덱스가 생략된 것으로 간주되는지 아직 발견하지 못했다는 것이다.예:
    const gapped = [];
    gapped[2] = "please mind the gap";
    

    규범은 그룹 요소가 생성되었음을 설명하지 않았지만 일일이 열거할 수 없는 것 같다


    22.1.1.3 섹션 8에서는 패턴을 생성하는 방법에 대해 설명합니다.

    Repeat, while k < numberOfArgs
    a. Let Pk be ! ToString(k)
    b. Let itemK be items[k]
    c. Let defineStatus be CreateDataProperty(array, Pk, itemK)
    d. Assert: defineStatus is true
    e. Increase k by 1

    ['foo',]은 키(인덱스), Pk은 값입니다.
    만약 자바스크립트 엔진이 이 알고리즘을 따른다면, 그 값과 상관없이 하나의 항목을 itemK 함수/방법/whatever에 전달할 것이다.
    문제는 "CreateDataProperty의 첫 번째 슬롯이 하나의 항목을 구성하는가? 12.2.5는 그렇지 않다. (내 생각에)

    그러나 이 가능하다, ~할 수 있다,...


    7.3.4절을 읽으면, 설명자에 있는 CreateDataProperty 속성의 논리나 조건을 제시하지 않습니다.3단계와 4단계에서 속성을 열거할 수 있도록 설정합니다.
    1. Let newDesc be the PropertyDescriptor { [[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]:true }.
    2. Return ? O.

    나는 아직 진열에 관한 모든 규범을 읽지 못했다.그러나 이것은 이러한 빈자리가 사실상 비어 있다는 것을 한층 더 보여 주는 것 같다.

    그럼 매거 연산자는요?이 빈 슬롯을 찾을 수 있습니까?


    아니오, 그럴 리가 없어요!
    const slotted = [,,'one'];
    let i = 0;
    
    while (i < slotted.length) {
     if (i++ in slotted) {
      console.log(`${i - 1} is in the array`);
     }
    }
    
    이것은 한 번만 기록되며, 컨트롤러에 in을 표시합니다.2 is in the array의 현식이 있지만 undefined은 세 번 기록됩니다.

    STL;SDR(여전히 너무 길고 읽지 않음)


    우선, 제가 여러분에게 일깨워 드리고자 하는 것은 자바스크립트보다 프랑스 존재주의에 대해 여러분과 이야기할 자격이 있다는 것입니다.이 모든 것이 틀릴 가능성이 상당히 높다.
    내가 규범에 대한 이해에 의하면'은식 미정의'는 수조에 값이 없는'홈'을 묘사하는 효과적인 방법이다.
    물론 진정한 홈은 하나도 없다.심지어 뿔호랑이를 잡아먹을 생각도 없다.값이 없는 슬롯이 없습니다.(# 존재주의)
    As Kyle Simpson points out const explicit = [undefined, undefined, 'one']undefined 사이에는 차이가 있지만 자바스크립트는 항상 당신에게 어떤 것이 무엇인지 알려주지 않습니다.
    이런'은밀한 미정의'는 마치 존재하는 문제와 같다. 우리는 오직 이렇게 많은 방식으로 존재와 허무를 묘사할 수 있을 뿐이다.
    const existentialCrisis= [,undefined,'Waiting for Godot']`;
    console.log(typeof existentialCrisis[1]); // undefined
    console.log(typeof existentialCrisis[0]); // undefined
    
    

    좋은 웹페이지 즐겨찾기