前端开发工程师面试JavaScript的基础模块汇总.docx
《前端开发工程师面试JavaScript的基础模块汇总.docx》由会员分享,可在线阅读,更多相关《前端开发工程师面试JavaScript的基础模块汇总.docx(12页珍藏版)》请在冰点文库上搜索。
前端开发工程师面试JavaScript的基础模块汇总
前端开发面试JavaScript的基础模块汇总
目录
前端开发面试JavaScript的基础模块汇总1
1.变量提升1
2.函数提升1
3.数据的基本类型2
4.typeof的返回值2
5.函数声明和函数表达式2
6.立即调用函数函数3
7.闭包3
8.事件顺序3
9.原型4
10.原型的使用方法4
11.原型链5
12.js的对象6
13JSON7
14.this指向问题7
15.面向对象8
16.封装8
17.跨域问题8
1.变量提升
所有的函数和变量声明都会被提升到最前面,并且变量声明永远在前面,赋值在声明过程之后。
1.var把变量声明成了undefined
2.let把变量声明成了uninitialized
2.函数提升
函数的声明方式主要由两种:
声明式和变量式。
1)声明式会自动将声明放在前面并且执行赋值过程
2)、变量式则是先将声明提升,然后到赋值处再执行赋值
带有命名的函数变量式声明,是不会提升到作用域范围内的
3.数据的基本类型
number
string
boolean
undefined//表示意料之外的不存在的值
null//表示一个空值
object
4.typeof的返回值
string
number
boolean
undefined
object
function
检测一个对象的类型,强烈推荐使用Object.prototype.toString方法
5.函数声明和函数表达式
1)、 如果functionfoo(){}被包含在一个函数体内,或者位于程序的最顶部的话,那它就是一个函数声明。
2)、如果functionfoo(){}是作为赋值表达式的一部分的话,那它就是一个函数表达式。
3)、函数声明总是会在任何表达式被解析和求值之前,最先被解析和求值。
4)、函数声明在条件语句内虽然可以用,但是没有被标准化,也就是说不同的环境可能有不同的执行结果,所以这样情况下,最好使用函数表达式。
6.立即调用函数函数
在一个表达式后面加上括号(),该表达式会立即执行。
自执行函数,顾名思义,自己执行自己的操作。
自执行其实也是一个立即执行函数。
7.闭包
用途:
1)、读取函数内部的变量
2)、使变量的值始终保持在内存中
3)、用闭包模拟私有方法
4)、在循环中创建闭包
注意点:
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,在IE中可能导致内存泄露。
解决方法是,在退出函数之前,将不使用的局部变量全部删除。
闭包会在父函数外部,改变父函数内部变量的值。
所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(PublicMethod),把内部变量当作它的私有属性(privatevalue),这时一定要小心,不要随便改变父函数内部变量的值。
8.事件顺序
1. EventCapturing(事件捕获)
2. EventBubbling(事件冒泡)
3. 进入事件捕获阶段->达到元素后->进入事件冒泡阶段。
4. 事件代理的意思就是只监听父节点的事件触发,以来代理对其后代节点的监听,而你需要做的只是通过currentTarget属性得到触发元素并作出回应
9.原型
1)、每个函数都有一个原型属性prototype指向函数自身的原型
2)、由这个函数创建的对象(实例)也有一个__proto__属性指向这个原型
3)、函数原型是一个对象,所以这个对象也会有一个__proto__指向自己的原型
4)、这样逐层深入直到Object对象的原型(null),这样就形成了原型链
5)、作用是为了数据共享,创建对象的时候,我们会把公共的方法和属性挂载到原型上,避免资源浪费。
10.原型的使用方法
1、通过给函数对象的prototype属性赋值对象字面量来设定对象的原型
2、赋值原型prototype的时候使用function立即执行的表达式来赋值
3、分别设置原型对象
11.原型链
1、原型对象也有自己的原型,直到对象的原型为null为止。
一级一级的链结构就是原型链。
2、真正形成原型链的是每个对象的__proto__属性,而不是函数的prototype属性
Object.prototype的hasOwnProperty方法能够判断一个对象是否包含自定义属性而不是原型链上的属性。
它是JavaScript中唯一一个处理属性但是不查找原型链的函数。
new运算符接受一个函数F及其参数:
newF(arguments...)。
这一过程分为三步:
1. 创建类的实例。
这步是把一个空的对象的proto属性设置为F.prototype。
2. 初始化实例。
函数F被传入参数并调用,关键字this被设定为该实例。
3. 返回实例。
12.js的对象
基本类型Number,String,Boolean,null,undefined
对象类型Function,Object,Array
可变现:
对象类型之所以为对象类型,是因为它们可以直接的添加和删除属性。
而基本类型不可以随意改变。
比较和传递
基本类型通过值来比较(即使赋值的过程实际是创建了一个拷贝,比较是各个拷贝之间的比较),而对象类型通过引用来比较。
两个对象的值是否相同取决于它们是否指向相同的底层对象(改变一个对象的值将更新另外一个对象的值)。
基本类型调用对象类型的方法:
在String中调用.length会使用String()构造函数临时将基本类型转变成对象(包裹成对象),允许你使用length方法而改变它,这个临时对象被称为包装对象。
13JSON
有非常严格的语法,在string上下文里只有{"prop":
"val"}是个合法的JSON。
他们倾向于使用string字符串,因为string在很多语言里解析的方式都差不多。
JSON对象,目前有2个静态方法:
1. JSON.parse:
用来将JSON字符串反序列化成对象
2. JSON.stringify:
用来将对象序列化成JSON字符串
14.this指向问题
15.面向对象
面向对象语言的三大特性:
1)、封装(Encapsulation):
把相关的信息(无论数据或方法)存储在对象中的能力。
2)、 继承(Inheritance):
由另一个类(或多个类)得来类的属性和方法的能力
3)、多态(Polymorphism):
编写能以多种方法运行的函数或方法的能力。
其他的一些内容:
1、类(Class):
定义了一件事物的抽象特点,用来构造对象
2、对象(Object):
类的实例化
3、属性(Property):
对象具有的数据
4、方法(Method):
也成消息,用于对象之间传递数据
原型继承与类继承的区别
16.封装
使用构造函数
functionCat(name){this.name=name;}实例化后,this的指向绑定在实例对象上
使用原型优化构造函数
每一个构造函数都有一个prototype属性,指向另一个对象。
这个对象的所有属性和方法,都会被构造函数的实例继承。
所以对于一些公共的内容,我们会选择在内存中只生产一次,可以使用prototype
验证原型方法
1、isPrototypeOf():
判断某个proptotype对象和某个实例之间的关系,eg.alert(Cat.prototype.isPrototypeOf(cat1));
2、hasOwnPrototype():
判断某一个属性到底是本地属性(构造函数内属性),还是继承自prototype对象的属性。
eg.alert(cat1.hasOwnProperty("name"));
3、in:
判断某个属性是否是对象的属性,eg.alert("name"incat1);
4、利用in遍历:
for(varpropincat1){alert("cat1["+prop+"]="+cat1[prop]);}
17.跨域问题
产生跨域的原因
1、由于前后端分离,前端的页面展示和后端的api通常都部署在不同的服务器或者域名上,ajax请求WebService的时候,就会出现同源策略的问题。
2、同源策略的定义:
如果两个页面拥有相同的协议(protocol),端口(如果指定),和主机,那么这两个页面就属于同一个源(origin)。
哪些情况会产生跨域问题
1、一个网站的网址组成包括协议名,子域名,主域名,端口号。
比如,其中https是协议名,www是子域名,github是主域名,端口号是80,当在在页面中从一个url请求数据时,如果这个url的协议名、子域名、主域名、端口号任意一个有一个不同,就会产生跨域问题。
2、即使是在http:
//localhost:
80/页面请求http:
//127.0.0.1:
80/也会有跨域问题。
解决跨域问题
1、使用jsonp
2、服务端代理
3、服务端设置RequestHeader头中Access-Control-Allow-Origin为指定可获取数据的域名
JSONP
1、原理:
浏览器的script标签是不受同源策略限制(你可以在你的网页中设置script的src属性问cdn服务器中静态文件的路径)。
2、那么就可以使用script标签从服务器获取数据,请求时添加一个参数为callbakc=?
,?
号是你要执行的回调方法。
服务端做什么判断呢,当参数中带有callback属性时,返回的type要为application/javascript,把数据作为callback的参数执行。
下面是jsonp返回的数据的格式示例。
例如:
前端请求
后台返回:
如果没有后面的callback参数,即不使用JSONP的模式,该服务的返回结果可能是一个单纯的json字符串,比如:
{foo:
'bar'}。
但是如果使用JSONP模式,那么返回的是一个函数调用:
mycallback({foo:
'bar'}),这样我们在代码之中,定义一个名为mycallback的回调函数,就可以解决跨域问题了。
服务端设置Access-Control-Allow-Origin
这种方式只要服务端把response的header头中设置Access-Control-Allow-Origin为制定可请求当前域名下数据的域名即可。
一般情况下设为即可。
这样客户端就不需要使用jsonp来获取数据。