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