算法:大数相加
js的大数相加所遇到的问题这里只需要明确一点,就是思路。两数相加很简单:
return a + b
如此这般,最后的结果: 1e3之类。
正确的思路应该是用指针遍历,进位累加即可。
响应常用状态码
本文记录一些常用状态码1xx:
100: 请求已被处理,需要客户端继续发送请求。例如post。
2xx:请求成功。
200: 请求成功,返回数据
204: 请求成功,无数据
3xx:重定向
301: 永久
302: 暂时
304: 协商缓存
4xx:客户端错误
401: 未授权,要求身份验证
403: forbidden
404: not-found
5xx:服务器错误
500: 服务器遇到错误,无法完成请求。
502: 网关错误
503: 停机维护服务器无法使用
算法:递归
本文介绍递归思想先看一道经典的题:
全排列// 非重复数字:
/**
* @param {number[]} nums
* @return {number[][]}
*/
var permute = function(nums) {
let res = []
let used = new Array(nums.length).fill(0)
const f = (n1) => {
if(n1.length === nums.length) {
// let temp = JSON.parse(JSON.stringify(n1))
res.push([...n1])
// 此处发现一个很懵逼的问题,若写成res.push(n1),结果居然都为空。。。
}
for(let i = 0; i < nums.length;i++) {
...
算法:链表
本文主要介绍链表相关链表这种数据结构的特点, 就是每一个节点对象通过一个next字段,链接下一个节点,所以总体看来, 就是一种链条的结构。
// 结构
const listNode = function(val) {
this.val = val
this.next = null
}
查找:时间复杂度O(n), 空间复杂度: O(1)删除:时间复杂度O(n), 空间复杂度: O(1)
练练手:
1. 牛客BM1–链表反转思路很清晰: 从头部节点遍历,挨个取出节点,暂存next节点。取出节点连接到新节点即可,最后返回。
let res
whiel(head) {
const current = head
const next = head.next
current.next = res
res = current
head = next
}
return res
2. 返回倒数第k个元素/*
* function ListNode(x){
* ...
CSS系列:常见问题
本文用于记录常见css面试题
前端响应式的策略?
媒体查询@media。根据设备的不同宽高数据,使用不同的样式代码
百分比
vm、vh
rem。
两栏布局,右侧自适应?
flex: 1
calc(100% - 左侧宽度)
左侧浮动,右侧margin-left
盒子水平垂直居中几种方案
3.1 flex
<div class="father">
<div class="child"></div>
</div>
.father {
margin: 100px auto;
width: 1000px;
height: 500px;
border: 1px solid red;
display: flex;
justify-content: center;
align-items: center;
}
.child {
border: 1px solid green;
width: 500px;
height: 100px;
...
Vue.js系列:nexttick原理
本文尝试梳理在vue中,nextTick方法的实现原理使用:在下次dom更新结束之后,执行nextTick中的回调,这样我们就能拿到dom。
谈到nextTick就不得不说一说js执行环境的事件循环机制。js引擎首先会执行全局代码,并将其中的同步任务放入执行栈中执行。当遇到异步任务时,会将该根据任务类型放入不同的事件队列。比如settimeout、settimeinterval就放入宏任务队列。微任务塞入微任务队列。主执行栈执行完毕后,会按照微任务事件队列优先原则,取出任务执行。微任务空再去宏任务队列中拿。直到最后清空。
具体来说,当我们调用Vue的nextTick方法时,Vue会将回调函数放入一个回调队列中。在当前执行栈执行完毕后,Vue会检查是否存在微任务队列,如果存在,则将回调函数放入微任务队列中。
Vue.nextTick = function (callback) {
if (typeof Promise !== 'undefined') {
// 使用Promise的then方法作为微任务
Promise.resolve().then ...
electron系列:第一回
本系列开始,将逐步介绍前端的客户端经典框架–electron(系列文章)本文主要讲解electron的通信机制
首先祭出一张经典的图:
electron有且只有一个主进程,由package.json中的main字段定义,Electron 使用 Chromium 来展示 web 页面,每个页面运行在自己的渲染进程中。
一. 为什么这么划分根本逻辑:主进程拥有服务器端的能力,例如读写文件资源,渲染进程负责页面呈现。
二. 基本配置1. 创建app,主进程设置ipcMain,用来监听渲染进程事件
import { app, BrowserWindow, ipcMain } from 'electron'
import { handleGetAllCates, handleGetAllItems, handleGetVideo, getVideoContentVersionTwo } from '../src/utils/videoApi'
const fs = require('fs')
let mainWindow: BrowserWindow | ...
js的奇奇怪怪那些事儿
本文主要是记录一些关于js的奇奇怪怪的特性,题目为主
原型链 function F() {}
Object.prototype.a = function() {
console.log('a')
}
Function.prototype.b = function() {
console.log('b')
}
const f = new F()
f.a()
f.b()
// 输出
// a
// Uncaught TypeError: f.b is not a function
解答:
因为f首先是一个对象,通过原型链找到a方法输出a
通过new方法出来的f,本质上是基于F构造函数的原型对象{}生成,所以无b方法
js中的代码,是按顺序执行的吗先说结论:作为单线程的语言,当然是一行行按顺序执行,但也并不完全是,为什么?因为有个叫变量提升的骚操作。
// 事例1
showName()
console.log(myname)
var myname = '极客时间'
function showName() ...
性能的考量:第五回(长任务)
关于性能问题,我们前文介绍过了八股文篇、实战版本以及canvas性能相关的实操。今天,我们结合前文介绍过的google的performance工具,来更加深入的聊一聊。在web性能领域,有一个单独的单词long task,就是所谓的长任务。一般来讲,耗时超过50ms即可被认为长任务。这种长任务会导致什么结果呢?大佬解答:
If the user is attempting to interact with the page while a long task runs—or if an important rendering update needs to happen—the browser will be delayed in handling that work.
简言之:卡死你。
以目下的一个业务场景为例。该项目的某个页面加载耗时,长达6s。打开performance工具分析发现,符合长任务定义的操作,存在还不止一个,且单个耗时远超50ms,如下图所示:
针对上述的“long task”,我们怎么优化呢?
异步化任务
依据向主线程妥协的原则,有些场景下的一些任务,不 ...
Threejs系列:第三回(贴图纹理)
本文讲解纹理相关内容首先推荐个老外的站点,上面的各种纹理资源应有尽有,拿走不谢。https://ambientcg.com/list
所谓纹理,实质就是我们游戏制作过程中的贴图。比如通过下方代码,我们写了一个圆球体:
// 物体
const geometry = new THREE.SphereGeometry( 1);
const mesh = new THREE.MeshBasicMaterial({
color: 'green',
map: pi
})
const cube = new THREE.Mesh(geometry, mesh)
scene.add(cube)
效果如下:
是不是感觉很僵硬?不着急,我们在他的表面贴一张图片看看:
// 纹理
const texttureLoader = new THREE.TextureLoader()
// const pi = texttureLoader.load('./OutdoorHDRI078_1K-HDR.exr')
const pi = texttureLoader.load('./doo ...
