转载自https://www.cnblogs.com/zhangshuda/p/8465892.html,感谢原博主javascript
一、javascript的typeof返回哪些数据类型php
Object number function boolean underfind;css
2.例举3种强制类型转换和2种隐式类型转换?html
- 强制(parseInt,parseFloat,number)隐式(== – ===);
3.数组方法pop() push() unshift() shift()前端
- Push()尾部添加 pop()尾部删除
- Unshift()头部添加 shift()头部删除
4.ajax请求的时候get 和post方式的区别?vue
- 一个在url后面 一个放在虚拟载体里面
有大小限制- 安全问题
应用不一样 一个是论坛等只须要请求的,一个是相似修改密码的;
5.call和apply的区别java
- Object.call(this,obj1,obj2,obj3)
- Object.apply(this,arguments)
6.ajax请求时,如何解释json数据node
- 使用eval parse,鉴于安全性考虑 使用parse更靠谱;
7.事件委托是什么react
- 让利用事件冒泡的原理,让本身的所触发的事件,让他的父元素代替执行!
8.闭包是什么,有什么特性,对页面有什么影响?简要介绍你理解的闭包jquery
- 闭包就是可以读取其余函数内部变量的函数。
9.添加 删除 替换 插入到某个接点的方法
obj.appendChidl()
obj.innersetBefore
obj.replaceChild
obj.removeChild
10.说一下什么是javascript的同源策略?
- 一段脚本只能读取来自于同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合
十一、编写一个b继承a的方法;
1
2
3
4
5
6
7
8
9
10
11
|
function
A(name){
this
.name = name;
this
.sayHello =
function
(){alert(
this
.name+” say Hello!”);};
}
function
B(name,id){
this
.temp = A;
this
.temp(name);
//至关于new A();
delete
this
.temp;
this
.id = id;
this
.checkId =
function
(ID){alert(
this
.id==ID)};
}
|
12.如何阻止事件冒泡和默认事件
1
2
3
4
5
6
7
|
function
stopBubble(e)
{
if
(e && e.stopPropagation)
e.stopPropagation()
else
window.event.cancelBubble=
true
}
|
1三、下面程序执行后弹出什么样的结果?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
function
fn() {
this
.a = 0;
this
.b =
function
() {
alert(
this
.a)
}
}
fn.prototype = {
b:
function
() {
this
.a = 20;
alert(
this
.a);
},
c:
function
() {
this
.a = 30;
alert(
this
.a);
}
}
var
myfn =
new
fn();
myfn.b();
myfn.c();
|
1四、.谈谈This对象的理解。
this是js的一个关键字,随着函数使用场合不一样,this的值会发生变化。
可是有一个总原则,那就是this指的是调用函数的那个对象。
this通常状况下:是全局对象Global。 做为方法调用,那么this就是指这个对象
1五、下面运行的结果
1
2
3
4
5
6
7
8
9
10
11
|
function
fun(n,o) {
console.log(o)
return
{
fun:
function
(m){
return
fun(m,n);
}
};
}
var
a = fun(0); a.fun(1); a.fun(2); a.fun(3);
var
b = fun(0).fun(1).fun(2).fun(3);
var
c = fun(0).fun(1); c.fun(2); c.fun(3);<br><br>
//a: undefined,0,0,0<br>//b: undefined,0,1,2<br>//c: undefined,0,1,1
|
1六、下面程序的输出结果
1
2
3
4
5
6
7
8
9
|
var
name =
'World!'
;
(
function
() {
if
(
typeof
name ===
'undefined'
) {
var
name =
'Jack'
;
console.log(
'Goodbye '
+ name);
}
else
{
console.log(
'Hello '
+ name);
}
})();
|
1七、HTTP协议
1八、事件委托机制
原理:使用事件委托技术能让你避免对特定的每一个节点添加事件监听器;相反,事件监听器是被添加到它们的父元素上,利用冒泡的原理,把事件加到父级上,触发执行效果。
优势
经过上面的介绍,你们应该可以体会到使用事件委托对于web应用程序带来的几个优势:
1.能够大量节省内存占用,减小事件注册。
2.能够方便地动态添加和修改元素,不须要由于元素的改动而修改事件绑定。
3.JavaScript和DOM节点之间的关联变少了,这样也就减小了因循环引用而带来的内存泄漏发生的几率。
缺点:
不是全部的事件都能冒泡的。blur、focus、load和unload不能像其它事件同样冒泡。事实上blur和focus能够用事件捕获而非事件冒泡的方法得到(在IE以外的其它浏览器中)。
在管理鼠标事件的时候有些须要注意的地方。若是你的代码处理mousemove事件的话你赶上性能瓶颈的风险可就大了,由于mousemove事件触发很是频繁。而mouseout则由于其怪异的表现而变得很难用事件代理来管理。
1九、缓存
20、闭包
2一、垃圾回收
一、闭包
-
闭包就是可以读取其余函数内部变量的函数
-
闭包是指有权访问另外一个函数做用域中变量的函数,建立闭包的最多见的方式就是在一个函数内建立另外一个函数,经过另外一个函数访问这个函数的局部变量,利用闭包能够突破做用链域
-
闭包的特性:
- 函数内再嵌套函数
- 内部函数能够引用外层的参数和变量
- 参数和变量不会被垃圾回收机制回收
说说你对闭包的理解
-
使用闭包主要是为了设计私有的方法和变量。闭包的优势是能够避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易形成内存泄露。在js中,函数即闭包,只有函数才会产生做用域的概念
-
闭包 的最大用处有两个,一个是能够读取函数内部的变量,另外一个就是让这些变量始终保持在内存中
-
闭包的另外一个用处,是封装对象的私有属性和私有方法
-
好处:可以实现封装和缓存等;
-
坏处:就是消耗内存、不正当使用会形成内存溢出的问题
使用闭包的注意点
- 因为闭包会使得函数中的变量都被保存在内存中,内存消耗很大,因此不能滥用闭包,不然会形成网页的性能问题,在IE中可能致使内存泄露
- 解决方法是,在退出函数以前,将不使用的局部变量所有删除
二、说说你对做用域链的理解
- 做用域链的做用是保证执行环境里有权访问的变量和函数是有序的,做用域链的变量只能向上访问,变量访问到
window
对象即被终止,做用域链向下访问变量是不被容许的 - 简单的说,做用域就是变量与函数的可访问范围,即做用域控制着变量与函数的可见性和生命周期
三、JavaScript原型,原型链 ? 有什么特色?
-
每一个对象都会在其内部初始化一个属性,就是
prototype
(原型),当咱们访问一个对象的属性时 -
若是这个对象内部不存在这个属性,那么他就会去
prototype
里找这个属性,这个prototype
又会有本身的prototype
,因而就这样一直找下去,也就是咱们平时所说的原型链的概念 -
关系:
instance.constructor.prototype = instance.__proto__
-
特色:
JavaScript
对象是经过引用来传递的,咱们建立的每一个新对象实体中并无一份属于本身的原型副本。当咱们修改原型时,与之相关的对象也会继承这一改变
-
当咱们须要一个属性的时,
Javascript
引擎会先看当前对象中是否有这个属性, 若是没有的 -
就会查找他的
Prototype
对象是否有这个属性,如此递推下去,一直检索到Object
内建对象
四、请解释什么是事件代理
- 事件代理(
Event Delegation
),又称之为事件委托。是JavaScript
中经常使用绑定事件的经常使用技巧。顾名思义,“事件代理”便是把本来须要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡。使用事件代理的好处是能够提升性能 - 能够大量节省内存占用,减小事件注册,好比在
table
上代理全部td
的click
事件就很是棒 - 能够实现当新增子对象时无需再次对其绑定
五、Javascript如何实现继承?
-
构造继承
-
原型继承
-
实例继承
-
拷贝继承
-
原型
prototype
机制或apply
和call
方法去实现较简单,建议使用构造函数与原型混合方式
function Parent(){ this.name = 'wang'; } function Child(){ this.age = 28; } Child.prototype = new Parent();//继承了Parent,经过原型 var demo = new Child(); alert(demo.age); alert(demo.name);//获得被继承的属性 }
六、谈谈This对象的理解
this
老是指向函数的直接调用者(而非间接调用者)- 若是有
new
关键字,this
指向new
出来的那个对象 - 在事件中,
this
指向触发这个事件的对象,特殊的是,IE
中的attachEvent
中的this
老是指向全局对象Window
七、事件模型
W3C
中定义事件的发生经历三个阶段:捕获阶段(capturing
)、目标阶段(targetin
)、冒泡阶段(bubbling
)
- 冒泡型事件:当你使用事件冒泡时,子级元素先触发,父级元素后触发
- 捕获型事件:当你使用事件捕获时,父级元素先触发,子级元素后触发
DOM
事件流:同时支持两种事件模型:捕获型事件和冒泡型事件- 阻止冒泡:在
W3c
中,使用stopPropagation()
方法;在IE下设置cancelBubble = true
- 阻止捕获:阻止事件的默认行为,例如
click - <a>
后的跳转。在W3c
中,使用preventDefault()
方法,在IE
下设置window.event.returnValue = false
八、new操做符具体干了什么呢?
- 建立一个空对象,而且
this
变量引用该对象,同时还继承了该函数的原型 - 属性和方法被加入到
this
引用的对象中 - 新建立的对象由
this
所引用,而且最后隐式的返回this
九、Ajax原理
Ajax
的原理简单来讲是在用户和服务器之间加了—个中间层(AJAX
引擎),经过XmlHttpRequest
对象来向服务器发异步请求,从服务器得到数据,而后用javascrip
t来操做DOM
而更新页面。使用户操做与服务器响应异步化。这其中最关键的一步就是从服务器得到请求数据Ajax
的过程只涉及JavaScript
、XMLHttpRequest
和DOM
。XMLHttpRequest
是aja
x的核心机制
// 1. 建立链接 var xhr = null; xhr = new XMLHttpRequest() // 2. 链接服务器 xhr.open('get', url, true) // 3. 发送请求 xhr.send(null); // 4. 接受请求 xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ if(xhr.status == 200){ success(xhr.responseText); } else { // fail fail && fail(xhr.status); } } }
ajax 有那些优缺点?
- 优势:
- 经过异步模式,提高了用户体验.
- 优化了浏览器和服务器之间的传输,减小没必要要的数据往返,减小了带宽占用.
Ajax
在客户端运行,承担了一部分原本由服务器承担的工做,减小了大用户量下的服务器负载。Ajax
能够实现动态不刷新(局部刷新)
- 缺点:
- 安全问题
AJAX
暴露了与服务器交互的细节。 - 对搜索引擎的支持比较弱。
- 不容易调试。
- 安全问题
十、如何解决跨域问题?
jsonp
、iframe
、window.name
、window.postMessage
、服务器上设置代理页面
十一、模块化开发怎么作?
- 当即执行函数,不暴露私有成员
var module1 = (function(){ var _count = 0; var m1 = function(){ //... }; var m2 = function(){ //... }; return { m1 : m1, m2 : m2 }; })();
十二、异步加载JS的方式有哪些?
- defer,只支持
IE
async
:- 建立
script
,插入到DOM
中,加载完毕后callBack
1三、那些操做会形成内存泄漏?
- 内存泄漏指任何对象在您再也不拥有或须要它以后仍然存在
setTimeout
的第一个参数使用字符串而非函数的话,会引起内存泄漏- 闭包使用不当
1四、XML和JSON的区别?
-
数据体积方面
JSON
相对于XML
来说,数据的体积小,传递的速度更快些。
-
数据交互方面
JSON
与JavaScript
的交互更加方便,更容易解析处理,更好的数据交互
-
数据描述方面
JSON
对数据的描述性比XML
较差
-
传输速度方面
JSON
的速度要远远快于XML
1五、谈谈你对webpack的见解
WebPack
是一个模块打包工具,你能够使用WebPack
管理你的模块依赖,并编绎输出模块们所需的静态文件。它可以很好地管理、打包Web
开发中所用到的HTML
、Javascript
、CSS
以及各类静态文件(图片、字体等),让开发过程更加高效。对于不一样类型的资源,webpack
有对应的模块加载器。webpack
模块打包器会分析模块间的依赖关系,最后 生成了优化且合并后的静态资源
1六、说说你对AMD和Commonjs的理解
CommonJS
是服务器端模块的规范,Node.js
采用了这个规范。CommonJS
规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操做。AMD
规范则是非同步加载模块,容许指定回调函数AMD
推荐的风格经过返回一个对象作为模块对象,CommonJS
的风格经过对module.exports
或exports
的属性赋值来达到暴露模块对象的目的
1七、常见web安全及防御原理
-
sql
注入原理- 就是经过把
SQL
命令插入到Web
表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
- 就是经过把
-
总的来讲有如下几点
- 永远不要信任用户的输入,要对用户的输入进行校验,能够经过正则表达式,或限制长度,对单引号和双
"-"
进行转换等 - 永远不要使用动态拼装SQL,能够使用参数化的
SQL
或者直接使用存储过程进行数据查询存取 - 永远不要使用管理员权限的数据库链接,为每一个应用使用单独的权限有限的数据库链接
- 不要把机密信息明文存放,请加密或者
hash
掉密码和敏感的信息
- 永远不要信任用户的输入,要对用户的输入进行校验,能够经过正则表达式,或限制长度,对单引号和双
XSS原理及防范
Xss(cross-site scripting)
攻击指的是攻击者往Web
页面里插入恶意html
标签或者javascript
代码。好比:攻击者在论坛中放一个看似安全的连接,骗取用户点击后,窃取cookie
中的用户私密信息;或者攻击者在论坛中加一个恶意表单,当用户提交表单的时候,却把信息传送到攻击者的服务器中,而不是用户本来觉得的信任站点
XSS防范方法
- 首先代码里对用户输入的地方和变量都须要仔细检查长度和对
”<”,”>”,”;”,”’”
等字符作过滤;其次任何内容写到页面以前都必须加以encode,避免不当心把html tag
弄出来。这一个层面作好,至少能够堵住超过一半的XSS 攻击
XSS与CSRF有什么区别吗?
-
XSS
是获取信息,不须要提早知道其余用户页面的代码和数据包。CSRF
是代替用户完成指定的动做,须要知道其余用户页面的代码和数据包。要完成一次CSRF
攻击,受害者必须依次完成两个步骤 -
登陆受信任网站
A
,并在本地生成Cookie
-
在不登出
A
的状况下,访问危险网站B
CSRF的防护
- 服务端的
CSRF
方式方法不少样,但总的思想都是一致的,就是在客户端页面增长伪随机数 - 经过验证码的方法
1八、用过哪些设计模式?
-
工厂模式:
- 工厂模式解决了重复实例化的问题,但还有一个问题,那就是识别问题,由于根本没法
- 主要好处就是能够消除对象间的耦合,经过使用工程方法而不是
new
关键字
-
构造函数模式
- 使用构造函数的方法,即解决了重复实例化的问题,又解决了对象识别的问题,该模式与工厂模式的不一样之处在于
- 直接将属性和方法赋值给
this
对象;
1九、为何要有同源限制?
- 同源策略指的是:协议,域名,端口相同,同源策略是一种安全协议
- 举例说明:好比一个黑客程序,他利用
Iframe
把真正的银行登陆页面嵌到他的页面上,当你使用真实的用户名,密码登陆时,他的页面就能够经过Javascript
读取到你的表单中input
中的内容,这样用户名,密码就轻松到手了。
20、offsetWidth/offsetHeight,clientWidth/clientHeight与scrollWidth/scrollHeight的区别
offsetWidth/offsetHeight
返回值包含content + padding + border,效果与e.getBoundingClientRect()相同clientWidth/clientHeight
返回值只包含content + padding,若是有滚动条,也不包含滚动条scrollWidth/scrollHeight
返回值包含content + padding + 溢出内容的尺寸
2一、javascript有哪些方法定义对象
- 对象字面量:
var obj = {};
- 构造函数:
var obj = new Object();
- Object.create():
var obj = Object.create(Object.prototype);
2二、常见兼容性问题?
png24
位的图片在iE6浏览器上出现背景,解决方案是作成PNG8
- 浏览器默认的
margin
和padding
不一样。解决方案是加一个全局的*{margin:0;padding:0;}
来统一,,可是全局效率很低,通常是以下这样解决:
body,ul,li,ol,dl,dt,dd,form,input,h1,h2,h3,h4,h5,h6,p{ margin:0; padding:0; }
IE
下,event
对象有x
,y
属性,可是没有pageX
,pageY
属性Firefox
下,event
对象有pageX
,pageY
属性,可是没有x,y
属性.
2二、说说你对promise的了解
-
依照
Promise/A+
的定义,Promise
有四种状态:-
pending:
初始状态, 非fulfilled
或rejected.
-
fulfilled:
成功的操做. -
rejected:
失败的操做. -
settled: Promise
已被fulfilled
或rejected
,且不是pending
-
-
另外,
fulfilled
与rejected
一块儿合称settled
-
Promise
对象用来进行延迟(deferred
) 和异步(asynchronous
) 计算
Promise 的构造函数
- 构造一个
Promise
,最基本的用法以下:
var promise = new Promise(function(resolve, reject) { if (...) { // succeed resolve(result); } else { // fails reject(Error(errMessage)); } });
Promise
实例拥有then
方法(具备then
方法的对象,一般被称为thenable
)。它的使用方法以下:
promise.then(onFulfilled, onRejected)
- 接收两个函数做为参数,一个在
fulfilled
的时候被调用,一个在rejected
的时候被调用,接收参数就是future
,onFulfilled
对应resolve
,onRejected
对应reject
2三、你以为jQuery源码有哪些写的好的地方
jquery
源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,而后经过传入window
对象参数,能够使window
对象做为局部变量使用,好处是当jquery
中访问window
对象的时候,就不用将做用域链退回到顶层做用域了,从而能够更快的访问window对象。一样,传入undefined
参数,能够缩短查找undefined
时的做用域链jquery
将一些原型属性和方法封装在了jquery.prototype
中,为了缩短名称,又赋值给了jquery.fn
,这是很形象的写法- 有一些数组或对象的方法常常能使用到,
jQuery
将其保存为局部变量以提升访问速度 jquery
实现的链式调用能够节约代码,所返回的都是同一个对象,能够提升代码效率
2四、vue、react、angular
-
Vue.js
一个用于建立web
交互界面的库,是一个精简的MVVM
。它经过双向数据绑定把View
层和Model
层链接了起来。实际的DOM
封装和输出格式都被抽象为了Directives
和Filters
-
AngularJS
是一个比较完善的前端MVVM
框架,包含模板,数据双向绑定,路由,模块化,服务,依赖注入等全部功能,模板功能强大丰富,自带了丰富的Angular
指令 -
react
React
仅仅是VIEW
层是facebook
公司。推出的一个用于构建UI
的一个库,可以实现服务器端的渲染。用了virtual dom
,因此性能很好。
2五、Node的应用场景
-
特色:
- 一、它是一个
Javascript
运行环境 - 二、依赖于
Chrome V8
引擎进行代码解释 - 三、事件驱动
- 四、非阻塞
I/O
- 五、单进程,单线程
- 一、它是一个
-
优势:
- 高并发(最重要的优势)
-
缺点:
- 一、只支持单
核CPU
,不能充分利用CPU
- 二、可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
- 一、只支持单
2六、谈谈你对AMD、CMD的理解
-
CommonJS
是服务器端模块的规范,Node.js
采用了这个规范。CommonJS
规范加载模块是同步的,也就是说,只有加载完成,才能执行后面的操做。AMD
规范则是非同步加载模块,容许指定回调函数 -
AMD
推荐的风格经过返回一个对象作为模块对象,CommonJS
的风格经过对module.exports
或exports
的属性赋值来达到暴露模块对象的目的
2七、那些操做会形成内存泄漏?
- 内存泄漏指任何对象在您再也不拥有或须要它以后仍然存在
-
setTimeout
的第一个参数使用字符串而非函数的话,会引起内存泄漏 - 闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
2八、web开发中会话跟踪的方法有哪些
cookie
session
-
url
重写 - 隐藏
input
-
ip
地址
2九、介绍js的基本数据类型
-
Undefined
、Null
、Boolean
、Number
、String
30、介绍js有哪些内置对象?
-
Object
是JavaScript
中全部对象的父对象 - 数据封装类对象:
Object
、Array
、Boolean
、Number
和String
- 其余对象:
Function
、Arguments
、Math
、Date
、RegExp
、Error
3一、说几条写JavaScript的基本规范?
- 不要在同一行声明多个变量
- 请使用
===/!==
来比较true/false
或者数值 - 使用对象字面量替代
new Array
这种形式 - 不要使用全局函数
-
Switch
语句必须带有default
分支 -
If
语句必须使用大括号 -
for-in
循环中的变量 应该使用var
关键字明确限定做用域,从而避免做用域污
3二、JavaScript有几种类型的值?,你能画一下他们的内存图吗?
- 栈:原始数据类型(
Undefined
,Null
,Boolean
,Numbe
r、String
) - 堆:引用数据类型(对象、数组和函数)
- 两种类型的区别是:存储位置不一样;
- 原始数据类型直接存储在栈(
stack
)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,因此放入栈中存储; - 引用数据类型存储在堆(
heap
)中的对象,占据空间大、大小不固定,若是存储在栈中,将会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其 - 在栈中的地址,取得地址后从堆中得到实体

3三、javascript建立对象的几种方式?
javascript
建立对象简单的说,无非就是使用内置对象或各类自定义对象,固然还能够用JSON
;但写法有不少种,也能混合使用
- 对象字面量的方式
person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
- 用
function
来模拟无参的构造函数
function Person(){} var person=new Person();//定义一个function,若是使用new"实例化",该function能够看做是一个Class person.name="Mark"; person.age="25"; person.work=function(){ alert(person.name+" hello..."); } person.work();
- 用
function
来模拟参构造函数来实现(用this
关键字定义构造的上下文属性)
function Pet(name,age,hobby){ this.name=name;//this做用域:当前对象 this.age=age; this.hobby=hobby; this.eat=function(){ alert("我叫"+this.name+",我喜欢"+this.hobby+",是个程序员"); } } var maidou =new Pet("麦兜",25,"coding");//实例化、建立对象 maidou.eat();//调用eat方法
- 用工厂方式来建立(内置对象)
var wcDog =new Object(); wcDog.name="旺财"; wcDog.age=3; wcDog.work=function(){ alert("我是"+wcDog.name+",汪汪汪......"); } wcDog.work();
- 用原型方式来建立
function Dog(){ } Dog.prototype.name="旺财"; Dog.prototype.eat=function(){ alert(this.name+"是个吃货"); } var wangcai =new Dog(); wangcai.eat();
- 用混合方式来建立
function Car(name,price){ this.name=name; this.price=price; } Car.prototype.sell=function(){ alert("我是"+this.name+",我如今卖"+this.price+"万元"); } var camry =new Car("凯美瑞",27); camry.sell();
3四、eval是作什么的?
- 它的功能是把对应的字符串解析成
JS
代码并运行 - 应该避免使用
eval
,不安全,很是耗性能(2
次,一次解析成js
语句,一次执行) - 由
JSON
字符串转换为JSON对象的时候能够用eval,var obj =eval('('+ str +')')
3五、null,undefined 的区别?
-
undefined
表示不存在这个值。 -
undefined
:是一个表示"无"的原始值或者说表示"缺乏值",就是此处应该有一个值,可是尚未定义。当尝试读取时会返回undefined
-
例如变量被声明了,但没有赋值时,就等于
undefined
-
null
表示一个对象被定义了,值为“空值” -
null
: 是一个对象(空对象, 没有任何属性和方法) -
例如做为函数的参数,表示该函数的参数不是对象;
-
在验证
null
时,必定要使用===
,由于==
没法分别null
和undefined
3六、["1", "2", "3"].map(parseInt) 答案是多少?
[1, NaN, NaN]
由于parseInt
须要两个参数(val, radix)
,其中radix
表示解析时用的基数。map
传了3
个(element, index, array)
,对应的radix
不合法致使解析失败。
3七、javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?
use strict
是一种ECMAscript 5
添加的(严格)运行模式,这种模式使得 Javascript 在更严格的条件下运行,使JS
编码更加规范化的模式,消除Javascript
语法的一些不合理、不严谨之处,减小一些怪异行为
3八、JSON 的了解?
-
JSON(JavaScript Object Notation)
是一种轻量级的数据交换格式 -
它是基于
JavaScript
的一个子集。数据格式简单, 易于读写, 占用带宽小 -
JSON
字符串转换为JSON对象:
var obj =eval('('+ str +')'); var obj = str.parseJSON(); var obj = JSON.parse(str);
JSON
对象转换为JSON字符串:
var last=obj.toJSONString(); var last=JSON.stringify(obj);
3九、js延迟加载的方式有哪些?
defer
和async
、动态建立DOM
方式(用得最多)、按需异步载入js
40、同步和异步的区别?
- 同步:浏览器访问服务器请求,用户看获得页面刷新,从新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操做
- 异步:浏览器访问服务器请求,用户正常操做,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容
4一、渐进加强和优雅降级
-
渐进加强 :针对低版本浏览器进行构建页面,保证最基本的功能,而后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
-
优雅降级 :一开始就构建完整的功能,而后再针对低版本浏览器进行兼容
4二、defer和async
defer
并行加载js
文件,会按照页面上script
标签的顺序执行async
并行加载js
文件,下载完成当即执行,不会按照页面上script
标签的顺序执行
4三、说说严格模式的限制
- 变量必须声明后再使用
- 函数的参数不能有同名属性,不然报错
- 不能使用
with
语句 - 禁止
this
指向全局对象
4四、attribute和property的区别是什么?
attribute
是dom
元素在文档中做为html
标签拥有的属性;property
就是dom
元素在js
中做为对象拥有的属性。- 对于
html
的标准属性来讲,attribute
和property
是同步的,是会自动更新的 - 可是对于自定义的属性来讲,他们是不一样步的
4五、谈谈你对ES6的理解
- 新增模板字符串(为
JavaScript
提供了简单的字符串插值功能) - 箭头函数
for-of
(用来遍历数据—例如数组中的值。)arguments
对象可被不定参数和默认参数完美代替。ES6
将promise
对象归入规范,提供了原生的Promise
对象。- 增长了
let
和const
命令,用来声明变量。 - 增长了块级做用域。
let
命令实际上就增长了块级做用域。- 还有就是引入
module
模块的概念
4六、ECMAScript6 怎么写class么,为何会出现class这种东西?
- 这个语法糖可让有
OOP
基础的人更快上手js
,至少是一个官方的实现了 - 但对熟悉
js
的人来讲,这个东西没啥大影响;一个Object.creat()
搞定继承,比class
简洁清晰的多
4七、什么是面向对象编程及面向过程编程,它们的异同和优缺点
- 面向过程就是分析出解决问题所须要的步骤,而后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就能够了
- 面向对象是把构成问题事务分解成各个对象,创建对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为
- 面向对象是以功能来划分问题,而不是步骤
4八、面向对象编程思想
- 基本思想是使用对象,类,继承,封装等基本概念来进行程序设计
- 优势
- 易维护
- 采用面向对象思想设计的结构,可读性高,因为继承的存在,即便改变需求,那么维护也只是在局部模块,因此维护起来是很是方便和较低成本的
- 易扩展
- 开发工做的重用性、继承性高,下降重复工做量。
- 缩短了开发周期
- 易维护
4九、对web标准、可用性、可访问性的理解
- 可用性(Usability):产品是否容易上手,用户可否完成任务,效率如何,以及这过程当中用户的主观感觉可好,是从用户的角度来看产品的质量。可用性好意味着产品质量高,是企业的核心竞争力
- 可访问性(Accessibility):Web内容对于残障用户的可阅读和可理解性
- 可维护性(Maintainability):通常包含两个层次,一是当系统出现问题时,快速定位并解决问题的成本,成本低则可维护性好。二是代码是否容易被人理解,是否容易修改和加强功能。
50、如何经过JS判断一个数组?
instanceof
方法instanceof
运算符是用来测试一个对象是否在其原型链原型构造函数的属性
var arr = []; arr instanceof Array; // true
constructor
方法constructor
属性返回对建立此对象的数组函数的引用,就是返回对象相对应的构造函数
var arr = []; arr.constructor == Array; //true
- 最简单的方法
- 这种写法,是
jQuery
正在使用的
- 这种写法,是
Object.prototype.toString.call(value) == '[object Array]' // 利用这个方法,能够写一个返回数据类型的方法 var isType = function (obj) { return Object.prototype.toString.call(obj).slice(8,-1); }
ES5
新增方法isArray()
var a = new Array(123); var b = new Date(); console.log(Array.isArray(a)); //true console.log(Array.isArray(b)); //false
5一、谈一谈let与var的区别?
let
命令不存在变量提高,若是在let
前使用,会致使报错- 若是块区中存在
let
和const
命令,就会造成封闭做用域 - 不容许重复声明,所以,不能在函数内部从新声明参数
5二、map与forEach的区别?
- forEach方法,是最基本的方法,就是遍历与循环,默认有3个传参:分别是遍历的数组内容item、数组索引index、和当前遍历数组Array
- map方法,基本用法与forEach一致,可是不一样的,它会返回一个新的数组,因此在callback须要有return值,若是没有,会返回undefined
5三、谈一谈你理解的函数式编程?
- 简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论
- 它具备如下特性:闭包和高阶函数、惰性计算、递归、函数是"第一等公民"、只用"表达式"
5四、谈一谈箭头函数与普通函数的区别?
- 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象
- 不能够看成构造函数,也就是说,不能够使用new命令,不然会抛出一个错误
- 不能够使用arguments对象,该对象在函数体内不存在。若是要用,能够用Rest参数代替
- 不能够使用yield命令,所以箭头函数不能用做Generator函数
5五、谈一谈函数中this的指向吧?
-
this的指向在函数定义的时候是肯定不了的,只有函数执行的时候才能肯定this到底指向谁,实际上this的最终指向的是那个调用它的对象
-
《javascript语言精髓》中大概归纳了4种调用方式:
-
方法调用模式
-
函数调用模式
-
构造器调用模式
graph LR A-->B
- apply/call调用模式
5六、异步编程的实现方式?
-
回调函数
- 优势:简单、容易理解
- 缺点:不利于维护,代码耦合高
-
事件监听(采用时间驱动模式,取决于某个事件是否发生):
- 优势:容易理解,能够绑定多个事件,每一个事件能够指定多个回调函数
- 缺点:事件驱动型,流程不够清晰
-
发布/订阅(观察者模式)
- 相似于事件监听,可是能够经过‘消息中心’,了解如今有多少发布者,多少订阅者
-
Promise对象
- 优势:能够利用then方法,进行链式写法;能够书写错误时的回调函数;
- 缺点:编写和理解,相对比较难
-
Generator函数
- 优势:函数体内外的数据交换、错误处理机制
- 缺点:流程管理不方便
-
async函数
- 优势:内置执行器、更好的语义、更广的适用性、返回的是Promise、结构清晰。
- 缺点:错误处理机制
5七、对原生Javascript了解程度
- 数据类型、运算、对象、Function、继承、闭包、做用域、原型链、事件、
RegExp
、JSON
、Ajax
、DOM
、BOM
、内存泄漏、跨域、异步装载、模板引擎、前端MVC
、路由、模块化、Canvas
、ECMAScript
5八、Js动画与CSS动画区别及相应实现
CSS3
的动画的优势- 在性能上会稍微好一些,浏览器会对
CSS3
的动画作一些优化 - 代码相对简单
- 在性能上会稍微好一些,浏览器会对
- 缺点
- 在动画控制上不够灵活
- 兼容性很差
JavaScript
的动画正好弥补了这两个缺点,控制能力很强,能够单帧的控制、变换,同时写得好彻底能够兼容IE6
,而且功能强大。对于一些复杂控制的动画,使用javascript
会比较靠谱。而在实现一些小的交互动效的时候,就多考虑考虑CSS
吧
5九、JS 数组和对象的遍历方式,以及几种方式的比较
一般咱们会用循环的方式来遍历数组。可是循环是 致使js 性能问题的缘由之一。通常咱们会采用下几种方式来进行数组的遍历
-
for in
循环 -
for
循环 -
forEach
- 这里的
forEach
回调中两个参数分别为value
,index
forEach
没法遍历对象- IE不支持该方法;
Firefox
和chrome
支持 forEach
没法使用break
,continue
跳出循环,且使用return
是跳过本次循环
- 这里的
-
这两种方法应该很是常见且使用很频繁。但实际上,这两种方法都存在性能问题
-
在方式一中,
for-in
须要分析出array
的每一个属性,这个操做性能开销很大。用在key
已知的数组上是很是不划算的。因此尽可能不要用for-in
,除非你不清楚要处理哪些属性,例如JSON
对象这样的状况 -
在方式2中,循环每进行一次,就要检查一下数组长度。读取属性(数组长度)要比读局部变量慢,尤为是当
array
里存放的都是DOM
元素,由于每次读取都会扫描一遍页面上的选择器相关元素,速度会大大下降
60、gulp是什么?
gulp
是前端开发过程当中一种基于流的代码构建工具,是自动化项目的构建利器;它不只能对网站资源进行优化,并且在开发过程当中不少重复的任务可以使用正确的工具自动完成- Gulp的核心概念:流
- 流,简单来讲就是创建在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了一些处理数据的基本操做,如读取数据,写入数据等,程序员是对流进行全部操做的,而不用关心流的另外一头数据的真正流向
- gulp正是经过流和代码优于配置的策略来尽可能简化任务编写的工做
- Gulp的特色:
- 易于使用:经过代码优于配置的策略,gulp 让简单的任务简单,复杂的任务可管理
- 构建快速 利用
Node.js
流的威力,你能够快速构建项目并减小频繁的IO
操做 - 易于学习 经过最少的
API
,掌握gulp
绝不费力,构建工做尽在掌握:如同一系列流管道
6一、说一下Vue的双向绑定数据的原理
vue.js
则是采用数据劫持结合发布者-订阅者模式的方式,经过Object.defineProperty()
来劫持各个属性的setter
,getter
,在数据变更时发布消息给订阅者,触发相应的监听回调
$jQuery
一、你以为jQuery或zepto源码有哪些写的好的地方
- jquery源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,而后经过传入window对象参数,能够使window对象做为局部变量使用,好处是当jquery中访问window对象的时候,就不用将做用域链退回到顶层做用域了,从而能够更快的访问window对象。一样,传入undefined参数,能够缩短查找undefined时的做用域链
(function( window, undefined ) { //用一个函数域包起来,就是所谓的沙箱 //在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局 //把当前沙箱须要的外部变量经过函数参数引入进来 //只要保证参数对内提供的接口的一致性,你还能够随意替换传进来的这个参数 window.jQuery = window.$ = jQuery; })( window );
- jquery将一些原型属性和方法封装在了jquery.prototype中,为了缩短名称,又赋值给了jquery.fn,这是很形象的写法
- 有一些数组或对象的方法常常能使用到,jQuery将其保存为局部变量以提升访问速度
- jquery实现的链式调用能够节约代码,所返回的都是同一个对象,能够提升代码效率
二、jQuery 的实现原理?
-
(function(window, undefined) {})(window);
-
jQuery
利用JS
函数做用域的特性,采用当即调用表达式包裹了自身,解决命名空间和变量污染问题 -
window.jQuery = window.$ = jQuery;
-
在闭包当中将 jQuery 和 $ 绑定到 window 上,从而将 jQuery 和 $ 暴露为全局变量
三、jQuery.fn
的 init
方法返回的 this
指的是什么对象? 为何要返回 this
?
- jQuery.fn 的 init 方法 返回的 this 就是 jQuery 对象
- 用户使用 jQuery() 或 $() 便可初始化 jQuery 对象,不须要动态的去调用 init 方法
四、jQuery.extend 与 jQuery.fn.extend 的区别?
$.fn.extend()
和$.extend()
是jQuery
为扩展插件提拱了两个方法$.extend(object)
; // 为jQuery添加“静态方法”(工具方法)
$.extend({
min: function(a, b) { return a < b ? a : b; }, max: function(a, b) { return a > b ? a : b; } }); $.min(2,3); // 2 $.max(4,5); // 5
- $.extend([true,] targetObject, object1[, object2]); // 对targt对象进行扩展
var settings = {validate:false, limit:5}; var options = {validate:true, name:"bar"}; $.extend(settings, options); // 注意:不支持第一个参数传 false // settings == {validate:true, limit:5, name:"bar"}
$.fn.extend(json)
; // 为jQuery添加“成员函数”(实例方法)
$.fn.extend({
alertValue: function() { $(this).click(function(){ alert($(this).val()); }); } }); $("#email").alertValue();
五、jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?
-
浅拷贝(只复制一份原始对象的引用)
var newObject = $.extend({}, oldObject);
-
深拷贝(对原始对象属性所引用的对象进行进行递归拷贝)
var newObject = $.extend(true, {}, oldObject);
六、jQuery 的队列是如何实现的?队列能够用在哪些地方?
- jQuery 核心中有一组队列控制方法,由
queue()/dequeue()/clearQueue()
三个方法组成。 - 主要应用于
animate()
,ajax
,其余要按时间顺序执行的事件中
var func1 = function(){alert('事件1');} var func2 = function(){alert('事件2');} var func3 = function(){alert('事件3');} var func4 = function(){alert('事件4');} // 入栈队列事件 $('#box').queue("queue1", func1); // push func1 to queue1 $('#box').queue("queue1", func2); // push func2 to queue1 // 替换队列事件 $('#box').queue("queue1", []); // delete queue1 with empty array $('#box').queue("queue1", [func3, func4]); // replace queue1 // 获取队列事件(返回一个函数数组) $('#box').queue("queue1"); // [func3(), func4()] // 出栈队列事件并执行 $('#box').dequeue("queue1"); // return func3 and do func3 $('#box').dequeue("queue1"); // return func4 and do func4 // 清空整个队列 $('#box').clearQueue("queue1"); // delete queue1 with clearQueue
七、jQuery 中的 bind(), live(), delegate(), on()的区别?
bind
直接绑定在目标元素上live
经过冒泡传播事件,默认document
上,支持动态数据delegate
更精确的小范围使用事件代理,性能优于 liveon
是最新的1.9
版本整合了以前的三种方式的新事件绑定机制
八、是否知道自定义事件? jQuery 里的 fire 函数是什么意思,何时用?
- 事件即“发布/订阅”模式,自定义事件即“消息发布”,事件的监听即“订阅订阅”
- JS 原生支持自定义事件,示例:
document.createEvent(type); // 建立事件 event.initEvent(eventType, canBubble, prevent); // 初始化事件 target.addEventListener('dataavailable', handler, false); // 监听事件 target.dispatchEvent(e); // 触发事件
- jQuery 里的 fire 函数用于调用 jQuery 自定义事件列表中的事件
九、jQuery 经过哪一个方法和 Sizzle 选择器结合的?
Sizzle
选择器采起Right To Left
的匹配模式,先搜寻全部匹配标签,再判断它的父节点jQuery
经过$(selecter).find(selecter);
和Sizzle
选择器结合
十、jQuery 中如何将数组转化为 JSON 字符串,而后再转化回来?
// 经过原生 JSON.stringify/JSON.parse 扩展 jQuery 实现 $.array2json = function(array) { return JSON.stringify(array); } $.json2array = function(array) { // $.parseJSON(array); // 3.0 开始,已过期 return JSON.parse(array); } // 调用 var json = $.array2json(['a', 'b', 'c']); var array = $.json2array(json);
十一、jQuery 一个对象能够同时绑定多个事件,这是如何实现的?
$("#btn").on("mouseover mouseout", func); $("#btn").on({ mouseover: func1, mouseout: func2, click: func3 });
十二、针对 jQuery 的优化方法?
- 缓存频繁操做
DOM
对象 - 尽可能使用
id
选择器代替class
选择器 - 老是从
#id
选择器来继承 - 尽可能使用链式操做
- 使用时间委托
on
绑定事件 - 采用
jQuery
的内部函数data()
来存储数据 - 使用最新版本的
jQuery
1三、jQuery 的 slideUp 动画,当鼠标快速连续触发, 动画会滞后反复执行,该如何处理呢?
- 在触发元素上的事件设置为延迟处理:使用
JS
原生setTimeout
方法 - 在触发元素的事件时预先中止全部的动画,再执行相应的动画事件:
$('.tab').stop().slideUp();
1四、jQuery UI 如何自定义组件?
- 经过向
$.widget()
传递组件名称和一个原型对象来完成 $.widget("ns.widgetName", [baseWidget], widgetPrototype);
1五、jQuery 与 jQuery UI、jQuery Mobile 区别?
-
jQuery
是JS
库,兼容各类PC浏览器,主要用做更方便地处理DOM
、事件、动画、AJAX
-
jQuery UI
是创建在jQuery
库上的一组用户界面交互、特效、小部件及主题 -
jQuery Mobile
以jQuery
为基础,用于建立“移动Web应用”的框架
1六、jQuery 和 Zepto 的区别? 各自的使用场景?
jQuery
主要目标是PC
的网页中,兼容所有主流浏览器。在移动设备方面,单独推出 `jQuery MobileZepto
从一开始就定位移动设备,相对更轻量级。它的
API基本兼容
jQuery`,但对PC浏览器兼容不理想
1七、jQuery对象的特色
- 只有
JQuery
对象才能使用JQuery
方法 JQuery
对象是一个数组对象
$编程题
一、写一个通用的事件侦听器函数
// event(事件)工具集,来源:github.com/markyun markyun.Event = { // 视能力分别使用dom0||dom2||IE方式 来绑定事件 // 参数: 操做的元素,事件名称 ,事件处理程序 addEvent : function(element, type, handler) { if (element.addEventListener) { //事件类型、须要执行的函数、是否捕捉 element.addEventListener(type, handler, false); } else if (element.attachEvent) { element.attachEvent('on' + type, function() { handler.call(element); }); } else { element['on' + type] = handler; } }, // 移除事件 removeEvent : function(element, type, handler) { if (element.removeEventListener) { element.removeEventListener(type, handler, false); } else if (element.datachEvent) { element.detachEvent('on' + type, handler); } else { element['on' + type] = null; } }, // 阻止事件 (主要是事件冒泡,由于IE不支持事件捕获) stopPropagation : function(ev) { if (ev.stopPropagation) { ev.stopPropagation(); } else { ev.cancelBubble = true; } }, // 取消事件的默认行为 preventDefault : function(event) { if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } }, // 获取事件目标 getTarget : function(event) { return event.target || event.srcElement; }
二、如何判断一个对象是否为数组
function isArray(arg) { if (typeof arg === 'object') { return Object.prototype.toString.call(arg) === '[object Array]'; } return false; }
三、冒泡排序
- 每次比较相邻的两个数,若是后一个比前一个小,换位置
var arr = [3, 1, 4, 6, 5, 7, 2]; function bubbleSort(arr) { for (var i = 0; i < arr.length - 1; i++) { for(var j = 0; j < arr.length - 1; j++) { if(arr[j + 1] < arr[j]) { var temp; temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } return arr; } console.log(bubbleSort(arr));
四、快速排序
- 采用二分法,取出中间数,数组每次和中间数比较,小的放到左边,大的放到右边
var arr = [3, 1, 4, 6, 5, 7, 2]; function quickSort(arr) { if(arr.length == 0) { return []; // 返回空数组 } var cIndex = Math.floor(arr.length / 2); var c = arr.splice(cIndex, 1); var l = []; var r = []; for (var i = 0; i < arr.length; i++) { if(arr[i] < c) { l.push(arr[i]); } else { r.push(arr[i]); } } return quickSort(l).concat(c, quickSort(r)); } console.log(quickSort(arr));
五、编写一个方法 求一个字符串的字节长度
- 假设:一个英文字符占用一个字节,一个中文字符占用两个字节
function GetBytes(str){ var len = str.length; var bytes = len; for(var i=0; i<len; i++){ if (str.charCodeAt(i) > 255) bytes++; } return bytes; } alert(GetBytes("你好,as"));
六、bind的用法,以及如何实现bind的函数和须要注意的点
-
bind
的做用与call
和apply
相同,区别是call
和apply
是当即调用函数,而bind
是返回了一个函数,须要调用的时候再执行。
一个简单的bind
函数实现以下
Function.prototype.bind = function(ctx) { var fn = this; return function() { fn.apply(ctx, arguments); }; };
$其余
一、谈谈你对重构的理解
-
网站重构:在不改变外部行为的前提下,简化结构、添加可读性,而在网站前端保持一致的行为。也就是说是在不改变UI的状况下,对网站进行优化, 在扩展的同时保持一致的UI
-
对于传统的网站来讲重构一般是:
-
表格(
table
)布局改成DIV+CSS
-
使网站前端兼容于现代浏览器(针对于不合规范的
CSS
、如对IE6有效的) -
对于移动平台的优化
-
针对于
SEO
进行优化
-
二、什么样的前端代码是好的
- 高复用低耦合,这样文件小,好维护,并且好扩展。
三、对前端工程师这个职位是怎么样理解的?它的前景会怎么样?
-
前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近
- 实现界面交互
- 提高用户体验
- 有了Node.js,前端能够实现服务端的一些事情
-
前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好,
-
与团队成员,
UI
设计,产品经理的沟通; -
作好的页面结构,页面重构和用户体验;
四、你以为前端工程的价值体如今哪
-
为简化用户使用提供技术支持(交互部分)
-
为多个浏览器兼容性提供支持
-
为提升用户浏览速度(浏览器性能)提供支持
-
为跨平台或者其余基于webkit或其余渲染引擎的应用提供支持
-
为展现数据提供支持(数据接口)
五、平时如何管理你的项目?
-
先期团队必须肯定好全局样式(
globe.css
),编码模式(utf-8
) 等; -
编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);
-
标注样式编写人,各模块都及时标注(标注关键样式调用的地方);
-
页面进行标注(例如 页面 模块 开始和结束);
-
CSS
跟HTML
分文件夹并行存放,命名都得统一(例如style.css
); -
JS
分文件夹存放 命名以该JS
功能为准的英文翻译。 -
图片采用整合的
images.png png8
格式文件使用 - 尽可能整合在一块儿使用方便未来的管理
简单类型:String
、Number
、Boolean
、Null
、Undefined
复杂类型:Object
ES6新增类型:Symbol
(感谢TimeTraveler指出)
&
扩展:
- null与undefined有什么区别
答:null
表示一个对象被定义了,值为“空值”,而undefined
表示不存在这个值。
正由于这个缘由,因此使用typeof
判断是,null
返回的是object
,而undefined
返回的是undefined
。(判断二者时须要使用===
严格判断) - Boolean类型在进行判断的时候设置为 0、-0、null、""、false、undefined 或 NaN,则该对象设置为 false。不然设置为 true(即便 value 参数是字符串 "false")
- instanceof方法
instanceof
运算符是用来测试一个对象是否在其原型链原型构造函数的属性。var arr = []; arr instanceof Array; // true
- constructor方法
constructor
属性返回对建立此对象的数组函数的引用,就是返回对象相对应的构造函数。var arr = []; arr.constructor == Array; //true
- 特性判断法
利用判断数组独有的length
和splice
方法,可是这是不靠谱的,由于对象也能添加方法和属性。那怎么办了,有一个办法,能够利用数组的length属性
无法枚举来判断。function isArray(object){ return object && typeof object==='object' && typeof object.length==='number' && typeof object.splice==='function' && //判断length属性是不是可枚举的 对于数组 将获得false !(object.propertyIsEnumerable('length')); }
- 最简单的方法
这种写法,是 jQuery 正在使用的,淘宝的 kissy 也是使用这种方式。Object.prototype.toString.call(value) == '[object Array]' // 利用这个方法,能够写一个返回数据类型的方法 var isType = function (obj) { return Object.prototype.toString.call(obj).slice(8,-1); }
- ES5新增方法isArray()
var a = new Array(123); var b = new Date(); console.log(Array.isArray(a)); //true console.log(Array.isArray(b)); //false
&
扩展:- 使用
instaceof
和construcor
,被判断的array
必须是在当前页面声明的。好比,一个页面(父页面)有一个框架,框架中引用了一个页面(子页面),在子页面中声明了一个array
,并将其赋值给父页面的一个变量,这时判断该变量,Array == object.constructor;
会返回false
。 - 最简单的方法,在IE6下判断
null
和undefined
,有一些bug,判断undefined
和null
均为Object
,(并非bug
,是在ES3的标准下返回的就为Object
)
- 使用
如今查了一下,才知道,原来没有那么简单!!!
简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。
它具备如下特性:闭包和高阶函数、惰性计算、递归、函数是"第一等公民"、只用"表达式",不用"语句"(都会有返回值)、没有"反作用"、不修改状态、引用透明性。
具体的特性表明了什么,我还要好好研究一下!!
- 箭头函数使得表达更加简洁。(这个是废话)
- 函数体内的
this
对象,就是定义时所在的对象,而不是使用时所在的对象。 - 不能够看成构造函数,也就是说,不能够使用
new
命令,不然会抛出一个错误。 - 不能够使用
arguments
对象,该对象在函数体内不存在。若是要用,能够用Rest参数
代替。 - 不能够使用
yield
命令,所以箭头函数不能用做Generator
函数。
「闭包」,是指那些可以访问独立(自由)变量的函数 (变量在本地使用,但定义在一个封闭的做用域中)。换句话说,这些函数能够“记忆”它被建立时候的环境。特性:
- 函数嵌套函数
- 函数内部能够引用外部的参数和变量
- 参数和变量不会被垃圾回收机制回收
- 回调函数:
- 优势:简单、容易理解
- 缺点:不利于维护,代码耦合高
- 事件监听(采用时间驱动模式,取决于某个事件是否发生):
- 优势:容易理解,能够绑定多个事件,每一个事件能够指定多个回调函数
- 缺点:事件驱动型,流程不够清晰
- 发布/订阅(观察者模式):
- 相似于事件监听,可是能够经过‘消息中心’,了解如今有多少发布者,多少订阅者。
- Promise对象
- 优势:能够利用then方法,进行链式写法;能够书写错误时的回调函数;
- 缺点:编写和理解,相对比较难
- Generator函数
- 优势:函数体内外的数据交换、错误处理机制
- 缺点:流程管理不方便
- async函数
- 优势:内置执行器、更好的语义、更广的适用性、返回的是Promise、结构清晰。
- 缺点:错误处理机制
安全问题,如 XSS 和 CSRF
- XSS:跨站脚本攻击,是一种网站应用程序的安全漏洞攻击,是代码注入的一种。常见方式是将恶意代码注入合法代码里隐藏起来,再诱发恶意代码,从而进行各类各样的非法活动。
防范:记住一点 “全部用户输入都是不可信的”,因此得作输入过滤和转义
- CSRF:跨站请求伪造,也称 XSRF,是一种挟制用户在当前已登陆的Web应用程序上执行非本意的操做的攻击方法。与 XSS 相比,XSS利用的是用户对指定网站的信任,CSRF利用的是网站对用户网页浏览器的信任。
防范:用户操做验证(验证码),额外验证机制(token使用)等
1.几种基本数据类型?复杂数据类型?值类型和引用数据类型?堆栈数据结构?
基本数据类型:Undefined、Null、Boolean、Number、String
值类型:数值、布尔值、null、undefined。
引用类型:对象、数组、函数。
堆栈数据结构:是一种支持后进先出(LIFO)的集合,即后被插入的数据,先被取出!
js数组中提供了如下几个方法可让咱们很方便实现堆栈:
shift:从数组中把第一个元素删除,并返回这个元素的值。
unshift: 在数组的开头添加一个或更多元素,并返回新的长度
push:在数组的中末尾添加元素,并返回新的长度
pop:从数组中把最后一个元素删除,并返回这个元素的值。
2.声明函数做用提高?声明变量和声明函数的提高有什么区别?
(1) 变量声明提高:变量申明在进入执行上下文就完成了。
只要变量在代码中进行了声明,不管它在哪一个位置上进行声明, js引擎都会将它的声明放在范围做用域的顶部;
(2) 函数声明提高:执行代码以前会先读取函数声明,意味着能够把函数申明放在调用它的语句后面。
只要函数在代码中进行了声明,不管它在哪一个位置上进行声明, js引擎都会将它的声明放在范围做用域的顶部;
(3) 变量or函数声明:函数声明会覆盖变量声明,但不会覆盖变量赋值。
同一个名称标识a,即有变量声明var a,又有函数声明function a() {},无论两者声明的顺序,函数声明会覆盖变量声明,也就是说,此时a的值是声明的函数function a() {}。注意:若是在变量声明的同时初始化a,或是以后对a进行赋值,此时a的值变量的值。eg: var a; var c = 1; a = 1; function a() { return true; } console.log(a);
3.判断数据类型?
typeof返回的类型都是字符串形式,能够判断function的类型;在判断除Object类型的对象时比较方便。
判断已知对象类型的方法: instanceof,后面必定要是对象类型,而且大小写不能错,该方法适合一些条件选择或分支。
4.异步编程?
方法1:回调函数,优势是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),流程会很混乱,并且每一个任务只能指定一个回调函数。
方法2:时间监听,能够绑定多个事件,每一个事件能够指定多个回调函数,并且能够“去耦合”(Decoupling),有利于实现模块化。缺点是整个程序都要变成事件驱动型,运行流程会变得很不清晰。
方法3:发布/订阅,性质与“事件监听”相似,可是明显优于后者。
方法4:Promises对象,是CommonJS工做组提出的一种规范,目的是为异步编程提供统一接口。
简单说,它的思想是,每个异步任务返回一个Promise对象,该对象有一个then方法,容许指定回调函数。
5.事件流?事件捕获?事件冒泡?
事件流:从页面中接收事件的顺序。也就是说当一个事件产生时,这个事件的传播过程,就是事件流。
IE中的事件流叫事件冒泡;事件冒泡:事件开始时由最具体的元素接收,而后逐级向上传播到较为不具体的节点(文档)。对于html来讲,就是当一个元素产生了一个事件,它会把这个事件传递给它的父元素,父元素接收到了以后,还要继续传递给它的上一级元素,就这样一直传播到document对象(亲测如今的浏览器到window对象,只有IE8及下不这样
事件捕获是不太具体的元素应该更早接受到事件,而最具体的节点应该最后接收到事件。他们的用意是在事件到达目标以前就捕获它;也就是跟冒泡的过程正好相反,以html的click事件为例,document对象(DOM级规范要求从document开始传播,可是如今的浏览器是从window对象开始的)最早接收到click事件的而后事件沿着DOM树依次向下传播,一直传播到事件的实际目标;
6.如何清除一个定时器?
window.clearInterval();
window.clearTimeout();
7.如何添加一个dom对象到body中?innerHTML和innerText区别?
body.appendChild(dom元素);
innerHTML:从对象的起始位置到终止位置的所有内容,包括Html标签。
innerText:从起始位置到终止位置的内容, 但它去除Html标签
分别简述五个window对象、属性
成员对象
window.event window.document window.history
window.screen window.navigator window.external
Window对象的属性以下:
window //窗户自身
window.self //引用本窗户window=window.self
window.name //为窗户命名
window.defaultStatus //设定窗户状态栏信息
window.location //URL地址,配备布置这个属性能够打开新的页面
8.数据持久化技术(ajax)?简述ajax流程
1)客户端产生js的事件
2)建立XMLHttpRequest对象
3)对XMLHttpRequest进行配置
4)经过AJAX引擎发送异步请求
5)服务器端接收请求而且处理请求,返回html或者xml内容
6)XML调用一个callback()处理响应回来的内容
7)页面局部刷新
9.回调函数?
回调函数就是一个经过函数指针调用的函数。若是你把函数的指针(地址)做为参数传递给另外一个函数,当这个指针被用来调用其所指向的函数时,咱们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
10.什么是闭包?* 堆栈溢出有什么区别? 内存泄漏? 那些操做会形成内存泄漏?怎么样防止内存泄漏?
闭包:就是可以读取其余函数内部变量的函数。
堆栈溢出:就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,致使数据越界,结果覆盖了别的数据。常常会在递归中发生。
内存泄露是指:用动态存储分配函数内存空间,在使用完毕后未释放,致使一直占据该内存单元。直到程序结束。指任何对象在您再也不拥有或须要它以后仍然存在。
形成内存泄漏:
setTimeout 的第一个参数使用字符串而非函数的话,会引起内存泄漏。
闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
防止内存泄露:
一、不要动态绑定事件;
二、不要在动态添加,或者会被动态移除的dom上绑事件,用事件冒泡在父容器监听事件;
三、若是要违反上面的原则,必须提供destroy方法,保证移除dom后事件也被移除,这点能够参考Backbone的源代码,作的比较好;
四、单例化,少建立dom,少绑事件。
11.平时工做中怎么样进行数据交互?若是后台没有提供数据怎么样进行开发?mock数据与后台返回的格式不一样意怎么办?
由后台编写接口文档、提供数据接口实、前台经过ajax访问实现数据交互;
在没有数据的状况下寻找后台提供静态数据或者本身定义mock数据;
返回数据不统一时编写映射文件 对数据进行映射。
12 简述ajax执行流程
基本步骤: var xhr =null;//建立对象 if(window.XMLHttpRequest){ xhr = new XMLHttpRequest(); }else{ xhr = new ActiveXObject("Microsoft.XMLHTTP"); } xhr.open(“方式”,”地址”,”标志位”);//初始化请求 xhr.setRequestHeader(“”,””);//设置http头信息 xhr.onreadystatechange =function(){}//指定回调函数 xhr.send();//发送请求
13.自执行函数?用于什么场景?好处?
自执行函数:一、声明一个匿名函数二、立刻调用这个匿名函数。
做用:建立一个独立的做用域。
好处:防止变量弥散到全局,以避免各类js库冲突。隔离做用域避免污染,或者截断做用域链,避免闭包形成引用变量没法释放。利用当即执行特性,返回须要的业务函数或对象,避免每次经过条件判断来处理
场景:通常用于框架、插件等场景
14.html和xhtml有什么区别?
HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的标记语言。
1.XHTML 元素必须被正确地嵌套。
2.XHTML 元素必须被关闭。
3.标签名必须用小写字母。
4.空标签也必须被关闭。
5.XHTML 文档必须拥有根元素。
15. 什么是构造函数?与普通函数有什么区别?
构造函数:是一种特殊的方法、主要用来建立对象时初始化对象,总与new运算符一块儿使用,建立对象的语句中构造函数的函数名必须与类名彻底相同。
与普通函数相比只能由new关键字调用,构造函数是类的标示
16. 经过new建立一个对象的时候,函数内部有哪些改变
function Person(){} Person.prototype.friend = []; Person.prototype.name = ''; // var a = new Person(); // a.friend[0] = '王琦'; // a.name = '程娇'; // var b = new Person(); // b.friend? // b.name?
一、建立一个空对象,而且 this 变量引用该对象,同时还继承了该函数的原型。
二、属性和方法被加入到 this 引用的对象中。
三、新建立的对象由 this 所引用,而且最后隐式的返回 this 。
17.事件委托?有什么好处?
(1)利用冒泡的原理,把事件加到父级上,触发执行效果
(2)好处:新添加的元素还会有以前的事件;提升性能。
18.window.onload ==? DOMContentLoaded ?
通常状况下,DOMContentLoaded事件要在window.onload以前执行,当DOM树构建完成的时候就会执行DOMContentLoaded事件,而window.onload是在页面载入完成的时候,才执行,这其中包括图片等元素。大多数时候咱们只是想在DOM树构建完成后,绑定事件到元素,咱们并不须要图片元素,加上有时候加载外域图片的速度很是缓慢。
19.节点类型?判断当前节点类型?
1. 元素节点
2. 属性节点
3. 文本节点
8. 注释节点
9. 文档节点
经过nodeObject.nodeType判断节点类型:其中,nodeObject 为DOM节点(节点对象)。该属性返回以数字表示的节点类型,例如,元素节点返回 1,属性节点返回 2 。
20.如何合并两个数组?数组删除一个元素?
//三种方法。 (1)var arr1=[1,2,3]; var arr2=[4,5,6]; arr1 = arr1.concat(arr2); console.log(arr1); (2)var arr1=[1,2,3]; var arr2=[4,5,6]; Array.prototype.push.apply(arr1,arr2); console.log(arr1); (3)var arr1=[1,2,3]; var arr2=[4,5,6]; for (var i=0; i < arr2.length; i++) { arr1.push( arr2[i] ); } console.log(arr1);
21.强制转换 显式转换 隐式转换?
//强制类型转换: Boolean(0) // => false - 零 Boolean(new object()) // => true - 对象 Number(undefined) // => NaN Number(null) // => 0 String(null) // => "null" parseInt( ) parseFloat( ) JSON.parse( ) JSON.stringify ( )
隐式类型转换:
在使用算术运算符时,运算符两边的数据类型能够是任意的,好比,一个字符串能够和数字相加。之因此不一样的数据类型之间能够作运算,是由于JavaScript引擎在运算以前会悄悄的把他们进行了隐式类型转换的
(例如:x+"" //等价于String(x)
+x //等价于Number(x)
x-0 //同上
!!x //等价于Boolean(x),是双叹号)
显式转换:
若是程序要求必定要将某一类型的数据转换为另外一种类型,则能够利用强制类型转换运算符进行转换,这种强制转换过程称为显示转换。
显示转换是你定义让这个值类型转换成你要用的值类型,是底到高的转换。例 int 到float就能够直接转,int i=5,想把他转换成char类型,就用显式转换(char)i
22. Jq中如何实现多库并存?
Noconfict 多库共存就是“$ ”符号的冲突。
方法一: 利用jQuery的实用函数$.noConflict();这个函数归还$的名称控制权给另外一个库,所以能够在页面上使用其余库。这时,咱们能够用"jQuery "这个名称调用jQuery的功能。 $.noConflict();
jQuery('#id').hide();
.....
//或者给jQuery一个别名
var $j=jQuery
$j('#id').hide();
.....
方法二: (function($){})(jQuery)
方法三: jQuery(function($){})
经过传递一个函数做为jQuery的参数,所以把这个函数声明为就绪函数。 咱们声明$为就绪函数的参数,由于jQuery老是吧jQuery对象的引用做为第一个参数传递,因此就保证了函数的执行。
23.Jq中get和eq有什么区别?
get() :取得其中一个匹配的元素。num表示取得第几个匹配的元素,get多针对集合元素,返回的是DOM对象组成的数组 eq():获取第N个元素,下标都是从0开始,返回的是一个JQuery对象
24.如何经过原生js 判断一个元素当前是显示仍是隐藏状态?
if( document.getElementById("div").css("display")==='none') if( document.getElementById("div").css("display")==='block') $("#div").is(":hidden"); // 判断是否隐藏 $("#div").is(":visible")
25.Jq如何判断元素显示隐藏?
//第一种:使用CSS属性 var display =$('#id').css('display'); if(display == 'none'){ alert("我是隐藏的!"); } //第二种:使用jquery内置选择器 <div id="test"> <p>仅仅是测试所用</p> </div> if($("#test").is(":hidden")){ $("#test").show(); //若是元素为隐藏,则将它显现 }else{ $("#test").hide(); //若是元素为显现,则将其隐藏 } //第三种:jQuery判断元素是否显示 是否隐藏 var node=$('#id'); if(node.is(':hidden')){ //若是node是隐藏的则显示node元素,不然隐藏 node.show(); }else{ node.hide(); }
26.移动端上什么是点击穿透?
点击穿透现象有3种:
点击穿透问题:点击蒙层(mask)上的关闭按钮,蒙层消失后发现触发了按钮下面元素的click事件跨页面点击穿透问题:若是按钮下面刚好是一个有href属性的a标签,那么页面就会发生跳转另外一种跨页面点击穿透问题:此次没有mask了,直接点击页内按钮跳转至新页,而后发现新页面中对应位置元素的click事件被触发了
解决方案:
一、只用touch
最简单的解决方案,完美解决点击穿透问题
把页面内全部click所有换成touch事件( touchstart 、’touchend’、’tap’)
二、只用click
下下策,由于会带来300ms延迟,页面内任何一个自定义交互都将增长300毫秒延迟
三、tap后延迟350ms再隐藏mask
改动最小,缺点是隐藏mask变慢了,350ms仍是能感受到慢的
四、pointer-events
比较麻烦且有缺陷, 不建议使用mask隐藏后,给按钮下面元素添上 pointer-events: none; 样式,让click穿过去,350ms后去掉这个样式,恢复响应缺陷是mask消失后的的350ms内,用户能够看到按钮下面的元素点着没反应,若是用户手速很快的话必定会发现
27.Jq绑定事件的几种方式?on bind ?
jQuery中提供了四种事件监听方式,分别是bind、live、delegate、on,对应的解除监听的函数分别是unbind、die、undelegate、off
Bind( )是使用频率较高的一种,做用就是在选择到的元素上绑定特定事件类型的监听函数;
Live( )能够对后生成的元素也能够绑定相应的事件,处理机制就是把事件绑定在DOM树的根节点上,而不是直接绑定在某个元素上;
Delegate( )采用了事件委托的概念,不是直接为子元素绑定事件,而是为其父元素(或祖先元素也可)绑定事件,当在div内任意元素上点击时,事件会一层层从event target向上冒泡,直至到达你为其绑定事件的元素;
on( )方法能够绑定动态添加到页面元素的事件,on()方法绑定事件能够提高效率;
28.Jq中如何将一个jq对象转化为dom对象?
方法一:
jQuery对象是一个数据对象,能够经过[index]的方法,来获得相应的DOM对象。
如:var $v =$("#v") ; //jQuery对象
var v=$v[0]; //DOM对象
alert(v.checked) //检测这个checkbox是否被选中
方法二:
jQuery自己提供,经过.get(index)方法,获得相应的DOM对象
如:var $v=$("#v"); //jQuery对象
var v=$v.get(0); //DOM对象
alert(v.checked) //检测这个checkbox是否被选中
29.Jq中有几种选择器?分别是什么?
层叠选择器、基本过滤选择器、内容过滤选择器、可视化过滤选择器、属性过滤选择器、子元素过滤选择器、表单元素选择器、表单元素过滤选择器
30.Jq中怎么样编写插件?
//第一种是类级别的插件开发: //1.1 添加一个新的全局函数 添加一个全局函数,咱们只需以下定义: jQuery.foo = function() { alert('This is a test. This is only a test.'); }; //1.2 增长多个全局函数 添加多个全局函数,可采用以下定义: jQuery.foo = function() { alert('This is a test. This is only a test.'); }; jQuery.bar = function(param) { alert('This function takes a parameter, which is "' + param + '".'); }; 调用时和一个函数的同样的:jQuery.foo();jQuery.bar();或者$.foo();$.bar('bar'); //1.3 使用jQuery.extend(object); jQuery.extend({ foo: function() { alert('This is a test. This is only a test.'); }, bar: function(param) { alert('This function takes a parameter, which is "' + param +'".'); } }); //1.4 使用命名空间 // 虽然在jQuery命名空间中,咱们禁止使用了大量的javaScript函数名和变量名。 // 可是仍然不可避免某些函数或变量名将于其余jQuery插件冲突,所以咱们习惯将一些方法 // 封装到另外一个自定义的命名空间。 jQuery.myPlugin = { foo:function() { alert('This is a test. This is only a test.'); }, bar:function(param) { alert('This function takes a parameter, which is "' + param + '".'); } }; //采用命名空间的函数仍然是全局函数,调用时采用的方法: $.myPlugin.foo(); $.myPlugin.bar('baz'); //经过这个技巧(使用独立的插件名),咱们能够避免命名空间内函数的冲突。 //第二种是对象级别的插件开发 //形式1: (function($){ $.fn.extend({ pluginName:function(opt,callback){ // Our plugin implementation code goes here. } }) })(jQuery); //形式2: (function($) { $.fn.pluginName = function() { // Our plugin implementation code goes here. }; })(jQuery); //形参是$,函数定义完成以后,把jQuery这个实参传递进去.当即调用执行。 //这样的好处是,咱们在写jQuery插件时,也能够使用$这个别名,而不会与prototype引发冲突
31.$('div+.ab')和$('.ab+div') 哪一个效率高?
$('div+.ab')效率高
32.$.map和$.each有什么区别
map()方法主要用来遍历操做数组和对象,会返回一个新的数组。$.map()方法适用于将数组或对象每一个项目新阵列映射到一个新数组的函数;
each()主要用于遍历jquery对象,返回的是原来的数组,并不会新建立一个数组。
33.编写一个 getElementsByClassName 封装函数?
<body> <input type="submit" id = "sub" class="ss confirm btn" value="提交"/> <script> window.onload = function(){ //方法一 var Opt = document.getElementById('sub'); var getClass = function(className,tagName){ if(document.getElementsByTagName){ var Inp = document.getElementsByTagName(tagName); for(var i=0; i<Inp.length; i++){ if((new RegExp('(\\s|^)' +className +'(\\s|$)')).test(Inp[i].className)){ return Inp[i]; } } }else if(document.getElementsByClassName){ return document.getElementsByClassName(className); } } //方法二 var aa = getClass("confirm", "input"); function getClass(className, targetName){ var ele = []; var all = document.getElementsByTagName(targetName || "*"); for(var i=0; i<all.length; i++){ if(all[i].className.match(new RegExp('(\\s|^)'+confirm+'(\\s|$)'))){ ele[ele.length] = all[i]; } } return ele; } //方法三 function getObjsByClass(tagName, className){ if(document.getElementsByClassName){ alert("document.getElementsByClassName"); return document.getElementsByClassName(className); }else{ var el = []; var _el = document.getElementsByTagName(tagName