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)으로 변경합니다.
빠른 연습: 십진수를 이진수로 변환
- 10.toString(2) //toString은 Number 프로토타입의 메소드입니다.
- 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(): 이 메서드를 직접 호출하여 문자열을 변환하면 위의 규칙은 구현되지 않습니다.