一、js中如何检验一个变量是一个string类型?javascript
if(typeof str === 'string'){
return true
}
二、js去除字符串空格?css
str = str.replace(/\s*/g,'') // 去除全部空格
str = str.replace(/^\s*|\s*$/g,'') // 去除两头空格
str = str.replace(/^\s*/,'') // 去除左侧空格
str = str.replace(/(\s*$)/g,'') // 去除右边的空格
三、获取浏览器URL中查询字符串中的参数html
测试地址为:http://www.runoob.com/jquery/misc-trim.html?channelid=12333&name=xiaoming&age=23
function showWindowHref() {
const sHref = window.location.href
const args = sHref.split('?')
if(args[0] == sHref){
return ''
}
const arr = args[1].split('&')
var obj = {}
for(var i = 0; i < arr.length; i++){
var arg = arr.split('=')
obj[arg[0]] = arg[1]
}
return obj
}
四、js字符串操做函数前端
a、concat() // 将两个或多个字符的文本组合起来,返回一个新的字符串java
b、indexOf() // 返回字符串中一个子串第一次出现的索引,若是没有匹配,则返回-1jquery
c 、charAt() // 返回指定位置的字符css3
d、lastIndexOf() – 返回字符串中一个子串最后一处出现的索引,若是没有匹配项,返回 -1 nginx
match() – 检查一个字符串是否匹配一个正则表达式。web
substr() 函数 -- 返回从string的startPos位置,长度为length的字符串正则表达式
substring() – 返回字符串的一个子串。传入参数是起始位置和结束位置。
slice() – 提取字符串的一部分,并返回一个新字符串。
replace() – 用来查找匹配一个正则表达式的字符串,而后使用新字符串代替匹配的字符串。
search() – 执行一个正则表达式匹配查找。若是查找成功,返回字符串中匹配的索引值。不然返回 -1 。
split() – 经过将字符串划分红子串,将一个字符串作成一个字符串数组。
length – 返回字符串的长度,所谓字符串的长度是指其包含的字符的个数。
toLowerCase() – 将整个字符串转成小写字母。
toUpperCase() – 将整个字符串转成大写字母。
createDocumentFragment() // 建立一个DOM片
createEelement() // 建立一个具体的元素
createTextNode() // 建立一个文本节点
appendChild() // 添加
removeChild() // 删除
replaceChild() // 替换
insertBefore() // 插入
getElementsByTagName() // 经过标签名查找
getElementsByClassName() // 经过class 查找
getEelementById() // 经过ID查找
六、比较typeof与instanceof?
相同点:JavaScript 中 typeof 和 instanceof 经常使用来判断一个变量是否为空,或者是什么类型的。
typeof的定义和用法:返回值是一个字符串,用来讲明变量的数据类型。
细节:
(1)、typeof 通常只能返回以下几个结果:number,boolean,string,function,object,undefined。
(2)、typeof 来获取一个变量是否存在,如 if(typeof a!="undefined"){alert("ok")},而不要去使用 if(a) 由于若是 a 不存在(未声明)则会出错。
(3)、对于 Array,Null 等特殊对象使用 typeof 一概返回 object,这正是 typeof 的局限性。
Instanceof定义和用法:instanceof 用于判断一个变量是否属于某个对象的实例。
实例演示:
a instanceof b?alert("true"):alert("false"); //a是b的实例?真:假
var a = new Array(); alert(a instanceof Array); // true alert(a instanceof Object) // true
如上,会返回 true,同时 alert(a instanceof Object) 也会返回 true;这是由于 Array 是 object 的子类。
function test(){}; var a = new test(); alert(a instanceof test) // true
细节:
(1)、以下,获得的结果为‘N’,这里的 instanceof 测试的 object 是指 js 语法中的 object,不是指 dom 模型对象。
if (window instanceof Object){ alert('Y')} else { alert('N');} // 'N'
一、定义和用法:当一个函数的返回值是另一个函数,而返回的那个函数若是调用了其父函数内部的其它变量,若是返回的这个函数在外部被执行,就产生了闭包。
二、表现形式:使函数外部可以调用函数内部定义的变量。
三、实例以下:
(1)、根据做用域链的规则,底层做用域没有声明的变量,会向上一级找,找到就返回,没找到就一直找,直到window的变量,没有就返回undefined。这里明显count 是函数内部的flag2 的那个count 。
var count=10; //全局做用域 标记为flag1 function add(){ var count=0; //函数全局做用域 标记为flag2 return function(){ count+=1; //函数的内部做用域 alert(count); } } var s = add() s();//输出1 s();//输出2
四、变量的做用域
要理解闭包,首先必须理解Javascript特殊的变量做用域。
变量的做用域分类:全局变量和局部变量。
特色:
一、函数内部能够读取函数外部的全局变量;在函数外部没法读取函数内的局部变量。
二、函数内部声明变量的时候,必定要使用var命令。若是不用的话,你实际上声明了一个全局变量!
五、使用闭包的注意点
1)滥用闭包,会形成内存泄漏:因为闭包会使得函数中的变量都被保存在内存中,内存消耗很大,因此不能滥用闭包,不然会形成网页的性能问题,在IE中可能致使内存泄露。解决方法是,在退出函数以前,将不使用的局部变量所有删除。
2)会改变父函数内部变量的值。因此,若是你把父函数看成对象(object)使用,把闭包看成它的公用方法(Public Method),把内部变量看成它的私有属性(private value),这时必定要当心,不要随便改变父函数内部变量的值。
因为浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不一样即为跨域。存在跨域的状况:
网络协议不一样,如http协议访问https协议。
端口不一样,如80端口访问8080端口。
域名不一样,如qianduanblog.com访问baidu.com。
子域名不一样,如abc.qianduanblog.com访问def.qianduanblog.com。
域名和域名对应ip,如www.a.com访问20.205.28.90.
(1)、porxy代理
定义和用法:proxy代理用于将请求发送给后台服务器,经过服务器来发送请求,而后将请求的结果传递给前端。
实现方法:经过nginx代理;
注意点:一、若是你代理的是https协议的请求,那么你的proxy首先须要信任该证书(尤为是自定义证书)或者忽略证书检查,不然你的请求没法成功。
(2)、CORS 【Cross-Origin Resource Sharing】
定义和用法:是现代浏览器支持跨域资源请求的一种最经常使用的方式。
使用方法:通常须要后端人员在处理请求数据的时候,添加容许跨域的相关操做。以下:
res.writeHead(200, { "Content-Type": "text/html; charset=UTF-8", "Access-Control-Allow-Origin":'http://localhost', 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS', 'Access-Control-Allow-Headers': 'X-Requested-With, Content-Type' });
(3)、jsonp
定义和用法:经过动态插入一个script标签。浏览器对script的资源引用没有同源限制,同时资源加载到页面后会当即执行(没有阻塞的状况下)。
特色:经过状况下,经过动态建立script来读取他域的动态资源,获取的数据通常为json格式。
实例以下:
<script> function testjsonp(data) { console.log(data.name); // 获取返回的结果 } </script> <script> var _script = document.createElement('script'); _script.type = "text/javascript"; _script.src = "http://localhost:8888/jsonp?callback=testjsonp"; document.head.appendChild(_script); </script>
缺点:
一、这种方式没法发送post请求(这里)
二、另外要肯定jsonp的请求是否失败并不容易,大多数框架的实现都是结合超时时间来断定。
一、定义和用法:垃圾回收机制(GC:Garbage Collection),执行环境负责管理代码执行过程当中使用的内存。
二、原理:垃圾收集器会按期(周期性)找出那些不在继续使用的变量,而后释放其内存。可是这个过程不是实时的,由于其开销比较大,因此垃圾回收器会按照固定的时间间隔周期性的执行。
三、实例以下:
function fn1() { var obj = {name: 'hanzichi', age: 10}; } function fn2() { var obj = {name:'hanzichi', age: 10}; return obj; } var a = fn1(); var b = fn2();
fn1中定义的obj为局部变量,而当调用结束后,出了fn1的环境,那么该块内存会被js引擎中的垃圾回收器自动释放;在fn2被调用的过程当中,返回的对象被全局变量b所指向,因此该块内存并不会被释放。
四、垃圾回收策略:标记清除(较为经常使用)和引用计数。
标记清除:
定义和用法:当变量进入环境时,将变量标记"进入环境",当变量离开环境时,标记为:"离开环境"。某一个时刻,垃圾回收器会过滤掉环境中的变量,以及被环境变量引用的变量,剩下的就是被视为准备回收的变量。
到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或相似的策略,只不过垃圾收集的时间间隔互不相同。
引用计数:
定义和用法:引用计数是跟踪记录每一个值被引用的次数。
基本原理:就是变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象。
一、何时触发垃圾回收?
垃圾回收器周期性运行,若是分配的内存很是多,那么回收工做也会很艰巨,肯定垃圾回收时间间隔就变成了一个值得思考的问题。
IE6的垃圾回收是根据内存分配量运行的,当环境中的变量,对象,字符串达到必定数量时触发垃圾回收。垃圾回收器一直处于工做状态,严重影响浏览器性能。
IE7中,垃圾回收器会根据内存分配量与程序占用内存的比例进行动态调整,开始回收工做。
二、合理的GC方案:(1)、遍历全部可访问的对象; (2)、回收已不可访问的对象。
三、GC缺陷:(1)、中止响应其余操做;
四、GC优化策略:(1)、分代回收(Generation GC);(2)、增量GC
一、定义和用法:
内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。C#和Java等语言采用了自动垃圾回收方法管理内存,几乎不会发生内存泄露。咱们知道,浏览器中也是采用自动垃圾回收方法管理内存,但因为浏览器垃圾回收方法有bug,会产生内存泄露。
二、内存泄露的几种状况:
(1)、当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会做出恰当处理,此时要先手工移除事件,否则会存在内存泄露。
实例以下:
<div id="myDiv"> <input type="button" value="Click me" id="myBtn"> </div> <script type="text/javascript"> var btn = document.getElementById("myBtn"); btn.onclick = function(){ document.getElementById("myDiv").innerHTML = "Processing..."; } </script>
解决方法以下:
<div id="myDiv"> <input type="button" value="Click me" id="myBtn"> </div> <script type="text/javascript"> var btn = document.getElementById("myBtn"); btn.onclick = function(){ btn.onclick = null; document.getElementById("myDiv").innerHTML = "Processing..."; } </script>
function bindEvent(){ var obj=document.createElement("XXX"); obj.onclick=function(){ //Even if it's a empty function } }
解决方法以下:
function bindEvent(){ var obj=document.createElement("XXX"); obj.onclick=function(){ //Even if it's a empty function } obj=null; }
var str = 'asbdsgdgfdgfdgfgr'
var json = {}
for(var i = 0; i < str.length; i++){
if(!json[str.charAt(i)]){
json[str.charAt(i)] = 1
}else{
json[str.charAt(i)]++
}
}
var max = 0
var index = ''
for (var j in json){
if(json[j] > max){
max = json[j]
index = j
}
}
var arr = [1,4,6,7,4,3,5]
var obj = {}
var tmp = []
for (var i = 0; i < arr.length; i++){
if(!obj[arr[i]]){
obj[arr[i]] = 1
tmp.push(arr[i])
}
}
(1)、window.onload方法是在网页中全部的元素(包括元素的全部关联文件)彻底加载到浏览器后才执行的。
(2)、$(document).ready() 方法能够在DOM载入就绪时就对其进行操纵,并调用执行绑定的函数。
在网页中,一个元素占有空间的大小由几个部分构成,其中包括元素的内容(content),元素的内边距(padding),元素的边框(border),元素的外边距(margin)四个部分。这四个部分占有的空间中,有的部分能够显示相应的内容,而有的部分只用来分隔相邻的区域或区域。4个部分一块儿构成了css中元素的盒模型。
href 是指向网络资源所在位置,创建和当前元素(锚点)或当前文档(连接)之间的连接,用于超连接。
src是指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素。
当浏览器解析到该元素时,会暂停其余资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,相似于将所指向资源嵌入当前标签内。这也是为何将js脚本放在底部而不是头部。
相同点:px和em都是长度单位;
异同点:px的值是固定的,指定是多少就是多少,计算比较容易。em得值不是固定的,而且em会继承父级元素的字体大小。
浏览器的默认字体高都是16px。因此未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。
共同点:用于浏览器端存储的缓存数据
不一样点:
(1)、存储内容是否发送到服务器端:当设置了Cookie后,数据会发送到服务器端,形成必定的宽带浪费;
web storage,会将数据保存到本地,不会形成宽带浪费;
(2)、数据存储大小不一样:Cookie数据不能超过4K,适用于会话标识;web storage数据存储能够达到5M;
(3)、数据存储的有效期限不一样:cookie只在设置了Cookid过时时间以前一直有效,即便关闭窗口或者浏览器;
sessionStorage,仅在关闭浏览器以前有效;localStorage,数据存储永久有效;
(4)、做用域不一样:cookie和localStorage是在同源同学口中都是共享的;sessionStorage不在不一样的浏览器窗口中共享,即便是同一个页面;
(1)、存储空间更大:IE8下每一个独立的存储空间为10M,其余浏览器实现略有不一样,但都比Cookie要大不少。
(2)、存储内容不会发送到服务器:当设置了Cookie后,Cookie的内容会随着请求一并发送的服务器,这对于本地存储的数据是一种带宽浪费。而Web Storage中的数据则仅仅是存在本地,不会与服务器发生任何交互。
(3)、更多丰富易用的接口:Web Storage提供了一套更为丰富的接口,如setItem,getItem,removeItem,clear等,使得数据操做更为简便。cookie须要本身封装。
(4)、独立的存储空间:每一个域(包括子域)有独立的存储空间,各个存储空间是彻底独立的,所以不会形成数据混乱。
(1)XSS(Cross-Site Scripting,跨站脚本攻击):指经过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或者JavaScript进行的一种攻击。
(2)SQL注入攻击
(3)CSRF(Cross-Site Request Forgeries,跨站点请求伪造):指攻击者经过设置好的陷阱,强制对已完成的认证用户进行非预期的我的信息或设定信息等某些状态更新。
1.减小 HTTP 请求 (Make Fewer HTTP Requests)
2.减小 DOM 元素数量 (Reduce the Number of DOM Elements)
3.使得 Ajax 可缓存 (Make Ajax Cacheable)
1.把 CSS 放到代码页上端 (Put Stylesheets at the Top)
2.从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)
3.精简 JavaScript 与 CSS (Minify JavaScript and CSS)
4.避免 CSS 表达式 (Avoid CSS Expressions)
1. 脚本放到 HTML 代码页底部 (Put Scripts at the Bottom)
2. 从页面中剥离 JavaScript 与 CSS (Make JavaScript and CSS External)
3. 精简 JavaScript 与 CSS (Minify JavaScript and CSS)
4. 移除重复脚本 (Remove Duplicate Scripts)
1.优化图片
2 不要在 HTML 中使用缩放图片
3 使用恰当的图片格式
4 使用 CSS Sprites 技巧对图片优化
一、不用图片,尽可能用css3代替。 好比说要实现修饰效果,如半透明、边框、圆角、阴影、渐变等,在当前主流浏览器中均可以用CSS达成。
二、 使用矢量图SVG替代位图。对于绝大多数图案、图标等,矢量图更小,且可缩放而无需生成多套图。如今主流浏览器都支持SVG了,因此可放心使用!
3.、使用恰当的图片格式。咱们常见的图片格式有JPEG、GIF、PNG。
基本上,内容图片多为照片之类的,适用于JPEG。
而修饰图片一般更适合用无损压缩的PNG。
GIF基本上除了GIF动画外不要使用。且动画的话,也更建议用video元素和视频格式,或用SVG动画取代。
四、按照HTTP协议设置合理的缓存。
五、使用字体图标webfont、CSS Sprites等。
六、用CSS或JavaScript实现预加载。
七、WebP图片格式能给前端带来的优化。WebP支持无损、有损压缩,动态、静态图片,压缩比率优于GIF、JPEG、JPEG2000、PG等格式,很是适合用于网络等图片传输。
矢量图:图标字体,如 font-awesome;svg
位图:gif,jpg(jpeg),png
区别:
一、gif:是是一种无损,8位图片格式。具备支持动画,索引透明,压缩等特性。适用于作色彩简单(色调少)的图片,如logo,各类小图标icons等。
二、JPEG格式是一种大小与质量相平衡的压缩图片格式。适用于容许轻微失真的色彩丰富的照片,不适合作色彩简单(色调少)的图片,如logo,各类小图标icons等。
三、png:PNG能够细分为三种格式:PNG8,PNG24,PNG32。后面的数字表明这种PNG格式最多能够索引和存储的颜色值。
关于透明:PNG8支持索引透明和alpha透明;PNG24不支持透明;而PNG32在24位的PNG基础上增长了8位(256阶)的alpha通道透明;
优缺点:
一、能在保证最不失真的状况下尽量压缩图像文件的大小。
二、对于须要高保真的较复杂的图像,PNG虽然能无损压缩,但图片文件较大,不适合应用在Web页面上。
1.解析HTML文件,建立DOM树。
自上而下,遇到任何样式(link、style)与脚本(script)都会阻塞(外部样式不阻塞后续外部脚本的加载)。
2.解析CSS。优先级:浏览器默认设置<用户设置<外部样式<内联样式<HTML中的style样式;
3.将CSS与DOM合并,构建渲染树(Render Tree)
4.布局和绘制,重绘(repaint)和重排(reflow)
基本流程:
a. 域名解析
b. 发起TCP的3次握手
c. 创建TCP链接后发起http请求
d. 服务器端响应http请求,浏览器获得html代码
e. 浏览器解析html代码,并请求html代码中的资源
f. 浏览器对页面进行渲染呈现给用户