资讯专栏INFORMATION COLUMN

js&jq面试笔记(上)

SoapEye / 2185人阅读

摘要:确定离开和操作的用法实例操作符判断基本数据类型检测对象的继承关系,左操作数是对象,右操作数是构造函数可以准确判断左对象是右对象的实例页面的三种弹窗警告框确认框提示框请指出和的区别共同点这两种事件都代表的是页面文档加载时触发。

js&jq涉及内容众多,分为上下两部分进行整理,该部分为上部分。
1、对前端工程师这个职位你是怎么样理解的?

前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好;

参与项目,快速高质量完成实现效果图,精确到1px;

与团队成员,UI设计,产品经理的沟通;

做好的页面结构,页面重构和用户体验;

处理hack,兼容、写出优美的代码格式;

针对服务的优化、拥抱最新前端技术。

DOM相关 1、原生JavaScript操作DOM
Month Savings
January $100

首先通过题目给的table id 获得该对象;
tableObj.rows.length; 获得行数;
tableObj.rows[x].cells[y].innerText 可以获得x行y列的值;
遍历table

function show(){
    var    tableRowInfo ="";
    tableObj = document.getElementById("t");
    for(var i =0 ;i
2、获取页面html标签的个数
var elementArr = document.getElementsByTagName("*")
var tagNameArr = []
for(var i= 0,len=elementArr.length;i
3、DOM事件流包括哪几个阶段

事件流,从页面接收事件的顺序;IE的事件流叫做事件冒泡;Netscape的事件流叫做事件捕获;
“DOM2级事件”规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段

document.addEventListener(type, handler, false);//true事件捕获模式,false事件冒泡模式

4、html元素添加事件的方法

原生方法:

//1


//2
var btn = document.getElementById("myBtn")
btn.onclick = function(){}

//3
btn.addEventListener("click",function(){},false)//false在冒泡阶段调用事件处理程序

IE:btn.attachEventListener("click",function(){},false)
5、用js代码完成,body里面生成100个div,内容是1-100自身序号,颜色按照红、黄、蓝、绿交替变色,10行10列
// CSS 
#box { position:relative; }
#box div { width: 60px; height: 60px; position: absolute; }

// HTML 
// JavaScript

apply()/call()求数组最值

var  numbers = [5, 458 , 120 , -215 ]; 
var  maxInNumbers = Math.max.apply(this, numbers);  
console.log(maxInNumbers);  // 458
var maxInNumbers = Math.max.call(this,5, 458 , 120 , -215); 
console.log(maxInNumbers);  // 458
18、比较typeof与instanceof?

相同点:JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的。

typeof的定义和用法:返回值是一个字符串,用来说明变量的数据类型。

细节:

1.typeof 一般只能返回如下几个结果:number,boolean,string,function,object,undefined。
2.typeof 来获取一个变量是否存在,如 if(typeof a!="undefined"){alert("ok")},而不要去使用 if(a) 因为如果 a 不存在(未声明)则会出错。
3.对于 Array,Null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性。

Instanceof定义和用法:instanceof 用于判断一个变量是否属于某个对象的实例。

a instanceof b?alert("true"):alert("false"); //a是b的实例?真:假

var a = new Array(); 
alert(a instanceof Array);  // true
alert(a instanceof Object)  // true
如上,会返回 true,同时 alert(a instanceof Object) 也会返回 true;这是因为 Array 是 object 的子类。

function test(){};
var a = new test();
alert(a instanceof test)   // true

细节:

1.如下,得到的结果为‘N’,这里的 instanceof 测试的 object 是指 js 语法中的 object,不是指 dom 模型对象。
if (window instanceof Object){ alert("Y")} else {  alert("N");}  // "N"
19、如何理解闭包?

定义和用法:当一个函数的返回值是另外一个函数,而返回的那个函数如果调用了其父函数内部的其它变量,如果返回的这个函数在外部被执行,就产生了闭包。

表现形式:使函数外部能够调用函数内部定义的变量。

根据作用域链的规则,底层作用域没有声明的变量,会向上一级找,找到就返回,没找到就一直找,直到window的变量,没有就返回undefined。这里明显count 是函数内部的flag2 的那个count 。

    var count=10;   //全局作用域 标记为flag1
    function add(){
        var count=0;    //函数全局作用域 标记为flag2
        return function(){
            count+=1;   //函数的内部作用域
            alert(count);
        }
    }
    var s = add()
    s();//输出1
    s();//输出2

变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域分类:全局变量和局部变量。
特点:
1、函数内部可以读取函数外部的全局变量;在函数外部无法读取函数内的局部变量。
2、函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!

使用闭包的注意点

1、滥用闭包,会造成内存泄漏:由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2、会改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

20、什么是跨域?跨域请求资源的方法有哪些?

什么是跨域?

由于浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。存在跨域的情况:

网络协议不同,如http协议访问https协议。

端口不同,如80端口访问8080端口。

域名不同,如qianduanblog.com访问baidu.com。

子域名不同,如abc.qianduanblog.com访问def.qianduanblog.com。

域名和域名对应ip,如www.a.com访问20.205.28.90.

跨域请求资源的方法:

1、porxy代理

    定义和用法:proxy代理用于将请求发送给后台服务器,通过服务器来发送请求,然后将请求的结果传递给前端。

    实现方法:通过nginx代理;

    注意点:1、如果你代理的是https协议的请求,那么你的proxy首先需要信任该证书(尤其是自定义证书)或者忽略证书检查,否则你的请求无法成功。

2、CORS 【Cross-Origin Resource Sharing】

    定义和用法:是现代浏览器支持跨域资源请求的一种最常用的方式。

    使用方法:一般需要后端人员在处理请求数据的时候,添加允许跨域的相关操作。如下:

res.writeHead(200, {
    "Content-Type": "text/html; charset=UTF-8",
    "Access-Control-Allow-Origin":"http://localhost",
    "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
    "Access-Control-Allow-Headers": "X-Requested-With, Content-Type"
});

(3)、jsonp

定义和用法:通过动态插入一个script标签。浏览器对script的资源引用没有同源限制,同时资源加载到页面后会立即执行(没有阻塞的情况下)。

特点:通过情况下,通过动态创建script来读取他域的动态资源,获取的数据一般为json格式。

缺点:

  1、这种方式无法发送post请求(这里)

  2、另外要确定jsonp的请求是否失败并不容易,大多数框架的实现都是结合超时时间来判定。
        
21、谈谈垃圾回收机制方式及内存管理

定义和用法:垃圾回收机制(GC:Garbage Collection),执行环境负责管理代码执行过程中使用的内存。

原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行。

实例如下:

function fn1() {
    var obj = {name: "hanzichi", age: 10};
}
function fn2() {
    var obj = {name:"hanzichi", age: 10};
   return obj;
}
var a = fn1();
var b = fn2();
fn1中定义的obj为局部变量,而当调用结束后,出了fn1的环境,那么该块内存会被js引擎中的垃圾回收器自动释放;在fn2被调用的过程中,返回的对象被全局变量b所指向,所以该块内存并不会被释放。

垃圾回收策略:标记清除(较为常用)和引用计数。

标记清除:

  定义和用法:当变量进入环境时,将变量标记"进入环境",当变量离开环境时,标记为:"离开环境"。某一个时刻,垃圾回收器会过滤掉环境中的变量,以及被环境变量引用的变量,剩下的就是被视为准备回收的变量。

  到目前为止,IE、Firefox、Opera、Chrome、Safari的js实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。

引用计数:

  定义和用法:引用计数是跟踪记录每个值被引用的次数。

  基本原理:就是变量的引用次数,被引用一次则加1,当这个引用计数为0时,被视为准备回收的对象。

内存管理
1、什么时候触发垃圾回收?

垃圾回收器周期性运行,如果分配的内存非常多,那么回收工作也会很艰巨,确定垃圾回收时间间隔就变成了一个值得思考的问题。

IE6的垃圾回收是根据内存分配量运行的,当环境中的变量,对象,字符串达到一定数量时触发垃圾回收。垃圾回收器一直处于工作状态,严重影响浏览器性能。

IE7中,垃圾回收器会根据内存分配量与程序占用内存的比例进行动态调整,开始回收工作。

2、合理的GC方案:(1)、遍历所有可访问的对象; (2)、回收已不可访问的对象。

3、GC缺陷:(1)、停止响应其他操作;

4、GC优化策略:(1)、分代回收(Generation GC);(2)、增量GC

开发过程中遇到的内存泄露情况,如何解决的?
1、定义和用法:

内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。C#和Java等语言采用了自动垃圾回收方法管理内存,几乎不会发生内存泄露。我们知道,浏览器中也是采用自动垃圾回收方法管理内存,但由于浏览器垃圾回收方法有bug,会产生内存泄露。

2、内存泄露的几种情况:

1.意外的全局变量引起的内存泄露
function leak(){  
  leak="xxx";//leak成为一个全局变量,不会被回收  
}
2.闭包引起的内存泄露

3.没有清理的DOM元素引用

4.被遗忘的定时器或者回调 5)子元素存在引起的内存泄露

(1)、当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。

实例如下:
解决方法如下:
(2)、由于是函数内定义函数,并且内部函数--事件回调的引用外暴了,形成了闭包。闭包可以维持函数内局部变量,使其得不到释放。
实例如下:
function bindEvent(){
    var obj=document.createElement("XXX");
    obj.onclick=function(){
        //Even if it"s a empty function
    }
}
解决方法如下:

function bindEvent(){
    var obj=document.createElement("XXX");
    obj.onclick=function(){
         //Even if it"s a empty function
    }
    obj=null;
}
22、如何判断一个变量是对象还是数组?

判断数组和对象分别都有好几种方法,其中用Object.prototype.toString.call()兼容性最好。

23、定时器的执行顺序或机制。

因为js是单线程的,浏览器遇到setTimeout或者setInterval会先执行完当前的代码块,在此之前会把定时器推入浏览器的待执行事件队列里面,等到浏览器执行完当前代码之后会看一下事件队列里面有没有任务,有的话才执行定时器的代码。
所以即使把定时器的时间设置为0还是会先执行当前的一些代码。

24、Javascript中callee和caller的作用?

caller是返回一个对函数的引用,该函数调用了当前函数;caller返回调用者,指向当前函数的直接父函数

callee是返回正在被执行的function函数,也就是所指定的function对象的正文。callee是被执行的function对象,他是arguments的一个属性,就是指向当前函数b的父函数a

callee, caller不建议使用,因为这两个属性在严格模式(use strict)下都不存在。

25、Web Storage与Cookie相比存在的优势:
(1)、存储空间更大:IE8下每个独立的存储空间为10M,其他浏览器实现略有不同,但都比Cookie要大很多。

(2)、存储内容不会发送到服务器:当设置了Cookie后,Cookie的内容会随着请求一并发送的服务器,这对于本地存储的数据是一种带宽浪费。而Web Storage中的数据则仅仅是存在本地,不会与服务器发生任何交互。

(3)、更多丰富易用的接口:Web Storage提供了一套更为丰富的接口,如setItem,getItem,removeItem,clear等,使得数据操作更为简便。cookie需要自己封装。

(4)、独立的存储空间:每个域(包括子域)有独立的存储空间,各个存储空间是完全独立的,因此不会造成数据混乱。
26、浏览器缓存有哪些,通常缓存有哪几种
http缓存

websql

cookie

localstorage

sessionstorage

27、document.write和innerHTML的区别:
document.write是直接写入到页面的内容流,如果在写之前没有调用document.open, 浏览器会自动调用open。每次写完关闭之后重新调用该函数,会导致页面被重写。

innerHTML则是DOM页面元素的一个属性,代表该元素的html内容。你可以精确到某一个具体的元素来进行更改。如果想修改document的内容,则需要修改document.documentElement.innerElement。

innerHTML将内容写入某个DOM节点,不会导致页面全部重绘
28、xml和json的区别,请用四个词语来形容
JSON相对于XML来讲,数据的体积小,传递的速度更快些

JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互

XML对数据描述性比较好;

JSON的速度要远远快于XML    

29、new操作符到底到了什么
var Func=function(){};  

var func=new Func ();  

new共经过了4几个阶段

1、创建一个空对象
    var obj=new Object();  


2、设置原型链
    obj.__proto__= Func.prototype;  


3、让Func中的this指向obj,并执行Func的函数体。
    var result =Func.call(obj); 
    

4、判断Func的返回值类型:

    如果是值类型,返回obj。如果是引用类型,就返回这个引用类型的对象。

    if (typeof(result) == "object"){  
        func=result;  
    }else{  
        func=obj;;  
    }      

(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) ;
(3) 执行构造函数中的代码(为这个新对象添加属性) ;
(4) 返回新对象。
30、简述同步和异步的区别
同步是阻塞模式,异步是非阻塞模式。

同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;

异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。
31、sessionStorage 、localStorage 和 cookie 之间的区别
共同点:用于浏览器端存储的缓存数据

不同点:

(1)、存储内容是否发送到服务器端:当设置了Cookie后,数据会发送到服务器端,造成一定的宽带浪费;

    web storage,会将数据保存到本地,不会造成宽带浪费;

(2)、数据存储大小不同:Cookie数据不能超过4K,适用于会话标识;web storage数据存储可以达到5M;

(3)、数据存储的有效期限不同:cookie只在设置了Cookid过期时间之前一直有效,即使关闭窗口或者浏览器;

    sessionStorage,仅在关闭浏览器之前有效;localStorage,数据存储永久有效;

(4)、作用域不同:cookie和localStorage是在同源同窗口中都是共享的;sessionStorage在不同的浏览器窗口中不共享,即使是同一个页面;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96545.html

相关文章

  • js&jq面试笔记(下)

    摘要:面试笔记,该部分为下部分。构造函数模式使用自定义的构造函数与普通函数一样,只是用它来创建对象,定义对象类型如的属性和方法。使用原型来添加属性共享一个原型对象的方法原型是指向原型对象的,这个原型对象与构造函数没有太大关系,唯一的关系 js&jq面试笔记,该部分为下部分。 字符串相关 1、定义一个方法,用于将string中的每个字符之间加一个空格,并输出 如:hello -> h e l ...

    xinhaip 评论0 收藏0
  • 回顾自己三次失败的面试经历

    摘要:站在这个时间点上,我对自己之前三次失败的面试经历做了一次深度回顾。关于我第三次面试失败的经历,依然是与轮播图有关。当然,这次思特奇面试之旅,最后也是以失败告终,这也是我离进大厂最近的一次。 showImg(https://segmentfault.com/img/bVYQuP?w=528&h=513); 前言 时间的齿轮已经来到了2017年的11月份,距离2018年仅仅还剩下不到两...

    DC_er 评论0 收藏0
  • 回顾自己三次失败的面试经历

    摘要:站在这个时间点上,我对自己之前三次失败的面试经历做了一次深度回顾。关于我第三次面试失败的经历,依然是与轮播图有关。当然,这次思特奇面试之旅,最后也是以失败告终,这也是我离进大厂最近的一次。 showImg(https://segmentfault.com/img/bVYQuP?w=528&h=513); 前言 时间的齿轮已经来到了2017年的11月份,距离2018年仅仅还剩下不到两...

    spacewander 评论0 收藏0
  • Deep in JS - 收藏集 - 掘金

    摘要:今天同学去面试,做了两道面试题全部做错了,发过来给道典型的面试题前端掘金在界中,开发人员的需求量一直居高不下。 排序算法 -- JavaScript 标准参考教程(alpha) - 前端 - 掘金来自《JavaScript 标准参考教程(alpha)》,by 阮一峰 目录 冒泡排序 简介 算法实现 选择排序 简介 算法实现 ... 图例详解那道 setTimeout 与循环闭包的经典面...

    enali 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<