blog
blog copied to clipboard
📝 My blog / notes
## 链表 `概念`:链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的。每个 元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成。 `与数组的区别`:相对于传统的数组,链表的一个好处在于,添加或移除元素的时候不需要移动其他元素。数组缺点:(在大多数语言中)数组的大小是固定的,从数组的起点或中间插入或移除项的成本很高,因为需要移动元素(尽管我们已经学过的JavaScript的array类方法可以帮 我们做这些事,但背后的情况同样是这样)。 然而,链表需要使用指针,因此实现链表时需要额外注意。数组的另一个细节是可以直接访问任何位置的任何元素,而要想访问链表中间的一个元素,需要从起点(表头)开始迭代列表直到找到 所需的元素。  ### 创建链表 ```js function LinkedList() { let Node = function(element){ this.element = element; this.next = null; }; let length = 0;...
## 计算器内存:  需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。 需要存 储多项数据时,有两种基本方式——数组和链表。  ## 数组与链表 ### 链表 链表中的元素可存储在内存的任何地方。链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起,但也因此随机读取元素会较慢。  ### 数组 数组所有元素是靠在一起的,如果没有一整个空间容下这个数组,就得移到内存的其他地方,因此添加新元素的速度会较慢。  ### 读取元素: 需要随机地读取元素时,数组的效率很高,因为可迅速找到数组的任何元素, 因为数组知道其中每个元素的地址。 在链表中,元素并非靠在一起的,你无法迅速计算出第五个元素的内存 地址,而必须先访问第一个元素以获取第二个元素的地址,再访问第二个元素以获取第三个元素 的地址,以此类推,直到访问第五个元素。 ### 增加元素: 在链表 中添加元素很容易:只需将其放入内存,并将其地址存储到前一个元素中。 需要在中间插入元素时,数组和链表哪个更好呢?使用链表时,插入元素很简单,只需修改 它前面的那个元素指向的地址。而使用数组时,则必须将后面的元素都向后移。...
## 题目  ## 解法 双指针法 数组完成排序后, 放一个i当慢指针,一个j当快指针,i初始值为0, j初始值为1; 用j快指针去循环遍历数组nums,因为要把不重复的值挑出来前置,所以当nums[j] !== nums[i] 的时候此时慢指针i加一,并该位置取快指针j的值,即nums[++i] = nums[j]。否则当nums[j] === nums[i]时,前面已有这个数,不用前置了直接跳过 >注意:js中,nums[++i] 和nums[i++]不同,++i是在此计算语句中先执行,i++是在计算语句运行后再执行 ```js const removeDuplicates = function(nums) { const length = nums.length; if(length...
## 起因 最近用团队里面共用组件库,发现一个现象,就是经常有一个组的开发去写了一个页面(panel),放在组件库里面,然后其他产品组的同学看到页面可能有一定的相似度,就去拿这个panel来用,因为还是和自己产品有一定的出入,就直接传了很多props做为判断条件去显示/隐藏 各种定制化的renderprops塞进这个panel中,到后面这个panel被塞进了各种不通用的props,logic和element,代码量越堆越大,阅读性不佳,不利于维护,还会让其他产品组引用这个panel的时候引入了很多本不需要的冗余代码,文件越大影响页面加载速度。 ``` 我是“可复用”的部分 产品A的开发:我们需要在里面显示不同的东西,所以我塞进来好了,简单粗暴 产品B的开发:俺也一样 ################ ##############
### 同源策略 同源策略是一个重要的安全策略,它用于限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介。   `www.baidu.com`网页的文档是由`www.baidu.com`的服务器所提供的,也就是在浏览器输入`www.baidu.com`访问的时候,浏览器会进行DNS解析域名`www.baidu.com`得到对应服务器IP地址并访问此地址,向服务器发起请求,获取文档资源html等,然后浏览器把资源渲染成网页,在网页中,有一个百度搜索框,用户在搜索框输入文字,点击“百度一下”,浏览器带着这个网页的origin(`www.baidu.com`)作为header host(主机名)向`www.baidu.com`的服务器发起请求,`www.baidu.com`的服务器检测到这请求的host是`www.baidu.com`,嗯,是自己人没错(同源),接受请求。  ### 规避方法 但是如果是不同源呢,比如开发的时候,浏览器页面文档由webpack起的服务器提供,源orign可能是127.0.0.1:8080。此时无法调用example.com的接口,因为不同源,除了让example.com的服务器给你设置CORS(跨源资源共享)这种有点劳烦/侵入后端的方式,可以架设服务器代理,比如webpack server提供proxy,这样就可以: 浏览器请求同源服务器(webpack server),webpack server代理请求( 设置了example.com为orign(host header) )example.com的服务器,从而实现跨域请求。当然,这并不意味就成功请求,如果后端设置了需要token做校验,你请求发送方还是要带上有效token的。 ```js module.exports = { //... devServer: { proxy: { // 请求/api/users 现在会被代理到请求...
hook用了好一段时间,写个小总结记录下 ## 为什么要用hook: 复用业务逻辑的已有方案比如 render props 和 高阶组件,需要重新组织你的组件结构,这可能会很麻烦,使你的代码难以理解,你会发现由 providers,consumers,高阶组件,render props 等其他抽象层组成的组件会形成“嵌套地狱” => React 需要为共享状态逻辑提供更好的原生途径。 Hook 就是 JavaScript 函数,但是使用它们会有两个额外的规则: * 只能在函数最外层调用 Hook。不要在循环、条件判断或者子函数中调用。 * 只能在 React 的函数组件中调用 Hook。不要在其他 JavaScript 函数中调用。(还有一个地方可以调用 Hook ——...
最近发现github相关的图片资源在不全局fq的情况下都加载不出来了,此文记录解决方法 ### 方法一:自己动手 将无法加载的url放到[这个网站](https://hostingchecker.com/)搜,得到Server IP  然后把 IP 与 域名 151.101.208.133 user-images.githubusercontent.com 填加进电脑的host文件 解决其他不同域名且图片无法加载的github url同理 ### 方法二:懒人一把梭 直接把这些都拷贝到host文件即可 ``` # GitHub Start 192.30.253.112 github.com 192.30.253.119 gist.github.com 151.101.184.133 assets-cdn.github.com 151.101.184.133 raw.githubusercontent.com...
默认情况下,React DOM在渲染它们之前先转义JSX中嵌入的任何值。这样可以确保您永远不会注入未在应用程序中明确编写的任何内容。一切在呈现之前都会转换为字符串。这有助于防止XSS(跨站点脚本)攻击。 会将用户输入的,跟HTML符号相同的转义掉。 比如 ``` 1) < 转义成 < 2) > 转义成 > 3) & 转义成 & ```    从上图可看出,react在render之前, 会将字符转义, `
## 正则表达式 使用下面类似 Perl 的语法,就可以创建一个正 则表达式。 var expression = / pattern / flags ; 其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、 向前查找以及反向引用。每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为。 正则表达式的匹配模式支持下列 3 个标志。 - g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即 停止; - i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写; - m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模 式匹配的项。 ```js var text...
### 原始值(Primitive Values, 红宝书译为基本类型) Undefined、Null、Boolean、Number、String、Symbol 原始值是不可更改的:任何方法都无法更改(或 突变mutable )原始值,都是返回新的原始值。 > 在很多语言中, 字符串以对象的形式来表示, 因此被认为是引用类型的。 ECMAScript 放弃了这一传统。 ### 对象引用(Object References,红宝书译为引用类型) Object 类型、Array 类型、Function 类型、Date 类型、RegExp 类型 与其他语言不同,JavaScript 不允许直接访问内存中的位置, 也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。 为此,对象引用的值是按引用访问的。  从上图可看到,因为array和copyArray变量都是等于同一个引用地址(在栈内存),访问同一个对象引用的值(在堆内存),所以除非array变量等于其他的对象引用,否则改了array的对象引用的值,copyArray也会被改变。 ###...