文章目录
  1. 1. 前端知识体系
    1. 1.1. JavaScript
      1. 1.1.1. 简短的历史
      2. 1.1.2. 数据类型
        1. 1.1.2.1. 数据类型介绍
        2. 1.1.2.2. String
        3. 1.1.2.3. Number
        4. 1.1.2.4. Object
        5. 1.1.2.5. Array
        6. 1.1.2.6. Date 时间
      3. 1.1.3. 操作符
      4. 1.1.4. 语句
        1. 1.1.4.1. for in
        2. 1.1.4.2. for of
      5. 1.1.5. 基本引用类型
      6. 1.1.6. 集合引用类型
      7. 1.1.7. 函数
      8. 1.1.8. 原型链
      9. 1.1.9. 闭包 clouser
      10. 1.1.10. this 指向
      11. 1.1.11. 垃圾回收机制 GC
  2. 2. 应用
    1. 2.1. 防抖截流
      1. 2.1.1. 防抖
      2. 2.1.2. 截流
    2. 2.2. 移动端适配

前端知识体系

前端知识体系

JavaScript

简短的历史

1995 年出来, 网景公司 LiveScript,JScript;ECMAScript 262 TC39

ECMAScript Dom Bom

数据类型

var、const、let

const 变量指向的内存地址不能变

数据类型分为基本数据类型和引用数据类型。基本数据类型存储在栈里,引用数据类型存储在堆里。
基本数据类型有:null、undefined、string、number、boolean、symbol、bigint
引用数据类型有:Object、Function、Array、RegExp、Date

typeof 操作符判断基本数据类型

1
2
3
4
5
6
7
8
9
10
typeof null === 'object' // 历史原因
typeof undefined === 'undefined'
typeof '' === 'string'
typeof 1 === 'number'
typeof true === 'boolean'
typeof Symbol() === 'symbol'
typeof 1n === 'bigint'
typeof (()=>{}) === 'function'
typeof {} === 'object'
typeof [] === 'object'

判断引用数据类型

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上

1
2
3
4
5
6
7
8
function Car(){

}

const autoCar = new Car()

autoCar instanceof Car
autoCar instanceof Object

使用 Object 原型对象的 toString 方法

1
2
3
4
5
6
7
8
9
10
11
Object.prototype.toString.call({}) === '[object Object]'

Object.prototype.toString.call([]) === '[object Array]'

Object.prototype.toString.call('') === '[object String]'

Object.prototype.toString.call(1) === '[object Number]'

Object.prototype.toString.call(true) === '[object Boolean]'

Object.prototype.toString.call(1n) === '[object BigInt]'

自定义 Symbol.toStringTag

1
2
3
const  arr = [];
arr[Symbol.toStringTag] = 'hack';
Object.prototype.toString.call(arr) // '[object hack]'

objectName 该方法可以放到公共 utils 里

1
2
3
4
5
6
function objectName(object) {
const name = Object.prototype.toString.call(object);
return name.replace(/^\[object (.*)\]$/, function (m, p0) {
return p0;
});
}

数据类型介绍

String

Number

Object

getPrototypeOf

Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)。

1
__proto__

Array

Date 时间

构造函数有 new 和 无 new 的区别,有 new 返回的是 date 对象,无 new 返回的是字符串 等同于 new Date().toString()

静态方法 now、parse、UTC

为了兼容 ios 不兼容-
可以重写 Date,构造函数、原型链、静态方法

1
2
3
4
5
6
7
8
const oldDate = Date;

Date = function(){
arguments[0] = arguments[0].replace(/-/g,'/')
return new oldDate(...arguments)
}

const a = Date('2022/01/23 11:22:33')

操作符

1
+ - * /

new 操作符

(1) 在内存中创建一个新对象。
(2) 这个新对象内部的[[Prototype]]特性被赋值为构造函数的 prototype 属性。
(3) 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。
(4) 执行构造函数内部的代码(给新对象添加属性)。
(5) 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function myNew(){
const obj = {};
const fn = [].shift.call(arguments);
obj.__proto__ = (fn.prototype);
const result = fn.apply(obj,...arguments);
return result instanceof Object ? result : obj;
}


function myNew(){
const fn = [].shift.call(arguments);
const obj = Object.create(fn.prototype);
const result = fn.apply(obj,...arguments);
return result instanceof Object ? result : obj;
}

语句

条件

1
2
3
4
5
6
7
8
9
10
if else

switch()
case a:

break;
case b:

break;
default:

三元

循环

1
2
3
for(let i=1;i<10;i++){

}

for in

用来遍历对象或者数组

1
2
3
for in


for of

for-of 语句是一种严格的迭代语句,用于遍历可迭代对象的元素

基本引用类型

集合引用类型

函数

原型链

对象、原型对象、构造函数

1
2
3
4
5
6
7
function Dog(){

}

const dog1 = new Dog()

Dog.prototype.__proto__.constructor // Object

闭包 clouser

1
2
3
4
5
6
7
8
9
10
11
function add(){
let value = 1;

return function(number){
value +=number
return value
}
}

const foo = add()
foo()

this 指向

垃圾回收机制 GC

  • 标记法
  • 计数法

应用

防抖截流

防抖

事件被触发 n 秒后再执行回调,如果在这 n 内事件又触发,则重新计算时间

使用场景:联想搜索、页面 resize

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function debounce(fn,wait){
let timer = null;

return function(){
let context = this;
const args = arguments;

if(timer){
clearTimeout(timer);
timer = null;
}

timer = setTimeout(()=>{
fn.apply(context,args)
},wait)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function debounce(fn,wait){
let timer = null;

return function(){
if(timer){
clearTimeout(timer);
timer = null;
}

timer = setTimeout(()=>{
fn.apply(this,arguments)
},wait)
}
}

截流

规定的时间内,只有一次触发事件执行

使用场景:按钮查询、滚动条加载更多

闭包的实现

1
2
3
4
5
6
7
8
9
10
function throttle(fn,delay){
let curTime = Date.now();

return function(){
if(Date.now() - curTime >= delay){
curTime = Date.now();
return fn.apply(this,arguments)
}
}
}

定时器的实现

1

移动端适配

1
2
3
4
5
6
7
8
9
10
11
function setRem() {
// browser width
const w = document.documentElement.clientWidth;
// calculate rate
const fs = (w / 750) * 100;
// set root html font size
document.querySelector("html").style.fontSize = fs + "px";
}

setRem();
window.addEventListener("resize",setRem);
文章目录
  1. 1. 前端知识体系
    1. 1.1. JavaScript
      1. 1.1.1. 简短的历史
      2. 1.1.2. 数据类型
        1. 1.1.2.1. 数据类型介绍
        2. 1.1.2.2. String
        3. 1.1.2.3. Number
        4. 1.1.2.4. Object
        5. 1.1.2.5. Array
        6. 1.1.2.6. Date 时间
      3. 1.1.3. 操作符
      4. 1.1.4. 语句
        1. 1.1.4.1. for in
        2. 1.1.4.2. for of
      5. 1.1.5. 基本引用类型
      6. 1.1.6. 集合引用类型
      7. 1.1.7. 函数
      8. 1.1.8. 原型链
      9. 1.1.9. 闭包 clouser
      10. 1.1.10. this 指向
      11. 1.1.11. 垃圾回收机制 GC
  2. 2. 应用
    1. 2.1. 防抖截流
      1. 2.1.1. 防抖
      2. 2.1.2. 截流
    2. 2.2. 移动端适配
Fork me on GitHub