var str = "what fuck is 1235 going on ?"; var newArr = str.split(" "); for(var i=0,myArr=[];i<newArr.length;i++){ myArr.push(newArr[i].replace(newArr[i].charAt(0),newArr[i].charAt(0).toUpperCase())); } console.log(myArr); var myStr=myArr.join(" "); console.log(myStr);
<body> <div id="box"> </div> <button id="button">获取颜色</button> </body>
$(function() { var search=location.search;//得到路径 var params={};//定义一个空对象 if(params!=''){ var ps=search.slice(1).split('&');//截取?以后的路径,并以&切割 for(var i=0;i<ps.length;i++){//遍历参数数组 var arr=ps[i].split('=');//将数组每一个元素以=切割 params[arr[0]]=arr[1];// } } var userId=params.userId; });
方法一:
<script> //设置index保存 var oLi=document.getElementsByTagName('li'); for(var i=0;i<oLi.length;i++){ oLi[i].index=i; oLi[i].onclick=function(){ alert(this.index); } } </script>
方法二: <script> var oLi=document.getElementsByTagName('li'); for(var i=0; i<oLi.length; i++){ (function(j){ oLi[j].onclick = function(){ alert(j); }; })(i); }
</script>
<script> //方法一:indexof查找 var arr=new Array(1,2,2,2,3,3,5,6,8,8,9); Array.prototype.unique1=function(){ var n=[]; for(var i=0;i<arr.length;i++){ if(n.indexOf(arr[i])==-1){ n.push(arr[i]); } } return n; } alert(arr.unique1()); </script> <script> //方法二:hash var arr=new Array(1,2,2,2,3,3,5,6,8,8,9); Array.prototype.unique2=function(){ var hash={},//hash表 n=[];//临时数组 for(var i=0;i<this.length;i++){ if(!hash[this[i]]){ //若是hash表中没有当前项 hash[this[i]]=true;//存入hash表 n.push(this[i]);//当前元素push到临时数组中 } } return n; } alert(arr.unique1()); </script>
var str="we are friends"; var maxLen=0; var index=""; var hash={}; for(var i=0;i<str.length;i++){ if(!hash[str.charAt(i)]){ hash[str.charAt(i)]=1; }else{ hash[str.charAt(i)]++; } } for(var i in hash){ if(hash[i]>maxLen){ maxLen=hash[i]; index=i; } } alert("出现次数最多的元素是:"+index+" 出现次数:"+maxLen);
function Trim(str){ return str.replace(/(^\s*)|(\s*$)/g, ""); }
function getLen(str){ var len=0; for(var i=0;i<str.length;i++){ if(str.charCodeAt(i)>255){//charCodeAt() 方法可返回指定位置的字符的 Unicode 编码 len+=2; }else{ len++; } } return len; }
d(); e(); function d(){//用声明的方式声明的函数 alert('hello');//hello } var e = function(){//函数表达式 alert('world');//e is not a function }
function arrSort(arr){ var len=arr.length; var nu = ''; for(var i=0;i<=len-1;i++){ for(var j=0;j<=len-1-i;j++){ if(arr[j]>arr[j+1]){ nu=arr[j]; arr[j]=arr[j+1]; arr[j+1]=nu; } } } return arr; }
function getDay(){ var start = new Date(); var end = new Date(start.getFullYear()+1,'0'); var leftTime = (end.getTime()-start.getTime())/1000;//转成秒 var second = Math.floor(leftTime%60);//取余 var minute = Math.floor((leftTime/60))%60; var hour = Math.floor((leftTime/(60*60)))%24; var day = Math.floor((leftTime/(60*60*24)))%30; var month = Math.floor((leftTime/(60*60*24*30)))%12; return '距离明年还剩'+month+'月,'+day+'天,'+hour+'小时,'+minute+'分钟,'+second+'秒'; } setInterval(function(){ var text=getDay(); document.getElementById('time').innerHTML=text; },1000);
jQuery中没有提供这个功能,因此你须要先编写两个jQuery的扩展:
$.fn.stringifyArray = function(array) {
return JSON.stringify(array)
}
$.fn.parseArray = function(array) {
return JSON.parse(array)
} javascript
而后调用:
$("").stringifyArray(array)css
(1) [ ]==[ ]
答案:false.
数组,在 Javascript 中是对象,对象使用 == 比较都是比较的引用。
简单的说,就是,若是是同一个对象,就相等,若是不是同一个对象,就不等。
每次使用 [] 都是新建一个数组对象,因此 [] == [] 这个语句里建了两个数据对象,它们不等。html
(2)Array.isArray(Array.prototype)前端
答案:true
Array.prototype为[],Array.isArray(a)是一个判断a是否为数组的方法。vue
(3)声明提早html5
var word="hello word";
(function(){
alert(word); //undefined
var word="hello test";
})();java
谈话面试:jquery
解:1.全局上下文:不管是否在严格模式下,在全局执行上下文中(在任何函数体外部)this
都指代全局对象。【在全局执行上下文中 this
都是全局对象 window
】(浏览器环境)web
2.函数上下文:在函数内部,this
的值取决于函数被调用的方式。【取决于被调用的方式】面试
3.bind方法:ECMAScript 5
引入了 Function.prototype.bind
。调用 f.bind(someObject)
会 建立一个与 f
具备相同函数体和做用域的函数,可是在这个新函数中,this
将永久地被绑定到了 bind
的第一个参数,不管这个函数是如何被调用的。
4.箭头函数:在箭头函数中,this
与封闭词法上下文的 this
保持一致。在全局代码中,它将被设置为全局对象
5.做为对象的方法:当函数做为对象里的方法被调用时,它们的 this
是调用该函数的对象
6.原型链中的this:对于在对象原型链上某处定义的方法,一样的概念也适用。若是该方法存在于一个对象的原型链上,那么 this
指向的是调用这个方法的对象,就像该方法在对象上同样。
7.做为构造函数:当一个函数用做构造函数时(适用 new
关键字),它的 this
被绑定到正在构造的新对象。虽然构造器返回的默认值是 this
所指的那个对象,但它仍能够手动返回其余的对象(若是返回值不是一个对象,则返回 this
对象)
8.做为DOM事件的处理函数:当函数被用做事件处理函数时,它的 this
指向触发事件的元素(一些浏览器在使用非 addEventListener
的函数动态添加监听函数时不遵照这个约定)
9.做为一个内敛事件处理函数:当代码被内联 on-event
处理函数 调用时,它的 this
指向监听器所在的 DOM
元素
解:须要先理解基本类型和引用类型:
ECMAScript 变量可能包含两种不一样数据类型的值:基本类型值和引用类型值。基本类型值指的是那些保存在栈内存中的简单数据段,即这种值彻底保存在内存中的一个位置。而引用类型值是指那些保存堆内存中的对象,意思是变量中保存的实际只是这个对象的引用,这个引用指向堆内存中的对象。
目前基本类型有:Boolean、Null、Undefined、Number、String、Symbol。
引用类型有:Object、Array、Function。
深拷贝与浅拷贝的概念只存在于引用类型。
浅拷贝:
var obj1 = {x:1, y:2},obj2 = obj1; console.log(obj1) // {x:1, y:2} console.log(obj2) // {x:1, y:2} obj2.x = 2; // 修改obj2.x console.log(obj1) // {x:2, y:2} console.log(obj2) // {x:2, y:2}
深拷贝:
数组:slice()只能实现一维数组的深拷贝,Object.assign()也只能实现一维对象的深拷贝。 var arr1 = [1, 2], arr2 = arr1.slice(); console.log(arr1); //[1, 2] console.log(arr2); //[1, 2] arr2[0] = 3; //修改arr2 console.log(arr1); //[1, 2] console.log(arr2); //[3, 2]
解:可维护性:由于是单向数据流,全部状态是有迹可循的,数据的传递也能够及时分发响应
易用性:它使得咱们组件间的通信变得更强大,而不用借助中间件这类来实现不一样组件间的通信
并且代码量很少,如果你要用 localStorage
或者 sessionStorage
,你必须手动去跟踪维护你的状态表,虽然说可行,可是代码量会多不少,并且可读性不好
localStorage
,sessionStorage
)?解:由于 vuex
的 store 干不过刷新啊
保存在浏览器的缓存内,若用户刷新的话,值再取一遍呗。
解:浏览器在请求不一样域的资源时,会由于同源策略的影响请求不成功,这就是一般被提到的“跨域问题”。
同源策略",即同域名(domain或ip)、同端口、同协议的才能互相获取资源,而不能访问其余域的资源。在同源策略影响下,一个域名A的网页能够获取域名B下的脚本,css,图片等,可是不能发送Ajax请求,也不能操做Cookie、LocalStorage等数据。同源策略的存在,一方面提升了网站的安全性,但同时在面对先后端分离、模拟测试等场景时,也带来了一些麻烦,从而不得不寻求一些方法来突破限制,获取资源。
解:父组件传数据给子组件,经过props属性来实现
<parent> <child :child-msg="msg"></child>//这里必需要用 - 代替驼峰 </parent> data(){ return { msg: [1,2,3] }; }
方法一:
props: ['childMsg']
方法二:
props: {
childMsg: Array //这样能够指定传入的类型,若是类型不对,会警告
}
方法三:
props: { childMsg: { type: Array, default: [0,0,0] //这样能够指定默认的值 } }
若是子组件想要改变数据呢?这在vue中是不容许的,由于vue只容许单向数据传递,这时候咱们能够经过触发事件来通知父组件改变数据,从而达到改变子组件数据的目的.emit
子组件: <template> <div @click="up"></div> </template> methods: { up() { this.$emit('upup','hehe'); //主动触发upup方法,'hehe'为向父组件传递的数据 } }
父组件: <div> <child @upup="change" :msg="msg"></child> //监听子组件触发的upup事件,而后调用change方法 </div> methods: { change(msg) { this.msg = msg; } }
vue的生命周期钩子
每一个 Vue 实例在被建立以前都要通过一系列的初始化过程。例如须要设置数据监听、编译模板、挂载实例到 DOM、在数据变化时更新 DOM 等。同时在这个过程当中也会运行一些叫作生命周期钩子的函数,给予用户机会在一些特定的场景下添加他们本身的代码。
beforeCreate: //建立以前:vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。
created: //建立完毕:vue实例的数据对象data有了,$el尚未
beforeMount: //挂载前,vue实例的$el和data都初始化了,但仍是挂载以前为虚拟的DOM节点,data.message还未替换。
mounted: // 挂载完毕,data.message成功渲染。
beforeUpdate: // 修改vue实例的data时,vue会自动更新渲染视图
beforeDestroy: // 销毁以前
destroyed: // 销毁成功
深刻响应式原理
当你把一个普通的javascript对象传给vue实例的data选项,vue将遍历此对象全部的属性,并使用Object.defineProperty把这些属性所有转为getter/setter
这些getter/setter对用户来讲是不可见的,可是在内部他们让vue追踪依赖,在属性被访问和修改时通知变化。这里须要注意的问题是浏览器控制台在打印数据对象时getter/setter的格式化并不一样,因此须要安装vue-devtools来获取更加友好的检查接口。
每一个组件实例都有相应的watcher实例对象,他会在组件渲染的过程当中把属性记录为依赖,以后当依赖的setter被调用时,会通知watcher从新计算,从而导致它关联的组件得以更新。
⦁ Vue中实现了数据的双向绑定,为了支持双向绑定,就必须时刻追踪数据变化并及时响应到ui上。
⦁ Vue经过Object.defineProperty()设置对象的存储器属性,并对对象中的每一个值,重写了其中的get、set,data中的每一个key,都有一个独立的依赖收集器。
⦁ 在get中,向依赖收集器添加了监听
⦁ 在mount时,实例了一个Watcher,将收集器的目标指向了当前Watcher
⦁ 在data值发生变动时,触发set,触发了依赖收集器中的全部监听的更新,来触发Watcher.update
Vue中的MVVM模式
vue是以数据驱动的,vue自己将Dom和数据进行绑定,一旦建立绑定,DOM和数据将保持同步,每当数据发生变化,DOM会跟着变化。ViewModel是vue的核心,它是vue的一个实例。
Vue中的状态管理
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的全部组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
computed和watch的区别
计算属性的结果会被缓存,除非依赖的响应式属性变化才会从新计算
监听某一个值,当被监听的值发生变化时,执行对应的操做
与computed的区别是,watch更加适用于监听某一个值的变化并作对应的操做,好比请求后台接口等,而computed适用于计算已有的值并返回结果
解:javaScript的事件代理也叫事件委托。
好比咱们有100个li,每一个li都有相同的click点击事件,可能咱们会用for循环的方法,来遍历全部的li,而后给它们添加事件,
通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,
代理呢,就是让别人来作,这个事件原本是加在某些元素上的,然而你却加到别人身上来作,完成这个事件。
就是利用事件冒泡的原理,把事件加到父级元素上,触发执行效果。从而能够很大程度上来提升执行的效率、并且就算新添加了元素仍是会有代理的事件
解:相同,call和apply,专门用于借用一个函数,并替换函数中的this为指定对象。
不一样,call要求传入函数的参数必须独立传入。
apply要求传入函数的参数必须放入一个数组或集合中,总体传入。
解:web存储,在开发web应用时,开发人员有时须要在本地存储数据,当前浏览器支持cookie存储,但其大小有4KB限制。
html5中的web存储对象有两种类型:
sessionStorage对象,负责存储一个会话的数据。若是用户关闭了页面或浏览器,则会销毁数据,一次会话结束,存储的信息会自动删除,
存储的数据没法垮页面存在,只在当前页面。
localStorage对象,负责存储没有到期的数据,当web页面或浏览器关闭时,仍会保持数据的存储,固然这还取决于为此用户的浏览器设置
的存储量,若是不是人为删除,存储的信息会一直保留,存储的数据内容是能够跨页的。
解:设置width=device-width,而后用百分比来分配屏幕宽度,高度自适应变化,字体也使用相对大小em,rem等等
移动浏览器提供一个特殊的功能:双击(double tap)放大
300ms的延迟就来自这里,用户碰触页面以后,须要等待一段时间来判断是否是双击(double tap)动做,而不是当即响应单击(click),等待的这段时间大约是300ms。
a、不要混用touch和click
既然touch以后300ms会触发click,只用touch或者只用click就天然不会存在问题了
在javaScript中一切皆对象,可是对象又分为函数对象和普通对象,经过new出来的都是函数对象,function是默认的函数对象,函数对象有一个默认的属性prototype,指向原型对象。原型对象上的方法和属性,能够被这个函数建立的实例引用。
this.name = 'John'; } Person.prototype = { say: function() { console.log('Hello,' + this.name); } }; var person = new Person(); person.say();//person.say is not a function
//函数B想要使用函数A的变量
functionSuper(){
this
.val = 1;
this
.arr = [1];
}
function
Sub(){
// ...
}
Sub.prototype =
new
Super();
// 核心
var
sub1 =
new
Sub();
var
sub2 =
new
Sub();
sub1.val = 2;
sub1.arr.push(2);
alert(sub1.val);
// 2
alert(sub2.val);
// 1
alert(sub1.arr);
// 1, 2
alert(sub2.arr);
// 1, 2
上传前用js对图片压缩,把利用canvas生成的base64字符串,传入后台, * (无所谓ajax或者form,同时也能够解决图片无刷新上传), * 在Java后台将获取到的base64字符串输出为图片,便可。
解:实际上是拿手机拍照的方向问题,iphone正确的手机拍照方式是横屏的,用户每每是竖屏拍照等于照相机反转了90度,出来的照片固然是反转90度,当你横屏拍照上传,图片就是正确的,一张生成的图片是没法辨别选择方向的,只有在上传前反转角度才行。
//获取图片方向 function getPhotoOrientation(img) { var orient; EXIF.getData(img, function () { orient = EXIF.getTag(this, 'Orientation'); }); return orient; }
//图片压缩 function compress(img, width, height, ratio) { var canvas, ctx, img64, orient; //获取图片方向 orient = getPhotoOrientation(img); canvas = document.createElement('canvas'); canvas.width = width; canvas.height = height; ctx = canvas.getContext("2d"); //若是图片方向等于6 ,则旋转矫正,反之则不作处理 if (orient == 6) { ctx.save(); ctx.translate(width / 2, height / 2); ctx.rotate(90 * Math.PI / 180); ctx.drawImage(img, 0 - height / 2, 0 - width / 2, height, width); ctx.restore(); } else { ctx.drawImage(img, 0, 0, width, height); } img64 = canvas.toDataURL("image/jpeg", ratio); return img64; }
解:路由是根据不一样的 url 地址展现不一样的内容或页面
前端路由更多用在单页应用上, 也就是SPA, 由于单页应用, 基本上都是先后端分离的, 后端天然也就不会给前端提供路由。
优势:
1.从性能和用户体验的层面来比较的话,后端路由每次访问一个新页面的时候都要向服务器发送请求,而后服务器再响应请求,这个过程确定会有延迟。而前端路由在访问一个新页面的时候仅仅是变换了一下路径而已,没有了网络延迟,对于用户体验来讲会有至关大的提高。
2.在某些场合中,用ajax请求,可让页面无刷新,页面变了但Url没有变化,用户就不能复制到想要的地址,用前端路由作单页面网页就很好的解决了这个问题
缺点:
使用浏览器的前进,后退键的时候会从新发送请求,没有合理地利用缓存。
16.请讲解一下闭包?
解:包就是可以读取其余函数内部变量的函数。因为在Javascript语言中,只有函数内部的子函数才能读取局部变量,所以能够把闭包简单理解成“定义在一个函数内部的函数”。
因此,在本质上,闭包就是将函数内部和函数外部链接起来的一座桥梁。闭包能够用在许多地方。它的最大用处有两个,一个是前面提到的能够读取函数内部的变量,另外一个就是让这些变量的值始终保持在内存中。
使用闭包的注意点:
因为闭包会使得函数中的变量都被保存在内存中,内存消耗很大,因此不能滥用闭包,不然会形成网页的性能问题,在IE中可能致使内存泄露。解决方法是,在退出函数以前,将不使用的局部变量所有删除。
闭包会在父函数外部,改变父函数内部变量的值。因此,若是你把父函数看成对象(object)使用,把闭包看成它的公用方法(Public Method),把内部变量看成它的私有属性(private value),这时必定要当心,不要随便改变父函数内部变量的值。
17.js中的做用域和做用域链
做用域指变量和函数的可以使用范围,在JavaScript中变量的做用域分为局部做用域和全局做用域。1.全局做用域
(1)最外层函数和在最外层函数外面定义的变量拥有全局做用域
(2)全部末定义直接赋值的变量自动声明为拥有全局做用域。
(3)全部window对象的属性拥有全局做用域
2.局部做用域
函数内部声明的变量。
3.做用域链
程序执行的时候会建立一个执行环境栈,首先将window的执行环境压入到执行环境栈中,window是全局的,里面存放全局的变量和函数。
当调用一个函数的时候,会将这个函数的执行环境压入到执行环境栈中,而且还会建立这个函数的活动对象,指向活动对象。活动对象中保存
函数内部的变量也就是局部变量,活动对象指向window。
函数调用完以后,它的执行环境会被释放,它指向的活动对象也会被释放。活动对象中保存的局部变量也被释放。当查找一个变量时,首先去
活动对象中查找,找不到就沿着做用域链向下查找,若是window中都找不到,就会报错。格局做用于逐级引用造成做用域链。
18.同步和异步
同步就是指一个进程在执行某个请求的时候,若该请求须要隔一段时间才能返回信息,那么这个进程会一直等待下去,直到收到返回消息才会继续执行下去
异步请求是指进程不须要一直等待下去,而是继续执行下面的操做,无论其余进程的状态。当有消息返回时,系统会通知进程进行处理,这样能够提升执行效率。
setTimeout(function cbFn(){ console.log('learnInPro'); }, 1000); console.log('sync things');
setTimeout就是一个异步任务
,当JS引擎顺序执行到setTimeout的时候发现他是个异步任务,则会把这个任务挂起,继续执行后面的代码。直到1000ms后,回调函数cbFn才会执行,这就是异步,在执行到setTimeout的时候,JS并不会傻呵呵的等着1000ms执行cbFn回调函数,而是继续执行了后面的代码
为何要在js中写异步?
因为javascript是单线程的,只能在JS引擎的主线程上运行的,因此js代码只能一行一行的执行,不能在同一时间执行多个js代码任务,这就致使若是有一段耗时较长的计算,或者是一个ajax请求等IO操做,若是没有异步的存在,就会出现用户长时间等待,而且因为当前任务还未完成,因此这时候全部的其余操做都会无响应。
11.http://blog.csdn.net/gaoshanwudi/article/details/7355794闭包
19.重载
argument。length判断参数的个数。
20.热加载
21.vue的缺点
22.不固定高宽div垂直居中的方法
<div class="block" style="height: 300px;"> <div class="centered"> <h1>haorooms案例题目</h1> <p>haorooms案例内容,haorooms案例内容haorooms案例内容haorooms案例内容haorooms案例内容haorooms案例内容haorooms案例内容haorooms案例内容haorooms案例内容</p> </div> </div>
/* This parent can be any width and height */ .block { text-align: center; } /* The ghost, nudged to maintain perfect centering */ .block:before { content: ''; display: inline-block; height: 100%; vertical-align: middle; margin-right: -0.25em; /* Adjusts for spacing */ } /* The element to be centered, can also be of any width and height */ .centered { display: inline-block; vertical-align: middle; width: 50%; }
普通函数能够在声明以前调用,
匿名函数会被当作普通表达式,存在声明提早。
a();
//a函数能够在它定义的前面调用
b();
//b函数这样调用就会出“未定义”错误
function
a()
{
alert(
"aaaaaa"
);
}
var
b =
function
()
{
alert(
"bbbbbb"
);
}
大体能够分为以下7步:
输入网址;
发送到DNS服务器,并获取域名对应的web服务器对应的ip地址;
与web服务器创建TCP链接;
浏览器向web服务器发送http请求;
web服务器响应请求,并返回指定url的数据(或错误信息,或重定向的新的url地址);
浏览器下载web服务器返回的数据及解析html源文件;
生成DOM树,解析css和js,渲染页面,直至显示完成;
23.jquey如何扩展自定义方法
(jQuery.fn.myMethod=function(){ alert('myMethod'); }) // 或者: (function($){ $.fn.extend({ myMethod: function(){ alert('myMethod') } }) })(jQuery)
// 使用
$("#div").myMethod();