blog
blog copied to clipboard
博客系列
```js import React, { useEffect, useState } from 'react'; import './App.css'; import store from './store' import action from './store/action' import { bindActionCreators } from 'redux' let toAction = bindActionCreators(action, store.dispatch)...
移位运算就是对二进制进行有规律低移位。移位运算可以设计很多奇妙的效果,在图形图像编程中应用广泛。 ### “> 8); //返回值3 用算式进行演示,如图所示。  把数值 -1000 向右移 8 位,则返回值为 -4。 console.log(-1000 >> 8); //返回值 -4 用算式进行演示,如图所示。当符号位值为 1 时,则有效位左侧的空位全部使用 1 进行填充。 ### “>>>”运算符 “>>>”运算符执行五符号右移位运算。它把无符号的 32 位整数所有数位整体右移。对于无符号数或正数右移运算,无符号右移与有符号右移运算的结果是相同的。 下面两行表达式的返回值是相同的。 console.log(1000...
## 为什么要缓存 1. 请求更快:通过将内容缓存在本地或距离最近的缓存服务器(CDN),大大加快网站加载速度。 2. 节省带宽:对于已缓存的文件,可以减少请求带宽甚至无需请求网络。 3. 降低服务器压力:在大量用户并发的情况下,服务器的性能受到限制,此时将一些静态资源放在网络的多个节点,可以起到负载均衡的作用,降低服务器压力。 ## 缓存分类 1. 服务端缓存(CDN) 2. 客户端缓存(浏览器) ## 客户端浏览器的缓存类型 强缓存,返回状态码200,不会发送HTTP请求 协商缓存,返回状态码304,会发送HTTP请求 ## 如何设置缓存 如何让浏览器缓存我们的静态资源,这也是一个需要由服务器与浏览器共同协作完成的事情。 1. 协商缓存 在普通的GET请求报文中,附带`If-Modified-Since`字段,它将询问服务器端是否有更新的版本,本地文件的最后修改时间。如果服务器端没有新的版本,只需响应一个304状态码,客户端就使用本地版本。如果服务器端有新的版本,就将新的内容发送给客户端,客户端放弃本地版本。 服务端设置响应头 ``` last-modified: Tue, 23 Apr...
1面:CSS / 语法 / 框架 / 框架原理 / 性能优化 等 2面:框架原理 / 网络安全 / 算法(必有) / 项目设计&工程化(必有) 等 3面:算法(必有) / 项目设计&工程化(必有) / 自己做过的项目经历(必有) 等 4面:做过的项目经历(必有) / 新系统的设计题 等 5面:沟通能力 /...
使用Vue的小伙伴可能使用过[element-ui](https://element.eleme.cn/#/zh-CN/component/message#fang-fa)中的Message 消息提示 使用React的小伙伴可能使用过[ant-design](https://ant.design/components/message-cn/)Message全局提示 ```js Message.success({message: '消息提示'}) ``` 他们的原理都相似,这篇文章将会带你手写实现消息提示组件。 ## Vue 对于这样的消息组件,是用函数执行的进行调用,并不是在模板中直接使用组件的形式,不是组件那他们的DOM是如何创建到页面中显示出来的呢?其实还是利用了组件的虚拟DOM渲染的。 先准备好消息提示组件 ```vue {{ item.message }} export default { data () { return { messages: [], id: 0 } },...
接下来要介绍的基本排序算法其核心思想是指对一组数据按照一定的顺序重新排列。重新排列时用到的技术是一组嵌套的 for 循环。其中外循环会遍历数组的每一项,内循环则用于比较元素。这些算法非常逼真地模拟了人类在现实生活中对数据的排序,例如纸牌玩家在处理手中的牌时对纸牌进行排序,或者教师按照字母顺序或者分数对试卷进行排序。 ## 冒泡排序 我们先来了解一下冒泡排序算法,它是最慢的排序算法之一,但也是一种最容易实现的排序算法。 之所以叫冒泡排序是因为使用这种排序算法排序时,数据值会像气泡一样从数组的一端漂浮到另一端。假设正在将一组数字按照升序排列,较大的值会浮动到数组的右侧,而较小的值则会浮动到数组的左侧。之所以会产生这种现象是因为算法会多次在数组中移动,比较相邻的数据,当左侧值大于右侧值时将它们进行互换。 这里有一个简单的冒泡排序的例子。我们从下面的列表开始: E A D B H 经过第一次排序后,这个列表变成: A E D B H 前两个元素进行了互换。接下来再次排序又会变成: A D E B H 第二个和第三个元素进行了互换。继续进行排序: A D B E...
在linux中的每个用户必须属于一个组,不能独立于组外。在linux中每个文件有所有者、所在组、其它组的概念。通常文件是谁创建的,那么所有者就是谁。 在终端输入`ls -ahl`查看文件的信息 ``` drwxr-xr-x. 2 root root 22 Dec 4 01:51 demo -rwxr--r--. 1 root root 57 Dec 3 22:41 hello.sh ``` 下面具体介绍`drwxr-xr-x.`和`-rwxr--r--.`代表的含义。 第一位是文件的类型 | 符号 | 含义 |...
约束基本数据类型 ```js let title:string = '张三' let age:number = 18 let loading:boolean = true let obj:null = null let total:undefined = undefined ``` 联合类型,多种数据类型中的一种 ```js let title:number|string = 18 ```...
```js interface Label { label: string; } function handleLabel(labelObj: Label) { console.log(labelObj.label) } let labelObj = { label: 'hello', size: 100 } handleLabel(labelObj) ``` 当用接口限制一个函数参数的时候,传入的对象参数实际上会包含很多属性,但是编译器只会检查那些必需的属性是否存在,并且其类型是否匹配。可以多但是不能少。但是如果函数里面使用了不存在的属性也会报错,只有使用就必须声明类型。 ```js interface Label { label:...
```js window.getSelection().removeAllRanges() const Url2 = this.$refs.linkAddress const range = document.createRange() range.selectNode(Url2) window.getSelection().addRange(range) document.execCommand('copy', false, null) ```