交换两将一个数组的值赋值给另一个数组元素 我的代码怎么运行没结果呀?

1. javascript的typeof返回哪些数据类型.答案:string,boolean,number,undefined,function,object2. 例举3种强制类型转换和2种隐式类型转换答案:强制(parseInt,parseFloat,number)隐式(== ===)3. split() join() 的区别答案:前者是将字符串切割成数组的形式,后者是将数组转换成字符串4. 数组方法pop() push() unshift() shift()答案:push()尾部添加 pop()尾部删除unshift()头部添加 shift()头部删除5. IE和标准下有哪些兼容性的写法答案:var ev = ev window.event document.documentElement.clientWidth document.body.clientWidth Var target = ev.srcElement ev.target 6. ajax请求的时候get 和post方式的区别答案:一个在url后面 ,一个放在虚拟载体里面get有大小限制(只能提交少量参数)安全问题应用不同 ,请求数据和提交数据7. call和apply的区别答案:Object.call(this,obj1,obj2,obj3) Object.apply(this,arguments) 8. ajax请求时,如何解析json数据答案:使用JSON.parse9. 事件委托是什么答案: 利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!10. 闭包是什么,有什么特性,对页面有什么影响答案:闭包就是能够读取其他函数内部变量的函数,使得函数不被GC回收,如果过多使用闭包,容易导致内存泄露11. 如何阻止事件冒泡答案:ie:阻止冒泡ev.cancelBubble = true;非IE ev.stopPropagation();12. 如何阻止默认事件答案:(1)return false;(2) ev.preventDefault();13. 添加 删除 替换 插入到某个接点的方法答案:1)创建新节点 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节点 2)添加、移除、替换、插入 appendChild() //添加 removeChild() //移除 replaceChild() //替换 insertBefore() //插入 3)查找 getElementsByTagName() //通过标签名称 getElementsByName() //通过元素的Name属性的值 getElementById() //通过元素Id,唯一性 14. 解释jsonp的原理,以及为什么不是真正的ajax答案:动态创建script标签,回调函数Ajax是页面无刷新请求数据操作15. document load 和document ready的区别答案:document.onload 是在结构和样式,外部js以及图片加载完才执行jsdocument.ready是dom树创建完成就执行的方法,原生种没有这个方法,jquery中有 $().ready(function)16. ””和“=”的不同答案:前者会自动转换类型,再判断是否相等后者不会自动类型转换,直接去比较17. 函数声明与函数表达式的区别?在Javscript中,解析器在向执行环境中加载数据时,对函数声明和函数表达式并非是一视同仁的,解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问),至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解析执行。18. 对作用域上下文和this的理解,看下列代码:var User = { count: 1, getCount: function() { return this.count; } }; console.log(User.getCount()); // what? var func = User.getCount; console.log(func()); // what? 问两处console输出什么?为什么?答案:是1和undefined。  func是在window的上下文中被执行的,所以不会访问到count属性。19. 看下面代码,给出输出结果。for(var i = 1; i <= 3; i++){ //建议使用let 可正常输出i的值 setTimeout(function(){ console.log(i); },0); }; 答案:4 4 4。原因:Javascript事件处理器在线程空闲之前不会运行。20. 当一个DOM节点被点击时候,我们希望能够执行一个函数,应该怎么做box.onlick= function(){} box.addEventListener("click",function(){},false); 21. Javascript的事件流模型都有什么“事件冒泡”:事件开始由最具体的元素接受,然后逐级向上传播“事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的“DOM事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡22. 看下列代码,输出什么解释原因。var a = null; alert(typeof a); 答案:object解释:null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以用typeof检测会返回”object”。23. 判断字符串以字母开头,后面可以是数字,下划线,字母,长度为6-30var reg=/^[a-zA-Z]w{5,29}$/; 24. 回答以下代码,alert的值分别是多少? 正确答案是: 100, 10, 1025. javaScript的2种变量范围有什么不同?全局变量:当前页面内有效局部变量:函数方法内有效26. null和undefined的区别?null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。当声明的变量还未被初始化时,变量的默认值为undefined。 null用来表示尚未存在的对象undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:(1)变量被声明了,但没有赋值时,就等于undefined。(2)调用函数时,应该提供的参数没有提供,该参数等于undefined。(3)对象没有赋值的属性,该属性的值为undefined。(4)函数没有返回值时,默认返回undefined。null表示"没有对象",即该处不应该有值。典型用法是:(1) 作为函数的参数,表示该函数的参数不是对象。(2) 作为对象原型链的终点。27. new操作符具体干了什么呢1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。2、属性和方法被加入到 this 引用的对象中。3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。28. js延迟加载的方式有哪些?defer和async、动态创建DOM方式(创建script,插入到DOM中,加载完毕后callBack)、按需异步载入js29. Flash、Ajax各自的优缺点,在使用中如何取舍?Flash ajax对比(1)Flash适合处理多媒体、矢量图形、访问机器;对CSS、处理文本上不足,不容易被搜索。(2)ajax对CSS、文本支持很好,支持搜索;多媒体、矢量图形、机器访问不足。共同点:与服务器的无刷新传递消息、用户离线和在线状态、操作DOM30. 写一个获取非行间样式的函数function getStyle(obj,attr) { if(obj.currentStyle) { return obj.currentStyle[attr]; }else{ getComputedStyle(obi,false)[attr] } } 31. 希望获取到页面中所有的checkbox怎么做?(不使用第三方框架)var inputs = document.getElementsByTagName("input");//获取所有的input标签对象 var checkboxArray = [];//初始化空数组,用来存放checkbox对象。 for(var i=0;i array[j + 1]){ temp = array[j + 1]; array[j + 1] = array[j]; array[j] = temp; } } 51、js 实现一个函数对javascript中json 对象进行克隆var oldObject ="sdf"; var newObject = JSON.parse(JSON.stringify(oldObject)); console.log(newObject); 或者 var a = 'dddd'; function cp(a){return JSON.parse(JSON.stringify(a))} console.log(cp(a)); 52、js 实现 ajax 请求或者submit请求时 锁屏功能以及开锁功能(请求时界面Loading以及元素不能点击,请求完成即消除Loading)function(url, fn) { var obj = new XMLHttpRequest(); // XMLHttpRequest对象用于在后台与服务器交换数据 obj.open('GET', url, true); obj.onreadystatechange = function() { if(obj.readyState == 4 && obj.status == 200 obj.status == 304) { loading.style.display = "none" } else { alert("不能点击,哈哈哈!"); } }; obj.send(null); } 53、js 实现一个函数 获得url参数的值function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } 54、请用js计算1-10000中出现的0 的次数new Array(10000).fill('').map((_, index) => index + 1).filter(item => /0/.test(item)).reduce((count, item) => { return count + (String(item).match(/0/g) []).length}, 0) 55、写一个function,清除字符串前后的空格。(兼容所有浏览器)function trim(str) { if (str & typeof str === "string") { return str.replace(/(^s*)|(s*)$/g,""); //去除前后空白符 } } 56、降维数组var arr=[[1,2],[3,4]]; function Jw(obj){ return Array.prototype.concat.apply([],obj); } Jw(arr); 57、将url的查询参数解析成字典对象··· function getQueryObject(url) { url = url == null ? window.location.href : url; var search = url.substring(url.lastIndexOf("?") + 1); var obj = {}; var reg = /([?&=]+)=([?&=]*)/g; search.replace(reg, function (rs, 2) { var name = decodeURIComponent(2); val = String(val); obj[name] = val; return rs; }); return obj; } ··· 58、判断一个字符串中出现次数最多的字符,统计这个次数··· var str = 'asdfssaaasasasasaa'; 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 iMax = 0; var iIndex = ''; for(var i in json){ if(json[i]>iMax){ iMax = json[i]; iIndex = i; } } alert('出现次数最多的是:'+iIndex+'出现'+iMax+'次'); ···59、编写一个方法 求一个字符串的字节长度;//假设一个中文占两个字节 var str = '22两是'; alert(getStrlen(str)) function getStrlen(str){ var json = {len:0}; var re = /[一-龥]/; for (var i = 0; i < str.length; i++) { if(re.test(str.charAt(i))){ json['len']++; } }; return json['len']+str.length; } 60、编写一个方法 去掉一个数组的重复元素var arr = [1,2,3,1,43,12,12,1]; var json = {}; var arr2 = []; for (var i = 0; i < arr.length; i++) { if(!json[arr[i]]){ json[arr[i]] = true; }else{ json[arr[i]] = false; } if(json[arr[i]]){ arr2.push(arr[i]); } }; for (var i = 0; i < arr.length; i++) { if(!aa(arr[i], arr2)){ arr2.push(arr[i]) } }; function aa(obj, arr){ for (var i = 0; i < arr.length; i++) { if(arr[i] == obj) return true; else return false; }; } alert(arr2) 61、写出3个使用this的典型应用事件: 如onclick this->发生事件的对象构造函数 this->new 出来的objectcall/apply 改变this62、如何深度克隆··· var arr = [1,2,43]; var json = {a:6,b:4,c:[1,2,3]}; var str = 'sdfsdf'; var json2 = clone(json); alert(json['c']) function clone(obj){ var oNew = new obj.constructor(obj.valueOf()); if(obj.constructor == Object){ for(var i in obj){ oNew[i] = obj[i]; if(typeof(oNew[i]) == 'object'){ clone(oNew[i]); } } } return oNew; } ··· 63、JavaScript中如何检测一个变量是一个String类型?请写出函数实现··· typeof(obj) == 'string' obj.constructor == String; ··· 64、网页中实现一个计算当年还剩多少时间的倒数计时程序,要求网页上实时动态显示“××年还剩××天××时××分××秒”··· var oDate = new Date(); var oYear = oDate.getFullYear(); var oNewDate = new Date(); oNewDate.setFullYear(oYear, 11, 31, 23, 59, 59); var iTime = oNewDate.getTime()-oDate.getTime(); var iS = iTime/1000; var iM = oNewDate.getMonth()-oDate.getMonth(); var iDate =iS ··· 65、请解释一下什么是语义化的HTML。内容使用特定标签,通过标签就能大概了解整体页面的布局分布66、为什么利用多个域名来存储网站资源会更有效?确保用户在不同地区能用最快的速度打开网站,其中某个域名崩溃用户也能通过其他郁闷访问网站67、请说出三种减低页面加载时间的方法1、压缩css、js文件2、合并js、css文件,减少http请求3、外部js、css文件放在最底下4、减少dom操作,尽可能用变量替代不必要的dom操作68、什么是FOUC?你如何来避免FOUC?由于css引入使用了@import 或者存在多个style标签以及css文件在页面底部引入使得css文件加载在html之后导致页面闪烁、花屏用link加载css文件,放在head标签里面69、文档类型的作用是什么?你知道多少种文档类型?影响浏览器对html代码的编译渲染html2.0xHtmlhtml570、浏览器标准模式和怪异模式之间的区别是什么?盒模型解释不同71、闭包子函数能被外部调用到,则该作用连上的所有变量都会被保存下来。72、请解释什么是Javascript的模块模式,并举出实用实例。js模块化mvc(数据层、表现层、控制层)seajs命名空间73、你如何组织自己的代码?是使用模块模式,还是使用经典继承的方法?对内:模块模式对外:继承74、你如何优化自己的代码?代码重用避免全局变量(命名空间,封闭空间,模块化mvc…)拆分函数避免函数过于臃肿注释75、你能解释一下JavaScript中的继承是如何工作的吗?子构造函数中执行父构造函数,并用callapply改变this克隆父构造函数原型上的方法76、请尽可能详尽的解释AJAX的工作原理。创建ajax对象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp))判断数据传输方式(GET/POST)打开链接 open()发送 send()当ajax对象完成第四步(onreadystatechange)数据接收完成,判断http响应状态(status)200-300之间或者304(缓存)执行回调函数77、最简单的一道题··· var a = 2, b = 3; var c = a+++b; // c = 5 ··· 78、var和function的预解析问题,以及变量和function的先后顺序的问题··· // 以下代码执行输出结果是什么 function b () { console.log(a); var a = 10; function a() {}; a = 100; console.log(a); } b(); function c () { console.log(a); function a() {}; var a = 10; a = 100; console.log(a); } c(); (function d (num) { console.log(num); var num = 10; }(100)) (function e (num) { console.log(num); var num = 10; function num () {}; }(100)) (function f (num) { function num () {}; console.log(num); var num =10 console.log(num); }(100)) //仍然是预解析(在与解析过程中还要考虑一下当前变量的作用于) function m () { console.log(a1); // underfined console.log(a2); // underfined console.log(b1); // underfined console.log(b2); // underfined if(false) { function b1 (){}; var a1 = 10; } if(true) { function b2 (){}; var a2 = 10; } console.log(a1); // underfined console.log(a2); // 10 console.log(b1); // underfined console.log(b2); // function } m(); function n() { if(2>1) { arr = 10; brr = 10; let arr; var brr; console.log(arr); console.log(brr); } } n(); // ReferenceError ··· 79、dom事件委托什么原理,有什么优缺点事件委托原理:事件冒泡机制优点1.可以大量节省内存占用,减少事件注册。比如ul上代理所有li的click事件就很不错。2.可以实现当新增子对象时,无需再对其进行事件绑定,对于动态内容部分尤为合适缺点事件代理的常用应用应该仅限于上述需求,如果把所有事件都用事件代理,可能会出现事件误判。即本不该被触发的事件被绑定上了事件。80、http的cache机制,以及200状态下怎么实现 from cache(表示接触最多的就是304的from cache)(用于优化,没有接触过,需要理解)含义定义:浏览器缓存(Browser Caching)是为了加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览。作用cache的作用:1、减少延迟,让你的网站更快,提高用户体验。2、避免网络拥塞,减少请求量,减少输出带宽。实现手段Cache-Control中的max-age是实现内容cache的主要手段,共有3种常用策略:max-age和Last-Modified(If-Modified-Since)的组合、仅max-age、max-age和ETag的组合。对于强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接用缓存,不在时间内,执行比较缓存策略。对于比较缓存,将缓存信息中的Etag和Last-Modified通过请求发送给服务器,由服务器校验,返回304状态码时,浏览器直接使用缓存。81、一个原型链继承的问题// 有一个构造函数A,写一个函数B,继承Afunction A (num) {this.titileName = num;}A.prototype = {fn1: function () {},fn2: function () {}}这个问题的关注点是B继承的A的静态属性,同时B的原型链中不存在A实例的titleName属性82、什么是虚拟domReact为啥这么大?因为它实现了一个虚拟DOM(Virtual DOM)。虚拟DOM是干什么的?这就要从浏览器本身讲起如我们所知,在浏览器渲染网页的过程中,加载到HTML文档后,会将文档解析并构建DOM树,然后将其与解析CSS生成的CSSOM树一起结合产生爱的结晶——RenderObject树,然后将RenderObject树渲染成页面(当然中间可能会有一些优化,比如RenderLayer树)。这些过程都存在与渲染引擎之中,渲染引擎在浏览器中是于JavaScript引擎(JavaScriptCore也好V8也好)分离开的,但为了方便JS操作DOM结构,渲染引擎会暴露一些接口供JavaScript调用。由于这两块相互分离,通信是需要付出代价的,因此JavaScript调用DOM提供的接口性能不咋地。各种性能优化的最佳实践也都在尽可能的减少DOM操作次数。而虚拟DOM干了什么?它直接用JavaScript实现了DOM树(大致上)。组件的HTML结构并不会直接生成DOM,而是映射生成虚拟的JavaScript DOM结构,React又通过在这个虚拟DOM上实现了一个 diff 算法找出最小变更,再把这些变更写入实际的DOM中。这个虚拟DOM以JS结构的形式存在,计算性能会比较好,而且由于减少了实际DOM操作次数,性能会有较大提升83、js基础数据类型和引用类型分别是什么?这个前提条件下写一个getType,返回相应的类型1.基本数据类型(自身不可拆分的):Undefined、Null、Boolean、Number、String2.引用数据类型(对象):Object (Array,Date,RegExp,Function)ES6基本数据类型多了个symbolfunction gettype(nm){ return Object.prototype.toString.call(nm); } 84、 dom选择器优先级是什么,以及权重值计算(一道老问题了)1.行内样式 10002.id 01003.类选择器、伪类选择器、属性选择器[type=“text”] 00104.标签选择器、伪元素选择器(::first-line) 00015.通配符*、子选择器、相邻选择器 000085、vue双向数据绑定的原理是什么首先传输对象的双向数据绑定 Object.defineProperty(target, key, decription),在decription中设置get和set属性(此时应注意description中get和set不能与描述属性共存)数组的实现与对象不同。同时运用观察者模式实现wather,用户数据和view视图的更新86、 react和vue比较来说有什么区别1 component层面,web component和virtual dom2 数据绑定(vue双向,react的单向)等好多3 计算属性 vue 有,提供方便;而 react 不行4 vue 可以 watch 一个数据项;而 react 不行5 vue 由于提供的 direct 特别是预置的 directive 因为场景场景开发更容易;react 没有6 生命周期函数名太长 directive87、git使用过程中,如果你在开发着业务,突然另一个分支有一个bug要改,你怎么办git stash //将本次修改存到暂存区(紧急切换分支时)git stash pop //将所有暂存区的内容取出来88、 网页布局有哪几种,有什么区别静态、自适应、流式、响应式四种网页布局静态布局:意思就是不管浏览器尺寸具体是多少,网页布局就按照当时写代码的布局来布置;自适应布局:就是说你看到的页面,里面元素的位置会变化而大小不会变化;流式布局:你看到的页面,元素的大小会变化而位置不会变化——这就导致如果屏幕太大或者太小都会导致元素无法正常显示。自适应布局:每个屏幕分辨率下面会有一个布局样式,同时位置会变而且大小也会变。89、执行下面代码var a = {}; var b = {key: 'b'}; var c = {key: 'c'}; var d = [3,5,6]; a[b] = 123; a[c] = 345; a[d] = 333; console.log(a[b]); // 345 console.log(a[c]); // 345 console.log(a[d]); // 333 90、 var R = (function() { var u = {a:1,b:2}; var r = { fn: function(k) { return u[k]; } } return r; }()); R.fn('a'); // 1 上述代码中如何获取匿名函数中的u91、不适用循环语句(包括map、forEach方法)实现一个100长度的数组,索引值和值相同的数组[0,1,2,3,4,5…99]var arr = new Array(100); //方法1 [...arr.keys()]; //方法二 Array.from(arr.keys()); //方法三 Array.from({length: 100}); // 方法四 借助string var arr1 = new Array(101); var str = arr1.join('1,'); str = str.replace(/(1,)/g, function ($0, $1, index) { var start = '' + Math.ceil(index/2); if(index < str.length - 2) { start += ',' } return start; }); return str.split(','); // 方法五(函数式,参考网络) function reduce(arr, val) { if(Object.prototype.toString.apply(val)){ return; } if(val >= 100) { return arr; } arr.push(val); return reduce(arr, val+1); } var res = reduce([], 0) 92、下面语句执行结果输出var a = function (val, index) { console.log(index); return { fn: function (name) { return a(name, val); } } } var b = a(0); // underfined b.fn(1); // 0 b.fn(2); // 0 b.fn(3); // 0 93、科普dom节点的根节点是不是body回答: 不是,dom节点的根节点是html(包含head和body,head中分为meta、title等。body又分为一组)2)dom元素都会有offsetParent吗回答: offsetParent属性返回一个对象的引用,这个对象是距离调用offsetParent的元素最近的(在包含层次中最靠近的),并且是已进行过CSS定位的容器元素。 如果这个容器元素未进行CSS定位, 则offsetParent属性的取值为根元素(在标准兼容模式下为html元素;在怪异呈现模式下为body元素)的引用。 当容器元素的style.display 被设置为 "none"时(译注:IE和Opera除外),offsetParent属性 返回 null。[1,3,5]转译成字符串是什么回答: ‘1,3,5’调用toString方法,生成该字符串4)li标签的祖级元素可以为li,父级元素也可以为例回答: 错误94、 jsonp原理,jquery是怎么实现的,这样实现有什么好处和坏处原理在同源策略下;在某个服务器下的页面是无法获取到该服务器以外的数据的;Jquery中ajax 的核心是通过 XmlHttpRequest获取非本页内容,而jsonp的核心则是动态添加$.ajax({url: ‘http://192.168.1.114/yii/demos/test.php’, //不同的域type: ‘GET’, // jsonp模式只有GET 是合法的data: {‘action’: ‘aaron’},dataType: ‘jsonp’, // 数据类型jsonp: ‘backfunc’, // 指定回调函数名,与服务器端接收的一致,并回传回来})其实jquery 内部会转化成http://192.168.1.114/yii/demos/test.phpbackfunc=jQuery2030038573939353227615_1402643146875&action=aaron然后动态加载手动测试目标网站上有的input, textarea等所有可能输入文本信息的区域2. 自动攻击利用工具扫描目标网站所有的网页并自动测试写好的注入脚本,比如:Burpsuite等防御方法:1. 将cookie等敏感信息设置为httponly,禁止Javascript通过document.cookie获得2. 对所有的输入做严格的校验尤其是在服务器端,过滤掉任何不合法的输入,比如手机号必须是数字,通常可以采用正则表达式3. 净化和过滤掉不必要的html标签,比如:, alt,2.SQL注入攻击方法:编写恶意字符串,比如‘ or 1=1–等,手动测试目标网站上所有涉及数据库操作的地方防御方法:1. 禁止目标网站利用动态拼接字符串的方式访问数据库2. 减少不必要的数据库抛出的错误信息3. 对数据库的操作赋予严格的权限控制4. 净化和过滤掉不必要的SQL保留字,比如:where, or, exec 等5. 转义单引号,上引号,尖括号等特殊字符,可以采用htmlencode编码 或者过滤掉这些特殊字符3.CSRF,也就是跨站请求伪造就是攻击者冒用用户的名义,向目标站点发送请求防范方法:1. 在客户端进行cookie的hashing,并在服务端进行hash认证2. 提交请求是需要填写验证码3. 使用One-Time Tokens为不同的表单创建不同的伪随机值101、 sessionStorage和localstorage能跨域拿到吗?比如我在www.baidu.com设置的值能在m.baidu.com能拿到吗?为什么localStorage会跟cookie一样受到跨域的限制,会被document.domain影响102、 localstorage不能手动删除的时候,什么时候过期除非被清除,否则永久保存 clear()可清楚sessionStorage 仅在当前会话下有效,关闭页面或浏览器后被清除103、cookie可以设置什么域?可以设置.com吗可以通过设置domin来实现104、 flux -> redux -> mobx 变化的本质是什么存储结构 将对象加工可观察 函数式 vs 面向对象https://zhuanlan.zhihu.com/p/…105、get和post有什么区别?get可以通过body传递数据吗把数据放到 body 里面,必须用 POST 方式取,这是 HTTP 协议限制的。106、右边宽度固定,左边自适应第一种:
第二种
107、水平垂直居中第一种 #container{ position:relative; } #center{ width:100px; height:100px; position:absolute; top:50%; left:50%; transform: translate(-50%,-50%); } 第二种 #container{ position:relative; } #center{ width:100px; height:100px; position:absolute; top:50%; left:50%; margin:-50px 0 0 -50px; } 第三种 #container{ position:relative; } #center{ position:absolute; margin:auto; top:0; bottom:0; left:0; right:0; } 第四种 flex #container{ display:flex; justify-content:center; align-items: center; } 108、.四种定位的区别static 是默认值relative 相对定位 相对于自身原有位置进行偏移,仍处于标准文档流中absolute 绝对定位 相对于最近的已定位的祖先元素, 有已定位(指position不是static的元素)祖先元素, 以最近的祖先元素为参考标准。如果无已定位祖先元素, 以body元素为偏移参照基准, 完全脱离了标准文档流。fixed 固定定位的元素会相对于视窗来定位,这意味着即便页面滚动,它还是会停留在相同的位置。一个固定定位元素不会保留它原本在页面应有的空隙。109、封装一个函数,参数是定时器的时间,.then执行回调函数。function sleep (time) {return new Promise((resolve) => setTimeout(resolve, time));}110、一行代码实现数组去重?[…new Set([1,2,3,1,‘a’,1,‘a’])]111、使用addEventListener点击li弹出内容,并且动态添加li之后有效```java
  • 1
  • 2
  • 3
  • 4
var ulNode = document.getElementById("ul"); ulNode.addEventListener('click', function (e) { if (e.target && e.target.nodeName.toUpperCase() == "LI") { alert(e.target.innerHTML); } }, false); 112、怎么判断两个对象相等JSON.stringify(obj)==JSON.stringify(obj);//true113、Vue router 除了 router-link 怎么实现跳转router.go(1)router.push(’/’)114、Vue router 跳转和 location.href 有什么区别?router 是 hash 改变location.href 是页面跳转,刷新页面115、重排和重绘部分渲染树(或者整个渲染树)需要重新分析并且节点尺寸需要重新计算。这被称为重排。注意这里至少会有一次重排-初始化页面布局。由于节点的几何属性发生改变或者由于样式发生改变,例如改变元素背景色时,屏幕上的部分内容需要更新。这样的更新被称为重绘。116、什么情况会触发重排和重绘添加、删除、更新 DOM 节点通过 display: none 隐藏一个 DOM 节点-触发重排和重绘通过 visibility: hidden 隐藏一个 DOM 节点-只触发重绘,因为没有几何变化移动或者给页面中的 DOM 节点添加动画添加一个样式表,调整样式属性用户行为,例如调整窗口大小,改变字号,或者滚动。117、js bind 实现机制?手写一个 bind 方法?function bind(fn, context){ return function (){ return fn.apply(context, arguments); } } // 柯理化函数思想 感谢pursuitTom的提出 Function.prototype.bind = function (context) { var args = Array.prototype.slice.call(arguments, 1); var _this = this; return function () { var thisArgs = [].slice.call(arguments); return _this.apply(context, args.concat(thisArgs)) }; } // ES6写法 感谢waterc的提出 Function.prototype.bind = function(context, ...res) { let self = this return function(...arg) { return self.apply(context, [...res,...arg]) } } 118、多个函数var a = (function(){return '1';}, function(){return 1;})(); console.log(typeof a); //number 119、proto、prototype、Object.getPrototypeOf()__proto__是指内部原型,和Object.getPrototypeOf()结果等价function f(){}f.proto === Object.getPrototypeOf(f); //truef.prototype === Object.getPrototypeOf(f); //false120、setTimeout 和 setInterval 细谈常问的点,前者是在一定时间过后将函数添加至执行队列,执行时间=延迟时间+之前函数代码执行时间+执行函数时间。后者是不管前一次是否执行完毕,每隔一定时间重复执行,用于精准执行互相没有影响的重复操作。如果需要控制前后执行顺序,最好使用setTimeout模拟setIntervalvar time = 400, times = 0, max = 10; function func(){ times++; if(times < max){ //code here setTimeout(func, time); } else { console.log("finished"); } } setTimeout(func, time); 121、判断多图片加载完毕注:用jQueryObject.ready()只能判断dom结构加载完毕好像描述的不是很清楚,这里写一下代码。方法1:var counter = 0; var queryInterval = 30; //ms var pics = document.getElementsByClassName("pics"); function singleQuery(i){ if(pics[i].complete){ counter++; console.log(i + " is loaded"); } else { setTimeout(singleQuery, queryInterval, i); } } function allQuery(callback){ if(counter < pics.length){ console.log("current number of loaded pics: " + counter); setTimeout(allQuery, queryInterval, callback); } else { console.log("All pics are loaded."); callback(); } } for(var i = 0; i < pics.length; i++){ setTimeout(singleQuery, queryInterval, i); } setTimeout(allQuery, queryInterval, callback); 主要也是采用setTimeout模拟轮询,判断方式是img标签dom的complete属性(布尔值),缺点是定时器太多。 方法2: var counter = 0, queryInterval = 50; var pics = document.getElementsByClassName("pics"); for(var i = 0; i < pics.length; i++){ pics[i].onload = function(){ counter++; console.log(this.id + " is loaded"); } } function queryPictures(callback){ if(counter < pics.length){ console.log("current number of loaded pics: " + counter); setTimeout(queryPictures, queryInterval, callback); } else { console.log("All pics are loaded"); callback(); } } setTimeout(queryPictures, queryInterval, callback); 利用onload绑定图片加载成功后的回调,通过计数器判断是否加载完毕。 122、CSS margin重叠问题块元素在垂直方向上的margin是很奇怪的,会有重叠现象。如果display都是block,有三种情况:外间距均为正数,竖直方向上会选择最大的外边距作为间隔一正一负,间距 = 正 - 负|两个负,间距 = 0 - 绝对值最大的那个设置display: inline-block的盒子不会有margin重叠,position: absolute的也不会出现。123、CSS选择器优先级 && CSS选择器效率ID > 类 > 标签 > 相邻 > 子选择器 > 后代选择器 > * > 属性 > 伪类object.propertyIsEnumerable(xxx)判断对象中是否有xxx属性,并且能通过for in枚举,如Array对象的length是不可枚举的124、判断数组function isArray(arr){return Object.prototype.toString.call(arr) === ‘[Object Array]’;}125、git fetch && git pullgit pull自动完成了fetch最新远程版本,并且和本地进行mergegit fetch获得远程分支,要继续手动merge合并126、WebSocketHTML5带来的新协议,通过类似HTTP的请求建立连接。主要目的是可以获取服务端的推送。原来的方式可能是使用long poll(即不中断连接一直等待数据),或者是ajax轮询的方式(每隔一段时间发送请求,建立连接,询问是否有新的数据)。这两种方式的缺点在于long poll的阻塞,以及ajax轮询的冗余连接。WebSocket的设计思想有点类似于回调,在发送请求升级服务端的协议并收到确认信息后,服务端一有新的信息/数据就会主动推送给客户端,至于要一次HTTP握手便可以建立持久连接127、跨域相关只要协议、域名、端口有不同,则视为不同的域。(域名和域名对应的IP也是跨域)1.CORS: Cross-Origin Resource Sharing基于服务器支持的跨域,服务器设置Access-Control-Allow-Origin响应头,浏览器可允许跨域2.设置domain能从子域设到主域,如a.b.c.com—>b.c.com—>c.com具体情况:在页面中用iframe打开了另一个页面(前提:两个页面主域是相同的)利用frameElement.contentWindow.document.domain设置frame子页面的主域,document.domain设置主页面的主域,之后就能互相获取dom中的数据。缺点是只能用于不同子域间的交互。3.例如拥有src属性的img标签,每次改变src属性,都会发起http请求。var img = new Image(); img.onload = function(){ //code here }; img.onerror = function(){ //code here }; img.src="http://server.com/data?query=3"; 缺点是只能使用GET请求,不能获取数据,一般用于提交统计信息什么的。script、link、iframe只有在添加到DOM中才会发起请求4.HTML5 postMessage支持IE8+和主流浏览器,写法也简单…//source: http://test.org:4000//get the window object of target originvar win = window.open(“http://target.com”);//or this, when a frame is usedvar win = document.getElementById(“targetId”).contentWindow;win.postMessage(“data here”, “http://target.com/rest”);//target: http://target.com/tinyfunction handleMessage(event){if(event.orgin!=“http://test.org:4000”)return;var data = event.data;//code here//event.source is window.openerevent.source.postMessage(“response data here”, event.origin);}window.addEventListener(“message”, handleMessage, false);5.window.name即使在页面打开多层iframe后,每个iframe中window.name 属性值都是相同的,以此用作数据传输的工具。但由于跨域的限制,是无法获取另一个frame中的window.name数据,所以要使用一个同域的代理(proxy.html):jsonp目前主流跨域方法调用其他域的脚本获取数据,前提是另一个域能知道回调函数名,这个可以通过请求发送给目标域。直接写jQuery封的jsonp$.getJSON(“http://target.com/datacallback=callbackFunctionName”, function(data){});$.getJSON会把获取的responseText转为json,如果url中有callback参数,数据会以script标签形式获取。128、闭包相关什么是闭包闭包是指有权访问另一个函数作用域中变量的函数怎么创建闭包在函数内部嵌套使用函数function fn() { for (var i = 0; i < 2; i++) { (function () { var variate = i; setTimeout(function () { console.log("setTimeout执行后:"+variate); }, 1000); })();//闭包,立即执行函数,匿名函数 } console.log(i);//2 console.log(variate);//variate is not defined } fn(); 为什么用闭包因为在闭包内部保持了对外部活动对象的访问,但外部的变量却无法直接访问内部,避免了全局污染;可以当做私有成员,弥补了因js语法带来的面向对象编程的不足;可以长久的在内存中保存一个自己想要保存的变量.闭包的缺点可能导致内存占用过多,因为闭包携带了自身的函数作用域闭包只能取得外部包含函数中得最后一个值详见https://segmentfault.com/a/11…129、a:active 移动端实现有时候一些按钮的简单点击交互可以通过css伪类来实现;必须点击了更改颜色;松开恢复;IOS手机会出现伪类无效的情况;iOS系统的移动设备中,需要在按钮元素或body/html上绑定一个touchstart事件才能激活:active状态。document.body.addEventListener(‘touchstart’, function () { //…空函数即可});130、ios滑动卡顿-webkit-overflow-scrolling:touch 可能会在IOS系统低的情况出现滚动条;尝试溢出解决131、forEach和map的区别相同点都是循环遍历数组中的每一项forEach和map方法里每次执行匿名函数都支持3个参数,参数分别是item(当前每一项)、index(索引值)、arr(原数组)匿名函数中的this都是指向window只能遍历数组都有兼容问题不同点map速度比foreach快map会返回一个新数组,不对原数组产生影响,foreach不会产生新数组,map因为返回数组所以可以链式操作,foreach不能132、浅拷贝和深拷贝jQuery.extend第一个参数可以是布尔值,用来设置是否深度拷贝的jQuery.extend(true, { a : { a : “a” } }, { a : { b : “b” } } );jQuery.extend( { a : { a : “a” } }, { a : { b : “b” } } );最简单的深拷贝aa = JSON.parse( JSON.stringify(a) )浅复制—>就是将一个对象的内存地址的“”编号“”复制给另一个对象。深复制—>实现原理,先新建一个空对象,内存中新开辟一块地址,把被复制对象的所有可枚举的(注意可枚举的对象)属性方法一一复制过来,注意要用递归来复制子对象里面的所有属性和方法,直到子子…属性为基本数据类型。总结,深复制理解两点,1,新开辟内存地址,2,递归来刨根复制。133、外边距合并外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。134、js加载位置区别优缺点html文件是自上而下的执行方式,但引入的css和javascript的顺序有所不同,css引入执行加载时,程序仍然往下执行,而执行到但又不能将所有的script放在body之后,因为有一些页面的效果的实现,是需要预先动态的加载一些js脚本。所以这些脚本应该放在之前。其次,不能将需要访问dom元素的js放在body之前,因为此时还没有开始生成dom,所以在body之前的访问dom元素的js会出错,或者无效script放置位置的原则“页面效果实现类的js应该放在body之前,动作,交互,事件驱动,需要访问dom属性的js都可以放在body之后转载:https://www.jianshu.com/p/f1f39d5b2a2e}

想知道自己什么水平就出去面试....
2017-10-19更新:修改22题深浅拷贝的答案2017-10-18更新:修正部分题目答案,答案并非十分准确,仅供参考,此文部分题目答案故意省掉了一些高精尖、新奇特的东西,比如创建对象我写了三种,《JS高程》上可不止三种,一切以常用记得住的为宗旨,所以,对于部分答案有疑问的同学,可以留言讨论或自行斟酌2017-10-12更新:有部分题目属于后端范畴,或者是大前端范畴,因为我以前做Java后端的,故偶尔会遇到后端相关的一些问题,但是没有遇到问纯Java技术问题。如果你对某些后端题目不理解就直接跳过吧。部分题目来自慕课网实战课程《前端跳槽面试必备技巧》,课程里的一些题目确实被面试问到过金九银十,在九月之前把工作落实了,经历了好几个公司的面试,得到一些信息,和大家分享:大部分公司(创业公司)都趋向于招一个牛逼的前端而不是三四个平庸的前端
性能优化、ES6必问
招聘要求上清一色的要求有一门后端语言的经验,但似乎面试的时候并没有一个公司问过我后端语言方面的东西
招聘要求写的和面试相关性并不是很高
招人的要求越来越高,不要轻易离职,特别是裸辞
以下是我整理我面试遇到的一些我觉得具有代表性的题目,刚好30题,吐血献上!0.谈谈对前端安全的理解,有什么,怎么防范前端安全问题主要有XSS、CSRF攻击XSS:跨站脚本攻击它允许用户将恶意代码植入到提供给其他用户使用的页面中,可以简单的理解为一种javascript代码注入。XSS的防御措施:过滤转义输入输出
避免使用eval、new Function等执行字符串的方法,除非确定字符串和用户输入无关
使用cookie的httpOnly属性,加上了这个属性的cookie字段,js是无法进行读写的
使用innerHTML、document.write的时候,如果数据是用户输入的,那么需要对象关键字符进行过滤与转义
CSRF:跨站请求伪造其实就是网站中的一些提交行为,被黑客利用,在你访问黑客的网站的时候进行操作,会被操作到其他网站上CSRF防御措施:检测http referer是否是同域名
避免登录的session长时间存储在客户端中
关键请求使用验证码或者token机制
其他的一些攻击方法还有HTTP劫持、界面操作劫持1.使用箭头函数需要注意的地方当要求动态上下文的时候,你就不能使用箭头函数,比如:定义方法,用构造器创建对象,处理时间时用 this 获取目标。2.webpack.load的原理loaders是你用在app源码上的转换元件。他们是用node.js运行的,把源文件作为参数,返回新的资源的函数。 3.ES6 let、constletlet是更完美的varlet声明的变量拥有块级作用域,let声明仍然保留了提升的特性,但不会盲目提升。
let声明的全局变量不是全局对象的属性。不可以通过window.变量名的方式访问
形如for (let x…)的循环在每次迭代时都为x创建新的绑定
let声明的变量直到控制流到达该变量被定义的代码行时才会被装载,所以在到达之前使用该变量会触发错误。
const定义常量值,不可以重新赋值,但是如果值是一个对象,可以改变对象里的属性值const OBJ = {"a":1, "b":2};
OBJ.a = 3;
OBJ = {};// 重新赋值,报错!
console.log(OBJ.a); // 34.CSS3 box-sizing的作用设置CSS盒模型为标准模型或IE模型。标准模型的宽度只包括content,二IE模型包括border和paddingbox-sizing属性可以为三个值之一:content-box,默认值,border和padding不计算入width之内
padding-box,padding计算入width内
border-box,border和padding计算入width之内
5.说说HTML5中有趣的标签(新标签及语义化)如果代码写的语义化,有利于SEO。搜索引擎就会很容易的读懂该网页要表达的意思。例如文本模块要有大标题,合理利用h1-h6,列表形式的代码使用ul或ol,重要的文字使用strong等等。总之就是要充分利用各种HTML标签完成他们本职的工作6.git命令,如何批量删除分支git branch
grep 'branchName'
xargs git branch -D,从分支列表中匹配到指定分支,然后一个一个(分成小块)传递给删除分支的命令,最后进行删除。(参考这里)7.创建对象的三种方法第一种方式,字面量var o1 = {name: "o1"}第二种方式,通过构造函数var o2 = new Object({name: "o2"})
var M = function(name){ this.name = name }
var o3 = new M("o3")第三种方式,Object.createvar
p = {name: "p"}
var o4 = Object.create(p)新创建的对o4的原型就是p,同时o4也拥有了属性name8.JS实现继承的几种方式借用构造函数实现继承function Parent1(){
this.name = "parent1"
}
function Child1(){
Parent1.call(this);
this.type = "child1";
}缺点:Child1无法继承Parent1的原型对象,并没有真正的实现继承(部分继承)借用原型链实现继承function Parent2(){
this.name = "parent2";
this.play = [1,2,3];
}
function Child2(){
this.type = "child2";
}
Child2.prototype = new Parent2();缺点:原型对象的属性是共享的组合式继承function Parent3(){
this.name = "parent3";
this.play = [1,2,3];
}
function Child3(){
Parent3.call(this);
this.type = "child3";
}
Child3.prototype = Object.create(Parent3.prototype);
Child3.prototype.constructor = Child3;9.当new Foo()时发生了什么1.创建了一个新对象2.将新创建的空对象的隐式原型指向其构造函数的显示原型。3.将this指向这个新对象4.如果无返回值或者返回一个非对象值,则将新对象返回;如果返回值是一个新对象的话那么直接直接返回该对象。参考《JS高程》6.2.210.你做过哪些性能优化雪碧图,移动端响应式图片,静态资源CDN,减少Dom操作(事件代理、fragment),压缩JS和CSS、HTML等,DNS预解析11.浏览器渲染原理首先来看一张图:HTML被解析成DOM Tree,CSS被解析成CSS Rule Tree
把DOM Tree和CSS Rule Tree经过整合生成Render Tree(布局阶段)
元素按照算出来的规则,把元素放到它该出现的位置,通过显卡画到屏幕上
更多详情看这里
12.前端路由的原理什么是路由?简单的说,路由是根据不同的 url 地址展示不同的内容或页面使用场景?前端路由更多用在单页应用上, 也就是SPA, 因为单页应用, 基本上都是前后端分离的, 后端自然也就不会给前端提供路由。前端的路由和后端的路由在实现技术上不一样,但是原理都是一样的。在 HTML5 的 history API 出现之前,前端的路由都是通过 hash 来实现的,hash 能兼容低版本的浏览器。两种实现前端路由的方式HTML5 History两个新增的API:history.pushState 和 history.replaceState,两个 API 都会操作浏览器的历史记录,而不会引起页面的刷新。Hash就是url 中看到 # ,我们需要一个根据监听哈希变化触发的事件( hashchange) 事件。我们用 window.location 处理哈希的改变时不会重新渲染页面,而是当作新页面加到历史记录中,这样我们跳转页面就可以在 hashchange 事件中注册 ajax 从而改变页面内容。优点从性能和用户体验的层面来比较的话,后端路由每次访问一个新页面的时候都要向服务器发送请求,然后服务器再响应请求,这个过程肯定会有延迟。而前端路由在访问一个新页面的时候仅仅是变换了一下路径而已,没有了网络延迟,对于用户体验来说会有相当大的提升。
更多内容请看这里
缺点使用浏览器的前进,后退键的时候会重新发送请求,没有合理地利用缓存。13.Restful API是什么Restful的意思就是表现层状态转化。
"表现层"其实指的是"资源"(Resources)的"表现层",把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。
所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在,每一个URI代表一种资源。
如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。
Restful就是客户端和服务器之间,传递这种资源的某种表现层
客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"
Restful API就是符合Restful架构的API设计。Restful API一些具体实践:应该尽量将API部署在专用域名之下。如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。
应该将API的版本号放入URL。
对于资源的具体操作类型,由HTTP动词表示
如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果
如果状态码是4xx,就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名.....
14.script标签的defer、async的区别defer是在HTML解析完之后才会执行,如果是多个,按照加载的顺序依次执行async是在加载完成后立即执行,如果是多个,执行顺序和加载顺序无关15.同源与跨域什么是同源策略?限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。一个源指的是主机名、协议和端口号的组合,必须相同跨域通信的几种方式JSONP
Hash
postMessage
WebSocket
CORS
JSONP原理基本原理:利用script标签的异步加载特性实现给服务端传一个回调函数,服务器返回一个传递过去的回调函数名称的JS代码
更多请查看:《前后端通信类知识》
16.原型与闭包相关问题原型是什么原型就是一个普通的对象,每个对象都有一个原型(Object除外),原型能存储我们的方法,构造函数创建出来的实例对象能够引用原型中的方法。查看原型以前一般使用对象的__proto__属性,ES6推出后,推荐用Object.getPrototypeOf()方法来获取对象的原型闭包是什么?专业说法:当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。还可以这么理解:闭包就是一个具有封闭功能与包裹功能的结构,是为了实现具有私有访问空间的函数的,函数可以构成闭包,因为函数内部定义的数据函数外部无法访问,即函数具有封闭性;函数可以封装代码即具有包裹性,所以函数可以构成闭包。创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量闭包的特性闭包有三个特性:函数嵌套函数
函数内部可以引用外部的参数和变量
参数和变量不会被垃圾回收机制回收
闭包有什么用,使用场景当我们需要在模块中定义一些变量,并希望这些变量一直保存在内存中但又不会“污染”全局的变量时,就可以用闭包来定义这个模块。闭包的缺点闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。函数套函数就是闭包吗?不是!,当一个内部函数被其外部函数之外的变量引用时,才会形成了一个闭包。
更多内容请看这里
17.如何进行错误监控前端错误的分类即时运行错误(代码错误)
资源加载错误
错误的捕获方式即时运行错误的捕获方式:try...catch
window.onerror
资源加载错误:object.onerror(如img,script)
performance.getEntries()
Error事件捕获
延伸:跨域的js运行错误可以捕获吗,错误提示什么,应该怎么处理?可以。Script error1.在script标签增加crossorigin属性2.设置js资源响应头Access-Control-Allow-Orgin:*
上报错误的基本原理采用Ajax通信方式上报利用Image对象上报18.DOM事件类DOM事件的级别DOM0,element.onclick = function(){}
DOM2,element.addEventListener('click', function(){}, false);
DOM事件模型是什么:指的是冒泡和捕获DOM事件流是什么:捕获阶段 -> 目标阶段 -> 冒泡阶段描述DOM事件捕获的具体流程window --> document --> documentElement(html标签) --> body --> .... --> 目标对象Event对象常见应用event.preventDefault(),阻止默认行为
event.stopPropagation(),阻止事件冒泡
event.stopImmediatePropagation(),阻止剩余的事件处理函数执行并且防止事件冒泡到DOM树上,这个方法不接受任何参数。
event.currentTarget,返回绑定事件的元素
event.target,返回触发事件的元素
如何自定义事件Event,不能传递参数var eve = new Event('自定义事件名');
ev.addEventListener('自定义事件名', function(){
console.log('自定义事件')
});
ev.dispatchEvent(eve);CustomEvent,还可以指定参数19.本地起了一个http server,为什么只能在同一个WIFI(局域网)上访问?你没有公网IP当然就不能被外网访问了。常见的WIFI情况下,一般的ip会是~192.168.0.x·这样的,只是对局域网(同WIFI下)可见,但是外网是访问不了的。(segmentfault上的答案)20.回流和重绘参考《如何写出高性能DOM?》21.数组去重的方法参考:《JavaScript数组去重》22.深拷贝与浅拷贝是什么浅拷贝只是拷贝基本类型的数据,如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,因此存在父对象被篡改的可能(浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存)。深拷贝就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用"浅拷贝"就行了。(深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象)浅拷贝举例var Chinese = {
  nation:'中国'
};
var Doctor ={
  career:'医生'
}
function extendCopy(p) {
  var c = {};
  for (var i in p) {
    c[i] = p[i];
  }
  return c;
}
var Doctor = extendCopy(Chinese);
Doctor.career = '医生';
alert(Doctor.nation); // 中国深拷贝举例function deepCopy(p, c) {
  var c = c
{};
  for (var i in p) {
    if (typeof p[i] === 'object') {
      c[i] = (p[i].constructor === Array) ? [] : {};
      deepCopy(p[i], c[i]);
    } else {
      c[i] = p[i];
    }
  }
  return c;
}参考文章:阮一峰:Javascript面向对象编程(三):非构造函数的继承深拷贝实现方式手动复制方式,如上面的代码,缺点就是
Object.assign,ES6 的新函数,可以帮助我们达成跟上面一样的功能。
var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = Object.assign({}, obj1);
obj2.b = 100;
console.log(obj1);
// { a: 10, b: 20, c: 30 } <-- 沒被改到
console.log(obj2);
// { a: 10, b: 100, c: 30 }
转成 JSON 再转回来用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象。缺点:只有可以转成JSON格式的对象才可以这样用,像function没办法转成JSON。
jquery,有提供一个$.extend可以用来做 Deep Copy。
lodash,也有提供_.cloneDeep用来做 Deep Copy。
递归实现深拷贝
function clone( o ) {
var temp = {};
for( var k in o ) {
if( typeof o[ k ] == 'object' ){
temp[ k ] = clone( o[ k ] );
} else {
temp[ k ] = o[ k ];
}
}
return temp;
}
参考文章:关于 JS 中的浅拷贝和深拷贝,进击JavaScript之(四)玩转递归与数列
23.如何快速合并雪碧图Gulp:gulp-css-spriterwebpack:optimize-css-assets-webpack-pluginGo!Png在线工具24.代码优化基本方法减少HTTP请求HTML优化:使用语义化标签
减少iframe:iframe是SEO的大忌,iframe有好处也有弊端
避免重定向
CSS优化:布局代码写前面
删除空样式
不滥用浮动,字体,需要加载的网络字体根据网站需求再添加
选择器性能优化
避免使用表达式,避免用id写样式
js优化:压缩
减少重复代码
图片优化:使用WebP
图片合并,CSS sprite技术
减少DOM操作缓存已经访问过的元素
"离线"更新节点, 再将它们添加到树中
避免使用 JavaScript 输出页面布局--应该是 CSS 的事儿
使用JSON格式来进行数据交换使用CDN加速使用HTTP缓存:添加 Expires 或 Cache-Control 信息头使用DNS预解析Chrome内置了DNS Prefetching技术, Firefox 3.5 也引入了这一特性,由于Chrome和Firefox 3.5本身对DNS预解析做了相应优化设置,所以设置DNS预解析的不良影响之一就是可能会降低Google Chrome浏览器及火狐Firefox 3.5浏览器的用户体验。预解析的实现:用meta信息来告知浏览器, 当前页面要做DNS预解析:<meta http-equiv="x-dns-prefetch-control" content="on" />
在页面header中使用link标签来强制对DNS预解析: <link rel="dns-prefetch" href="http://bdimg.share.baidu.com" />
25.HTTPS的握手过程浏览器将自己支持的一套加密规则发送给服务器。
服务器从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
浏览器获得网站证书之后浏览器要做以下工作:
验证证书的合法
如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给服务器
网站接收浏览器发来的数据之后要做以下的操作:
使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致。
使用密码加密一段握手消息,发送给浏览器。
浏览器解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
参考文章:《HTTPS 工作原理和 TCP 握手机制》26.BFC相关问题BFC(Block formatting context)直译为"块级格式化上下文"。它是一个独立的渲染区域,只有 Block-level box 参 与, 它规定了内部的 Block-level Box 如何布局,并且与这个区域外部毫不相干。BFC的渲染规则BFC这个元素的垂直方向的边距会发生重叠
BFC的区域不会与浮动元素的box重叠(清除浮动原理)
BFC在页面上是一个独立的容器,外面的元素不会影响它里面的元素,反过来它里面的元素也不会影响外面的元素
计算BFC的高度的时候,浮动元素也会参与计算
如何创建BFC?overflow属性不为visible
float属性不为none
position属性为absolute或fixed
display属性为inline-block、table-cell、table-caption、flex、inline-flex
BFC的使用场景他的很常用的一个应用场景就是解决边距重叠的问题.27.响应式图片1.JS或者服务端硬编码,resize事件,判断屏幕大小加载不同的图片2.img srcset 方法3.picture标签 -> source4.svg5.第三方库polyfill28.判断一个变量是否是数组var a = [];
// 1.基于instanceof
a instanceof Array;
// 2.基于constructor
a.constructor === Array;
// 3.基于Object.prototype.isPrototypeOf
Array.prototype.isPrototypeOf(a);
// 4.基于getPrototypeOf
Object.getPrototypeOf(a) === Array.prototype;
// 5.基于Object.prototype.toString
Object.prototype.toString.apply(a) === '[object Array]';
// 6.Array.isArray
Array.isArray([]); // true以上,除了Object.prototype.toString外,其它方法都不能正确判断变量的类型。29.UTF-8和Unicode的区别UTF-8就是在互联网上使用最广的一种unicode的实现方式。Unicode的出现是为了统一地区性文字编码方案,为解决unicode如何在网络上传输的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。ASCII --> 地区性编码(GBK) --> Unicode --> UTF-8知乎回答}

我要回帖

更多关于 将一个数组的值赋值给另一个数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信