Object number function boolean underfind stringjavascript
强制(parseInt,parseFloat,number)
隐式(== - ===)css
前者是切割成数组的形式,后者是将数组转换成字符串html
Unshift()头部添加 shift()头部删除
Push()尾部添加 pop()尾部删除前端
1.执行顺序不同、
2.参数不同
3.事件加不加on
4.this指向问题java
Var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth
Var target = ev.srcElement||ev.targetnode
1.一个在url后面 一个放在虚拟载体里面
2.有大小限制
3.安全问题
4.应用不一样 一个是论坛等只须要请求的,一个是相似修改密码的nginx
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)angularjs
使用eval parse 鉴于安全性考虑 使用parse更靠谱面试
function getStyle(obj, attr, value) { if(!value) { if(obj.currentStyle) { return obj.currentStyle(attr) } else { obj.getComputedStyle(attr, false) } } else { obj.style[attr]=value } }
让利用事件冒泡的原理,让本身的所触发的事件,让他的父元素代替执行!ajax
闭包就是可以读取其余函数内部变量的函数。
http://blog.csdn.net/gaoshanw... (问这个问题的不是一个公司)
也能够直接点击此处查看以前更的关于闭包的文章
stoppropagation / preventdefault
obj.appendChidl()
obj.innersetBefore
obj.replaceChild
obj.removeChild
动态建立script标签,回调函数
Ajax是页面无刷新请求数据操做
本地对象为array obj regexp等能够new实例化
内置对象为gload Math 等不能够实例化的
宿主为浏览器自带的document,window 等
页面加载完成有两种事件:
一.是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件)。
二.是onload,指示页面包含图片等文件在内的全部元素都加载完成。
前者会自动转换类型
后者不会
同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义,
一段脚本只能读取来自于同一来源的窗口和文档的属性,这里的同一来源指的是协议、域名和端口号的组合
var arr = [ 1,5,1,7,5,9]; Math.max(...arr) // 9
[...new Set([2,"12",2,12,1,2,1,6,12,13,6])] // [2, "12", 12, 1, 6, 13]
升序:
var numberArray = [3,6,2,4,1,5]; numberArray.sort(function(a,b){ return a-b; }) console.log(numberArray);
var examplearr=[8,94,15,88,55,76,21,39]; function sortarr(arr){ for(i=0;i<arr.length-1;i++){ for(j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ var temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } return arr; } sortarr(examplearr); console.log(examplearr);
null:表示无值;undefined:表示一个未声明的变量,或已声明但没有赋值的变量,
或一个并不存在的对象属性。
1.因为闭包会使得函数中的变量都被保存在内存中,内存消耗很大,因此不能滥用闭包,不然会形成网页的性能问题,在IE中可能致使内存泄露。解决方法是,在退出函数以前,将不使用的局部变量所有删除。
2.闭包会在父函数外部,改变父函数内部变量的值。因此,若是你把父函数看成对象(object)使用,把闭包看成它的公用方法(Public Method),把内部变量看成它的私有属性(private value),这时必定要当心,不要随便改变父函数内部变量的值。
(关于闭包,详细了解请看JavaScript之做用域与闭包详解)
JSONP (JSON with Padding)是一个简单高效的跨域方式,HTML中的script标签能够加载并执行其余域的javascript,因而咱们能够经过script标记来动态加载其余域的资源。例如我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以JavaScript的形式声明pageA须要的数据,而后在 pageA中用script标签把pageB加载进来,那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函数,pageB加载完以后会执行pageA中定义的函数,所须要的数据会以参数的形式传递给该函数。JSONP易于实现,可是也会存在一些安全隐患,若是第三方的脚本随意地执行,那么它就能够篡改页面内容,截获敏感数据。可是在受信任的双方传递数据,JSONP是很是合适的选择。
AJAX是不跨域的,而JSONP是一个是跨域的,还有就是两者接收参数形式不同!
在函数执行时,把变量的声明提高到了函数顶部,而其值定义依然在原来位置。
如下函数把获取一个key的参数。
function parseQueryString ( name ){ name = name.replace(/[\[]/,"\\\["); var regexS = "[\\?&]"+name+"=([^&#]*)"; var regex = new RegExp( regexS ); var results = regex.exec( window.location.href ); if(results == null) { return ""; } else { return results[1]; } }
arguments虽然有一些数组的性质,但其并不是真正的数组,只是一个类数组对象。
其并无数组的不少方法,不能像真正的数组那样调用.jion(),.concat(),.pop()等方法。
在代码中出现表达式-“use strict”; 意味着代码按照严格模式解析,这种模式使得Javascript在更严格的条件下运行。
好处:
1.消除Javascript语法的一些不合理、不严谨之处,减小一些怪异行为;
2.消除代码运行的一些不安全之处,保证代码运行的安全;
3.提升编译器效率,增长运行速度;
坏处:
1.一样的代码,在”严格模式”中,可能会有不同的运行结果;一些在”正常模式”下能够运行的语句,在”严格模式”下将不能运行。
1.就是一个函数的调用过程。那么就从理解这个调用过程开始吧。
函数a有一个参数,这个参数是个函数b,当函数a执行完之后执行函数b。那么这个过程就叫回调。
2.另外种解释:开发网站的过程当中,咱们常常遇到某些耗时很长的javascript操做。其中,既有异步的操做(好比ajax读取服务器数据),也有同步的操做(好比遍历一个大型数组),它们都不是当即能获得结果的。
一般的作法是,为它们指定回调函数(callback)。即事先规定,一旦它们运行结束,应该调用哪些函数。
let obj = {}; let arr = []; console.log(typeof obj === 'object'); //true console.log(typeof arr === 'object'); //true
从上面的输出结果可知,typeof bar === “object” 并不能准确判断 bar 就是一个 Object。能够经过 Object.prototype.toString.call(bar) === “[object Object]” 来避免这种弊端:
let obj = {}; let arr = []; console.log(Object.prototype.toString.call(obj)); //[object Object] console.log(Object.prototype.toString.call(arr)); //[object Array]
console.log(1 + "2" + "2"); //122 console.log(1 + +"2" + "2"); //32 console.log(1 + -"1" + "2"); //02 console.log(+"1" + "1" + "2"); //112 console.log( "A" - "B" + "2"); //NaN2 console.log( "A" - "B" + 2); //NaN console.log('3' + 2 + 1);//321 console.log(typeof +'3'); //number console.log(typeof (''+3)); //string console.log('a' * 'sd'); //NaN
或逻辑时:当0在前面时console.log((0|| 2));则输出为后面的数,为2;
当除0觉得的数在前面时console.log((2|| 0));则输出为2;
与逻辑时:当只要有0时console.log(0&&2 );则输出都为0;
当不存在0时,console.log(1&&2 );则输出都为后面的一个,为2; console.log(2&&1 );则输出为1;
0, '0', +0, -0, false, '',null,undefined,null,NaN
要注意空数组([])和空对象({}):
console.log([] == false) //true console.log({} == false) //false console.log(Boolean([])) //true
var a={}, b={key:'b'}, c={key:'c'}; a[b]=123; a[c]=456; console.log(a[b]);
由于在设置对象属性时,JS将隐式地stringify参数值。
在本例中,因为b和c都是对象,它们都将被转换为“[object object]”。
所以,a[b]和[c]都等价于[[object object]],而且能够互换使用。
因此,设置或引用[c]与设置或引用a[b]彻底相同。`
(function(x) { return (function(y) { console.log(x); })(2) })(1);
输出1,闭包可以访问外部做用域的变量或参数。
function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function () { alert (2);}; Foo.prototype.getName = function () { alert (3);}; var getName = function () { alert (4);}; function getName() { alert (5);} Foo.getName(); //2 getName(); //4 Foo().getName(); //1 getName(); //1 new Foo.getName(); //2 new Foo().getName(); //3 new new Foo().getName(); //3
AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML)是指一种建立交互式网页应用的开发技术、改善用户体验,实现无刷新效果。
优势
a、不须要插件支持
b、优秀的用户体验
c、提升Web程序的性能
d、减轻服务器和带宽的负担
缺点
a、破坏浏览器“前进”、“后退”按钮的正常功能,能够经过简单的插件弥补
b、对搜索引擎的支持不足
a、什么是deferred对象
在回调函数方面,jQuery的功能很是弱。为了改变这一点,jQuery开发团队就设计了deferred对象。
简单说,deferred对象就是jQuery的回调函数解决方案。在英语中,defer的意思是”延迟”,因此deferred对象的含义就是”延迟”到将来某个点再执行。
它解决了如何处理耗时操做的问题,对那些操做提供了更好的控制,以及统一的编程接口。
b、它的主要功能,能够归结为四点:
(1)、实现链式操做
(2)、指定同一操做的多个回调函数
(3)、为多个操做指定回调函数
(4)、普通操做的回调函数接口
跨域是指不一样域名之间相互访问。
JavaScript同源策略的限制,A域名下的JavaScript没法操做B或是C域名下的对象
实现:
(1)、JSONP跨域:利用script脚本容许引用不一样域下的js实现的,将回调方法带入服务器,返回结果时回调。
1 经过jsonp跨域
1.原生实现: <script> var script = document.createElement('script'); script.type = 'text/javascript'; // 传参并指定回调执行函数为onBack script.src = 'http://www.....:8080/login?user=admin&callback=onBack'; document.head.appendChild(script); // 回调执行函数 function onBack(res) { alert(JSON.stringify(res)); } </script> 2.document.domain + iframe跨域 此方案仅限主域相同,子域不一样的跨域应用场景。 1.父窗口:(http://www.domain.com/a.html) <iframe id="iframe" src="http://child.domain.com/b.html"></iframe> <script> document.domain = 'domain.com'; var user = 'admin'; </script> 2.子窗口:(http://child.domain.com/b.html) <script> document.domain = 'domain.com'; // 获取父窗口中变量 alert('get js data from parent ---> ' + window.parent.user); </script> 弊端:请看下面渲染加载优化 一、 nginx代理跨域 二、 nodejs中间件代理跨域 三、 后端在头部信息里面设置安全域名
(3)、跨域资源共享(CORS)
跨域资源共享(CORS)是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,容许网页从不一样的域访问其资源。
CORS与JSONP相比:
a、JSONP只能实现GET请求,而CORS支持全部类型的HTTP请求。
b、使用CORS,开发者可使用普通的XMLHttpRequest发起请求和得到数据,比起JSONP有更好的错误处理。
c、JSONP主要被老的浏览器支持,它们每每不支持CORS,而绝大多数现代浏览器都已经支持了CORS。
更多跨域的具体内容请看 https://segmentfault.com/a/11...
a.模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它能够生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
b.在一些示例中javascript有大量的html字符串,html中有一些像onclick样的javascript,这样javascript中有html,html中有javascript,代码的偶合度很高,不便于修改与维护,使用模板引擎能够解决问题。
JavaScript是一种动态、弱类型、基于原型的语言,经过浏览器能够直接执行。
当浏览器遇到<script> 标记的时候,浏览器会执行之间的javascript代码。嵌入的js代码是顺序执行的,每一个脚本定义的全局变量和函数,均可以被后面执行的脚本所调用。 变量的调用,必须是前面已经声明,不然获取的变量值是undefined。
基本数据类型:字符串 String、数字 Number、布尔Boolean
复合数据类型:数组 Array、对象 Object
特殊数据类型:Null 空对象、Undefined 未定义
a、ionic是一个用来开发混合手机应用的,开源的,免费的代码库。能够优化html、css和js的性能,构建高效的应用程序,并且还能够用于构建Sass和AngularJS的优化。
b、AngularJS经过新的属性和表达式扩展了HTML。AngularJS能够构建一个单一页面应用程序(SPAs:Single Page Applications)。
c、Ionic是一个混合APP开发工具,它以AngularJS为中间脚本工具(称为库,彷佛又不恰当),因此,你若是要使用Ionic开发APP,就必须了解AngularJS。
(1)、使用闭包主要是为了设计私有的方法和变量。闭包的优势是能够避免全局变量的污染,
缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易形成内存泄露。
(2)、闭包有三个特性:
a、函数嵌套函数
b、函数内部能够引用外部的参数和变量
c、参数和变量不会被垃圾回收机制回收
回答一:
(1)、js的this指向是不肯定的,也就是说是能够动态改变的。call/apply 就是用于改变this指向的函数,这样设计可让代码更加灵活,复用性更高
(2)、this 通常状况下,都是指向函数的拥有者。
(3)、在函数自执行里,this 指向的是 window 对象。
扩展:关于this,还有一个地方比较让人模糊的是在dom事件里,一般有以下3种状况:
a、使用标签属性注册事件,此时this指向的是window对象。
b、对与a,要让this指向input,能够将this做为参数传递。
c、使用addEventListener等注册事件。此时this也是指向 input。
回答二:
(1)、处于全局做用域下的this:
this;/*window*/ var a = {name: this}/*window*/ var b = [this];/*window*/
在全局做用域下,this默认指向window对象。
(2)、处在函数中的this,又分为如下几种状况:
a、通常定义的函数,而后通常的执行:
var a = function(){ console.log(this); } a();/*window*/
this仍是默认指向window。
b、通常定义,用new调用执行:
var a = function(){ console.log(this); } new a();/*新建的空对象*/
这时候让this指向新建的空对象,咱们才能够给空对象初始化自有变量
c、做为对象属性的函数,调用时:
var a = { f:function(){ console.log(this) } } a.f();/*a对象*/
这时候this指向调用f函数的a对象。
(3)、经过call()和apply()来改变this的默认引用:
var b = {id: 'b'}; var a = { f:function(){ console.log(this) } } a.f.call(b);/*window*/
全部函数对象都有的call方法和apply方法,它们的用法大致类似,f.call(b);的意思 是,执行f函数,并将f函数执行期活动对象里的this指向b对象,这样标示符解析时,this就会是b对象了。不过调用函数是要传参的。因此,f.call(b, x, y); f.apply(b, [x, y]);好吧,以上就是用call方法执行f函数,与用apply方法执行f函数时传参方式,它们之间的差别,你们一目了然:apply经过数组的方式传递参数,call经过一个个的形参传递参数。
(4)、一些函数特殊执行状况this的指向问题:
a、setTimeout()和setInverval(): var a = function(){ console.log(this); } setTimeout(a,0);/*window*/ setInterval()相似。
b、dom模型中触发事件的回调方法执行中活动对象里的this指向该dom对象。
(1) 工厂模式
function Parent(){ var Child = new Object(); Child.name="欲泪成雪"; Child.age="20"; return Child; }; var x = Parent();
引用该对象的时候,这里使用的是 var x = Parent()而不是 var x = new Parent();由于后者会可能出现不少问题(前者也成为工厂经典方式,后者称之为混合工厂方式),不推荐使用new的方式使用该对象
(2)构造函数方式
function Parent(){ this.name="欲泪成雪"; this.age="20"; }; var x =new Parent();
(3) 原型模式
function Parent(){ }; Parent.prototype.name="欲泪成雪"; Parent.prototype.age="20"; var x =new Parent();
(4)混合的构造函数,原型方式(推荐)
function Parent(){ this.name="欲泪成雪"; this.age=22; }; Parent.prototype.lev=function(){ return this.name; }; var x =new Parent();
(5)动态原型方式
function Parent(){ this.name="欲泪成雪"; this.age=22; ; if(typeof Parent._lev=="undefined"){ Parent.prototype.lev=function(){ return this.name; } Parent._lev=true; } }; var x =new Parent();
回答一:
(1)、IE7/8 DOM循环引用致使内存泄漏
a、多个对象循环引用
b、循环引用本身
(2)、基础的DOM泄漏
当原有的DOM被移除时,子结点引用没有被移除则没法回收。
(3)、timer定时器泄漏
这个时候你没法回收buggyObject,解决办法,先中止timer而后再回收
回答二:
内存泄漏指任何对象在您再也不拥有或须要它以后仍然存在。
垃圾回收器按期扫描对象,并计算引用了每一个对象的其余对象的数量。若是一个对象的引用数量为 0(没有其余对象引用过该对象),或对该对象的唯一引用是循环的,那么该对象的内存便可回收。
setTimeout 的第一个参数使用字符串而非函数的话,会引起内存泄漏。
闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)也会引起内存泄漏问题。
(1)、放在底部,虽然放在底部照样会阻塞全部呈现,但不会阻塞资源下载。
(2)、若是嵌入JS放在head中,请把嵌入JS放在CSS头部。
(3)、使用defer(只支持IE)
(4)、不要在嵌入的JS中调用运行时间较长的函数,若是必定要用,能够用setTimeout来调用
a、在一个对象上触发某类事件(好比单击onclick事件),若是此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,若是没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象全部同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。
b、冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发
c、js冒泡机制是指若是某元素定义了事件A,如click事件,若是触发了事件以后,没有阻止冒泡事件,那么事件将向父级元素传播,触发父类的click函数。
//阻止冒泡时间方法,兼容ie(e.cancleBubble)和ff(e.stopProgation)
function stopBubble(e){ var evt = e||window.event; evt.stopPropagation?evt.stopPropagation():(evt.cancelBubble=true);//阻止冒泡 evt.preventDefault
ES6 原生提供了 Promise 对象。
所谓 Promise,就是一个对象,用来传递异步操做的消息。它表明了某个将来才会知道结果的事件(一般是一个异步操做),而且这个事件提供统一的 API,可供进一步处理。
Promise 对象有如下两个特色:
(1)、对象的状态不受外界影响。Promise 对象表明一个异步操做,有三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfilled)和 Rejected(已失败)。只有异步操做的结果,能够决定当前是哪种状态,任何其余操做都没法改变这个状态。这也是 Promise 这个名字的由来,它的英语意思就是「承诺」,表示其余手段没法改变。
(2)、一旦状态改变,就不会再变,任什么时候候均可以获得这个结果。Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected。只要这两种状况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对 Promise 对象添加回调函数,也会当即获得这个结果。这与事件(Event)彻底不一样,事件的特色是,若是你错过了它,再去监听,是得不到结果的。
有了 Promise 对象,就能够将异步操做以同步操做的流程表达出来,避免了层层嵌套的回调函数。此外,Promise 对象提供统一的接口,使得控制异步操做更加容易。
Promise 也有一些缺点。首先,没法取消 Promise,一旦新建它就会当即执行,没法中途取消。其次,若是不设置回调函数,Promise 内部抛出的错误,不会反应到外部。第三,当处于 Pending 状态时,没法得知目前进展到哪个阶段(刚刚开始仍是即将完成)。
JavaScript是一种经过原型实现继承的语言与别的高级语言是有区别的,像java,C#是经过类型决定继承关系的,JavaScript是的动态的弱类型语言,总之能够认为JavaScript中全部都是对象,在JavaScript中,原型也是一个对象,经过原型能够实现对象的属性继承,JavaScript的对象中都包含了一个” prototype”内部属性,这个属性所对应的就是该对象的原型。
“prototype”做为对象的内部属性,是不能被直接访问的。因此为了方便查看一个对象的原型,Firefox和Chrome内核的JavaScript引擎中提供了”proto“这个非标准的访问器(ECMA新标准中引入了标准对象原型访问器”Object.getPrototype(object)”)。
原型的主要做用就是为了实现继承与扩展对象。
使用 typeof 运算符时采用引用类型存储值会出现一个问题,不管引用的是什么类型的对象,它都返回 “object”。ECMAScript 引入了另外一个 Java 运算符 instanceof 来解决这个问题。instanceof 运算符与 typeof 运算符类似,用于识别正在处理的对象的类型。与 typeof 方法不一样的是,instanceof 方法要求开发者明确地确认对象为某特定类型。
常见有冒泡和选择,这里利用sort排序
export const orderArr=(arr)=>{ arr.sort((a,b)=>{ return a-b //将arr升序排列,若是是倒序return -(a-b) }) }
export const orderArr=(arr)=>{ arr.sort((a,b)=>{ let value1 = a[property]; let value2 = b[property]; return value1 - value2;//sort方法接收一个函数做为参数,这里嵌套一层函数用 //来接收对象属性名,其余部分代码与正常使用sort方法相同 }) }
export const traverseObj=(obj)=>{ for(let variable in obj){ //For…in遍历对象包括全部继承的属性,因此若是 //只是想使用对象自己的属性须要作一个判断 if(obj.hasOwnProperty(variable)){ console.log(variable,obj[variable]) } } }
promise是一种封装将来值的易于复用的异步任务管理机制,主要解决地狱回调和控制异步的顺序
1.应用方法一
export const promiseDemo=()=>{ new Promise((resolve,reject)=>{ resolve(()=>{ let a=1; return ++a; }).then((data)=>{ console.log(data)//data值为++a的值 }).catch(()=>{//错误执行这个 }) }) }
2.应用方法二
export const promiseDemo=()=>{ Promise.resolve([1,2,3]).then((data)=>{//直接初始化一个Promise并执行resolve方法 console.log(data)//data值为[1,2,3] }) }
<script> function Click(){ window.event.returnValue=false; } document.oncontextmenu=Click; </script> 恢复方法:javascript:alert(document.oncontextmenu='')