JavaScript 1 다시 배우기(지속적으로 업데이트됨)

1. 데이터 유형

기본 값 유형 "값 유형/기본 데이터 유형"
숫자 숫자: NaN(유효한 숫자가 아님) 무한대(무한대 값)
문자열 문자열
boolean Boolean
null null 객체 포인터
정의되지 않음 정의되지 않음
기호 고유 값
bigint 큰 숫자
객체 유형 "참조 데이터 유형"

  • 표준 일반 물체 물체
  • 표준 특수 객체 Array, RegExp, Date, Math, Error, ArrayBuffer, DataView, Set Map...
  • 비표준 특수 객체 Number, String, Boolean, Symbol, BigInt... 생성자를 기반으로 생성된 원래 값 객체 유형의 형식 정보 또는 Object, 해당 유형은 객체 유형에 속합니다(Symbol 및 BigInt는 new를 통해 생성할 수 없음) )
  • 호출 가능/실행 가능 개체 "함수" 함수(호출 메서드 구현)
	if(NaN === NaN){
    
    
	//不能基于"是否等于NaN"来检测值是否为有效数字
	}
	isNaN([value])//:不论[value]啥类型,默认隐式转换为数字类型 Number([value]), 再校验是否为有效数字,如果是有效数字,返回false
	Object.is(NaN,NaN)//:true [不兼容IE(Edge除外)]

기호 작은 예
여기에 이미지 설명을 삽입하세요.
bigint
여기에 이미지 설명을 삽입하세요.

2. 데이터 유형 감지(typeof)

다음은 일반적인 데이터 타입 검출 방법으로 현재는 typeof에 대해서만 설명하고 나머지는 추후 작성하도록 하겠습니다.
여기에 이미지 설명을 삽입하세요.

typeof는 데이터 유형을 감지합니다.

감지 유형 유형

  • typeof[값]: 값이 속한 유형의 문자열을 반환합니다(예: "숫자" / "문자열").
  • null을 감지하고 객체를 반환할 수 없습니다.
  • 函数화살표 함수, 생성자, 생성자 함수, 일반 함수를 반환하는 호출 가능한 개체를 제외하고 “function"모두 함수 유형을 반환하고, 다른 모든 개체 데이터 값은 Object를 반환합니다.
  • 선언되지 않은 변수를 감지하면 오류를 보고하지 않고 정의되지 않은 값을 반환합니다.
  • Typeof는 C++에서 내부적으로 제공하는 메소드인 GetValue(val)를 사용하여 감지하며, 저장된 바이너리에 따라 감지됩니다.

typeof는 바이너리로 감지됩니다.

  • Object: Object는 모두 000으로 시작하고 null은 0000이므로 Object함수로 감지되며
    내부적으로 호출이 구현되어 있으므로 함수를 반환한다.
  • 널:0000
  • 정의되지 않음: -2^30
  • 번호: 정수 1 부동 소수점 번호 010
  • 문자열: 100
  • 부울: 110
    typeof는 데이터 유형을 매우 빠르게 감지하고 기본 값 유형(null 제외)을 매우 정확하게 감지합니다.

데이터 구조

여기에 이미지 설명을 삽입하세요.

배열 구조

여기에 이미지 설명을 삽입하세요.

스택 구조(선입, 후출), 스택 푸시 및 팝핑이 동일한 끝에서 작동

class Stack {
    
    
    // => this.container=[];
    container = [];
    enter(item) {
    
    // 进栈
        this.container.push(item);
    }
    leave() {
    
     // 出栈
        return this.container.pop();
    }
    size() {
    
     // 长度
        return this.container.length;
    }
    value() {
    
    // 内容
        return this.container.slice(0);
    }
}
let sk1 = new Stack;
sk1.enter(10);
sk1.enter(20);
sk1.enter(30);
console.log(sk1.leave())

최대 베이스와 최소 베이스는 각각 36과 2입니다.
브라우저는 일반적으로 js에 작성된 숫자를 10진수로 간주합니다.
0x로 시작하면 브라우저는 이를 16진수 값으로 인식하고 이를 10진수로 변경합니다. 결과는 0x100=>256 입니다. 숫자는
0으로 시작하고, 브라우저는 이것이 8진수 값임을 인식하고 이를 10진수 값(012 => 10)으로 변경합니다.

빠른 연습: 십진수를 이진수로 변환

  1. 10.toString(2) //toString은 Number 프로토타입의 메소드입니다.
  2. Number의 프로토타입에 숫자를 추가하는 자신만의 방법을 구현하세요.
Number.prototype.decimal2binary = function decimal2binary() {
    
    
    // this->new Number(28)  decimal->28
    let decimal = +this;
    if (/\./.test(decimal)) {
    
    
        // 包含小数
        throw new RangeError('处理的数字必须是整数');
    }
    // 整数
    let sk = new Stack;
    if (decimal === 0) return '0';
    while (decimal > 0) {
    
    
        sk.enter(decimal % 2);
        decimal = Math.floor(decimal / 2);
    }
    return sk.value().reverse().join('');
};

let num = 28;
console.log(num.toString(2));
console.log(num.decimal2binary());

큐 구조: 선입선출, 후입, 후출 "한 쪽 끝에서 들어오지만 다른 쪽 끝에서 나가야 합니다." => EventLoop에는 우선순위 큐가 포함됩니다.

class Queue {
    
    
    container = [];
    // 从顶端进入队列
    enter(item) {
    
    
        this.container.unshift(item);
    }
    // 从底端出队列
    leave() {
    
    
        return this.container.pop();
    }
    // 长度
    size() {
    
    
        return this.container.length;
    }
    // 内容
    value() {
    
    
        return this.container.slice(0);
    }
}

작은 운동: 북을 치며 꽃을 전달합니다
. N명이 함께 게임을 합니다. 그들은 원을 형성하고 1부터 계산합니다. M까지 계산하는 사람은 자동으로 제거됩니다. 마지막 남은 사람이 승리합니다. 마지막에 원래 남은 사람은 누구입니까? ?

//   + n参与的人数 >=1
//   + m被淘汰的数字
const game = function game(n, m) {
    
    
    // 让参与的人依次进入队列
    let qe = new Queue;
    for (let i = 1; i <= n; i++) {
    
    
        qe.enter(i);
    }

    // 只要队列中还存在两个及两个以上的人,则重复这个逻辑
    while (qe.size() > 1) {
    
    
        for (let i = 1; i < m; i++) {
    
    
            // 前m-1个人,出队列后立即进入队列
            qe.enter(qe.leave());
        }
        // 数到m的人直接出队列被淘汰了
        qe.leave();
    }

    return qe.value()[0];
};
console.log(game(8, 5));

데이터 유형 변환

숫자

객체를 숫자로 변환:
+ 먼저 객체의 Symbol.toPrimitive 메서드를 호출합니다. 이 메서드가 존재하지 않으면
+ 그런 다음 객체의 valueOf를 호출하여 원래 값을 가져옵니다. 가져온 값이 원래 값이 아닌 경우
+ 그런 다음 객체의 toString을 호출합니다. 문자열
+ 마지막으로 Number 메소드를 기반으로 문자열을 숫자로 변환합니다
여기에 이미지 설명을 삽입하세요.
.

let arr = [27.2, 0, '0013', '14px', 123];
arr = arr.map(parseInt);//[NaN,NaN,1,1,27]

객체 obj를 문자열로 변환

  • String(obj): Symbol.toPrimitive -> valueOf -> toString 브라우저의 기본 암시적 변환은 String(obj)입니다.
  • obj.toString(): 이 메서드를 직접 호출하여 문자열을 변환하면 위의 규칙은 구현되지 않습니다.
    여기에 이미지 설명을 삽입하세요.

추천

출처blog.csdn.net/weixin_44157964/article/details/119044443