koans

안윤경·2022년 7월 13일
0

과제

목록 보기
6/20

2022.7.13 koans과제

  1. introduction
    expect함수를 사용

    expect(테스트하는값).기대하는조건 //to.be.true or false
    expect('테스트하는값').to.equal('기대하는값');.equal은 두 값이 타입까지 엄격하게 같은지 검사한다

    2.types-part1
    비교연산자 '=='는 두 값의 일치 여부를 느슨하게 검사(loose equality)합니다. 우리는 '==='를 쓰는것이 옳다!

    it('expect의 전달인자로 들어간 표현식의 평가(evaluation) 결과를 예측해 봅니다.', function () {
       expect(1 + '1').to.equal('11');
     });
    
     it('expect의 전달인자로 들어간 표현식의 평가(evaluation) 결과를 예측해 봅니다.', function () {
       expect(123 - '1').to.equal(122); //숫자처럼 문자인데도 불과하고 뺄셈으로 된다
     });
    
     it('expect의 전달인자로 들어간 표현식의 평가(evaluation) 결과를 예측해 봅니다.', function () {
       expect(1 + true).to.equal(2); //true가 1로 되어 합이 2가 된다
     });
    
     it('expect의 전달인자로 들어간 표현식의 평가(evaluation) 결과를 예측해 봅니다.', function () {
       expect('1' + true).to.equal('1true');
     }); //둘다 문자열이라 붙어서 나온다

    3.letconst
    const로 선언된 변수에는 재할당이 금지!재선언도 금지된다
    "const"로 선언된 객체,배열의 경우 새로운 요소를 추가하거나 삭제할 수 있습니다"

const obj = { x: 1 };
    expect(obj.x).to.equal(1);

    delete obj.x;
    expect(obj.x).to.equal(undefined);

4.scope --*중요

let funcExpressed = 'to be a function';

    expect(typeof funcDeclared).to.equal('function');
    expect(typeof funcExpressed).to.equal('string');
    
     function funcDeclared() {
      return 'this is a function declaration';
    }

    funcExpressed = function () {
      return 'this is a function expression';
    };

js의 호이스팅이란?

함수 안에 있는 선언들을 모두 끌어올려서 해당 함수 유효 범위의 최상단에 선언하는 것을 말한다.
var 변수 선언과 함수선언문에서만 호이스팅이 일어난다.
var 변수/함수의 선언만 위로 끌어 올려지며, 할당은 끌어 올려지지 않는다.
let/const 변수 선언과 함수표현식에서는 호이스팅이 발생하지 않는다.

그러므로 funcExpressed는 위에 let으로 선언이 되어있기에 밑에 함수로 호출이 안되는 것이다

it('lexical scope와 closure에 대해 다시 확인합니다.', function () {
    let age = 27;
    let name = 'jin';
    let height = 179;

    function outerFn() {
      let age = 24;
      name = 'jimin';
      let height = 178;

      function innerFn() {
        age = 26;
        let name = 'suga';
        return height;
      }

      innerFn();

      expect(age).to.equal(26);
      expect(name).to.equal('jimin');//이거 중요! 그니까 위에서 바로 innerFn()이 실행되는 것이 아니고 밑에 const innerFn = outerFn();까지 간 후 그다음에 outer함수를 읽고 하는 것이기 때문에 name은 jimin이 되는 것이다.

      return innerFn;
    }

    const innerFn = outerFn();

    expect(age).to.equal(27);//age는 전역변수를 받아온다
    expect(name).to.equal('jimin');
    expect(innerFn()).to.equal(178);//inner안의 리턴값이 outer에 있기때문에 178이된다
  });
});

6.typr-part2
원시 자료형을 변수에 할당할 경우, 값 자체의 복사가 일어납니다.

  const nums1 = [1, 2, 3];
  const nums2 = [1, 2, 3];
  expect(nums1 === nums2).to.equal(false);//주소값이 다르기 때문!
  ```

7.array

const emptyArr = [];
expect(typeof emptyArr === 'array').to.equal(false);//object가 나옴
expect(emptyArr.length).to.equal(0);
만약 arr === []이렇게 하면 빈배열과 arr의 주소가 달라서 오류가 발생함!

    
const poppedValue = arr.pop();
expect(poppedValue).to.equal(3);//
expect(arr).to.deep.equal([1,2]);

>만약 pop이나 shift를 사용시 값은 지운 그 값자체가 값이된다 위에 3을 pop으로 지웠더니 그 값이 3이된 것처럼 말이다. 반대로 unshift나 push를 사용하면 이값은 이값이 더해진 길이가 값이다 
    
  expect(arr.slice(3, 0)).to.deep.equal([]);
   expect(arr.slice(2, 2)).to.deep.equal([]);
   이값에서 시작부분이 더크거나 둘의 값이 같으면 빈문자열로 반환된다.
   
   얕은복사 vs깊은복사???이부분 다시
...이부분에서 
num c = { }..
num d = c.slice().. 일때
d는 c가 복사되것이므로 주소값을 각각 가지고 있음 그러나 num c ={ㅁ,ㄴ,ㄹ...[주소값2]}처럼 배열이나 객체가 들어가있으면 새로운 주소값을 만드는데 이때 주소값은 d도 사용한다 즉 만약 c나 d가 주소값이 다르니 각각 안에있는 속성을 바꾸거나 사용하면 각각의 주소값에서 변하므로 c가 고쳐져도 d는 복제된거라 그대로 남는데 만약 안에있는 주소값2가 바뀐다면 이건 둘다 공유하고 있으므로 둘다 바뀐다!!!!이부분 다시하자

객체에서 key.length =>0~이 나옴
그러나 객체.length하면 undefined가나온다

이이후에 확장하고 분해는 다시!
profile
프론트엔드 개발자 안윤경입니다

0개의 댓글