对我来说,博客首先是一种知识管理工具,其次才是传播工具。我的技术文章,主要用来整理我还不懂的知识。我只写那些我还没有完全掌握的东西,那些我精通的东西,往往没有动力写。炫耀从来不是我的动机,好奇才是。
什么是js函数的currying/柯里化 说道js的柯里化,相信很多朋友都会头大,或者不是很清楚。用一句话总结柯里化,js柯里化是逐步传值,逐步缩小函数的适用范围,逐步求解的过程。
一、click与300ms延迟 移动端浏览器提供了一个特殊的功能:双击放大 300ms的延迟就是来自于这里,用户碰触页面之后,需要等待一段时间来判断是不是双击(double tap)动作,而不是立即响应单击(click),等待的这段时间大约是300ms。
前后端的分离也实现了前后端架构的分离,带来的好处有: *整个项目的开发权重往前移,实现真正的前后端解耦,动态资源和静态资源分离,提高了性能和扩展性 *前端静态化 *前端有且仅有静态内容,再明确些,只有HTML/CSS/JS *其内容来自于完全静态的资源而不需要任何后台技术进行动态化组装。
前言 不知道你在项目开发过程中有没有遇到以下场景: 一般是前端先制作静态页面,同时服务器端创建数据库,搭建服务器端框架,写接口;当接口写完之后,前端或者后端才能嵌套页面。
前言 不管什么程序语言,内存生命周期基本是一致的:首先,分配需要的内存,然后使用分配到的内存;最后,释放内存。而对于第三个步骤,何时释放内存及释放哪些变量的内存,则需要说那个垃圾回收机制,本文详细介绍javascript中的内存管理和垃圾回收机制。
线程 javascript是单线程语言,也就是说同一个时间只能做一件事情,而这个单线程的特性与它的用途相关,作为浏览器脚本语言,javascript的主要用途是与用户互动,以及操作DOM。
事件 HTML元素事件是浏览器内在自动产生的,当有事件发生的时候html元素会向外界(这里主要指元素事件的订阅者)发出各种事件,如click、onmouseover,onmouseout等等 DOM事件流 DOM(文档对象模型)结构是一个树形结构,当一...
es6是着眼于企业级开发,增加了大量的属性和方法,目前好的浏览器可以支持80%语法特性(我们在学习的时候,可以直接在浏览器中测试),由于es6还有一些功能不能被浏览器支持,因此我们实现的时候需要编译,在es6中面向对象语法出自typescript,只不过不用加任何类型的限制。
跟gulp一样,也是一个模块化的开发工具,是有react(facebook)团队推广的,在webpack中,它认为所有文件都是资源,图片可以看成是资源,js可以看成是资源,css可以被看成资源,模板可以看成是资源等等。
什么是跨域? 跨域是指的一个域名下的文档或者脚本试图去请求另一个域名下的资源,这里跨域是广义的。 广义的跨域 1)资源跳转:A链接、重定向、表单提交 2)资源嵌入: 、 、 、等dom标签,还有样式中background:url()、@font-face()等文件外链 3)脚本请求:js发起的ajax请求、dom和js对象的跨域操作等 其实我们通常所说的跨域是狭义的,是由于浏览器的同源策略限制的一类请求场景。
一、什么是node? node是js的运行环境,可以让js脱离前端单独运行 二、node的特点 1、单线程 无论是多少事情,都是一个线程去完成 单线程的优点:没有了多线程创建线程和销毁线程的开销,调度多线程也是需要消耗资源的。
先从commomJS说起,因为在网页端没有模块化编程知识网页jsvascript逻辑复杂度也可以工作下去,但是在服务器端一定要有模块化,所虽然javascript在web端发展这么多年,第一个流行的模块化规范却由服务端的javascript应用带来,commonjs规范是由NodeJs发扬光大,这标志着javascript模块化编程正式登上舞台。
这题胜在区分度高,知识点覆盖广,再不懂的人,也能答出几句, 而高手可以根据自己擅长的领域自由发挥,从URL规范、HTTP协议、DNS、CDN、数据库查询、 到浏览器流式解析、CSS规则构建、layout、paint、onload/domready、JS...
一、浏览器访问优化 浏览器请求处理流程图 1.减少http请求 http协议是无状态的用用层协议,意味着每次http请求都需要建立通信链路、进行数据传输,而在服务器端,每个http都需要启动独立的线程去处理。
本篇文章从javascript原型链来解释为什么vue中data必须是一个函数 vue组件中的data必须是函数 类比引用数据类型 Object是引用数据类型,如果不是functionf返回,每个数组的data都是内存的同一个地址,一个组件中的数据改变了,其他组件中的数据也会发生改变。
后端路由 路由的概念最开始是由后端提出来的,在以前用模板引擎开发页面的时候,经常会看到这样 http://www.xxx.com/login 大致流程可以看成这样: (1)浏览器发出请求 (2)服务器端监听到80端口或者443有请求过来,并解析url路径 (3)根据服务器的路由配置,返回相应信息(可以是html文件,json数据,也可以是图片) (4)浏览器根据数据包的content-type来决定如何解析数据 简单来说路由就是用来跟后端服务器进行交互的一种方式,通过不同的路径来请求不同的资源,请求不同的页面是路由的其中一项功能。
一、箭头函数的使用场景 箭头函数在es6的标准中引入,可以用于替代传统定义函数的写法,一般用在函数本身代码量比较少,且处理逻辑简单的场景,此时可以用箭头函数替代原有函数,但是如果函数的代码量较大及处理逻辑较为复杂的时候,还是使用传统函数定义的方法。
先分析下3个方法的作用 改变this的指向。 传入参数。 call apply返回函数结果, bind 返回新函数 一、call方法的实现 改变this指向 首先我们知道,对象上的方法,在调用时,this是指向对象的。
this总是指向一个对象,有时指向全局对象,有时指向构造对象,有时指向DOM对象 1. 作为对象的方法调用 做为对象的方法调用时 this 指向对象本生 2.
什么是 TCP/IP 模型? TCP/IP(传输控制协议/互联网协议)由DARPA在 20 世纪 70 年代提出。这个模型来自于ARPANET,它同样也是个知名的“互联网模型”。
一、TCP报文格式 TCP/IP协议的详细信息参看《TCP/IP协议详解》三卷本。下面是TCP报文格式图: 图1 TCP报文格式 上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。
这些URI方法encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent()代替了BOM的escape()和unescape()方法。
一、树的定义 树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。 树具有的特点有: (1) 每个节点有0个或者多个子节点 (2)没有父节点的节点称之为根节点 (3)每一个非根节点有且只有一个父节点 (4)除了根节点外,每个子节点可以分为多个不想交的树 若一个结点有子树,那么该结点称为子树根的“双亲”,子树的根称为该结点的“孩子”。
图片预加载,即图片提前加载,可以保证图片快速、无缝的发布,用户需要查看时可直接从本地缓存中渲染,适用于图片占据很大比例的网站。 一、懒加载 将图片src赋值为一张默认的图片,当用户滚动到可视区域的时候,再去加载真正的图片; 代码实现: html代码 js代码 vue中实现懒加载 对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载。
本文分两部分,第一部分是了解执行环境的相关概念,第二部分是通过是级代码了解具体的执行过程中执行环境的切换。 执行环境 执行环境的分类 1、全局执行环境 是js代码来时执行时的默认环境(浏览器中的window对象)。
1、通过Object构造函数或者对象字面创建单个对象 这些方式有明显的缺点:使用同一个接口创建很多对象,会产生大量的重复代码,为了解决这个问题,出现了工厂模式。
JS中数字运算时,有一个叫做 数字运算中的精度缺失的问题,这篇文章,就带着大家了解下JS运算中精度的缺失问题。 首先我们先来看一个例子: 这里0.1 + 0.2 != 0.3 这个就是我们要解决的问题了。
首先,每个Vue实例在被创建之前都要经过一系列的初始化过程,这个过程就是vue的生命周期。首先看一张图吧~这是官方文档上的图片相信大家一定都会很熟悉: 可以看到在vue一整个的生命周期中会有很多钩子函数提供给我们在vue生命周期不同的时刻...
一、js的数据类型:null 、 nudefined 、number、Boolean、string、array、object 二、判断js的数据类型 (1)值类型 console.
在前端开发过程中,我们经常需要绑定一些持续触发事件,如:resize、scroll、mousemove等等,但有些时候我们并不希望在事件持续触发的过程中那么频繁的去执行函数。
FormData对象 一、概述 FormData就是表单数据,我们提交表单所用的数据,H5里新加了FormData对象,可以让我们对表单数据进行操作,甚至自己组装表单数据进行提交,而不是单纯的仅仅是页面上表单里的元素。
1.什么是重绘(replaint)和回流(relfow) reflow:当render树中的一部分或者全部因为大小边距等问题发生改变而需要重建的过程。 repaint:当元素的一部分属性发生变化,如外观背景色不会引起布局变化而需要重新渲染的过程叫做重绘。
http://momentjs.cn/
js中时间执行的整个过程称之为事件流,分为三个阶段:事件捕获阶段,事件目标处理函数、事件冒泡。 当某歌元素触发某个事件(如:click),顶级对象document发出一个事件流,顺着dom的树节点向触发它的目标节点流去,直到达到目标元素,这个层层递进,向下找目标的过程为事件的捕获阶段,此过程与事件相应的函数是不会触发的。
检测网站是否适应了cdn加速,可以在命令行中输入nslookup ip地址(nslookup http://www.360doc.com)如果address的值是多个,就证明使用了cdn加速。
一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
用户在输入框中输入个js标签 或者在 src 上传图片,路径干个 alert 干扰程序,评论的时候,也干一下 1.输入过滤 对于用户提交的数据进行有效性验证,仅接受指定长度范围内并符合我们期望合适的内容提交,阻止或者忽略除此之外的其他任何数据。
队列是遵循first in first out 原则的一组有序队列,队列从尾部添加新元素,从顶部移除元素,最新添加的元素必须排在队列的末尾。 1.创建队列 我们通过创建自己类来创建队列,先从最基本的声明开始:function Queue() {这里声明属性核对方法}首先需要一个用于存储队列中元素的数据结构。
栈是一种遵从后进先出(LIFO)(last in first out)原则的有序集合。新添加的或待删除的元素都保存在栈的 末尾,称作栈顶,另一端就叫栈底。
for/in: 是ES3中的方法,用来遍历对象(集合)的方法; 不过,for/in 会输出自身以及原型链上可枚举的属性,可以使用 hasOwnProperty 来过滤原型链上的属性 Object.
一、CSRF漏洞的挖掘与利用 0x01 CSRF的攻击原理 CSRF 百度上的意思是跨站请求伪造,其实最简单的理解我们可以这么讲,假如一个微博关注用户的一个功能,存在CSRF漏洞,那么此时黑客只需要伪造一个页面让受害者间接或者直接触发,然后这个恶意页面就可以使用受害者的微博权限去关注其他的人微博账户。
链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的。每个 元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成。
1.web页面主动向服务器索要一张由服务器生成包含维一标识的二维码图片,也可以直接向后台索要一个维一标识,拿到标识后通过js生成二维码.这里本人采用的是第二种方式,至于为什么吗,个人感觉这样方便,后台也不要导入架包,最后将该标识存入List集合中,接下来会用到该标识 2.
数据类型 空类型:undefined null 值类型:基本数据类型 String Number 引用型:复杂数据类型 Object Array 对象 值类型的值在栈空间存储,引用类型的对象在堆中存储,地址在栈中存储 基本类型(值类型)在调用函数的...
1.一次完整的HTTP请求所经历的7个步骤 HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: 1. 建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建 Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。
论jQuery和javascript性能的文章并不罕见。然而,本文我计划总结一些速度方面的技巧和我本人的一些建议,来提升你的jQuery和javascript代码。
浏览器缓存机制介绍 对于浏览器缓存,相信很多开发者对它是又爱又恨,一方面,它可以极大地提升用户体验,另一方面,在开发中经常会由于浏览器缓存而展示了「错误」的东西。
栈(Stack)和队列(Queue)是两种操作受限的线性表。栈的插入和删除操作只允许在表的尾端进行(在栈中成为“栈顶”),满足“FIFO:First In Last Out”;队列只允许在表尾插入数据元素,在表头删除数据元素,满足“First In First Out”。
Vue.js 最核心的功能有两个,一是响应式的数据绑定系统,二是组件系统。本文仅探究双向绑定是怎样实现的。先讲涉及的知识点,再用简化得不能再简化的代码实现一个简单的 hello world 示例。
对于字符串类型,浅复制是对值的复制,对于对象来说,浅复制是对对象地址的复制,并没 有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变,而深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。