前端300道常见面试题,前端找工作必备_前端面试题,分享一点面试小经验

172 阅读22分钟

总结

前端资料汇总

  • 框架原理真的深入某一部分具体的代码和实现方式时,要多注意到细节,不要只能写出一个框架。

  • 算法方面很薄弱的,最好多刷一刷,不然影响你的工资和成功率😯

  • 在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。

  • 要勇于说不,对于某些 offer 待遇不满意、业务不喜欢,应该相信自己,不要因为当下没有更好的 offer 而投降,一份工作短则一年长则 N 年,为了幸福生活要慎重选择!!! 喜欢这篇文章文章的小伙伴们点赞+转发支持,你们的支持是我最大的动力!

开源分享:docs.qq.com/doc/DSmRnRG… 空字符串、false、undefined、null、0

36、看下列代码,将会输出什么?(变量声明提升)

var foo = 1; function(){
console.log(foo); var foo = 2; console.log(foo);
}
答案:输出 undefined 和 2。上面代码相当于:

var foo = 1; function(){
var foo;
console.log(foo); //undefined foo = 2;
console.log(foo); // 2;
}
函数声明与变量声明会被 JavaScript 引擎隐式地提升到当前作用域的顶部,但是只提升名称不会提升赋值部分。

37、用 js 实现随机选取 10–100 之间的 10 个数字,存入一个数组,并排序。

var iArray = [];
funtion getRandom(istart, iend){
var iChoice = istart - iend +1;
return Math.floor(Math.random() * iChoice + istart;
}
Math.random()就是获取 0-1 之间的随机数(永远获取不到 1) for(var i=0; i<10; i++){
var result= getRandom(10,100);
iArray.push(result);
}
iArray.sort();

38、把两个数组合并,并删除第二个元素。

var array1 = [‘a’,‘b’,‘c’];

var bArray = [‘d’,‘e’,‘f’];
var cArray = array1.concat(bArray); cArray.splice(1,1);

39、怎样添加、移除、移动、复制、创建和查找节点(原生 JS,实在基础,没细写每一步)

1)创建新节点

createDocumentFragment() //创建一个 DOM 片段createElement() //创建一个具体的元素createTextNode() //创建一个文本节点
2)添加、移除、替换、插入appendChild() //添加
removeChild() //移除

replaceChild() //替换

insertBefore() //插入3)查找
getElementsByTagName() //通过标签名称getElementsByName() //通过元素的 Name 属性的值getElementById() //通过元素 Id,唯一性
40、有这样一个 URL:item.taobao.com/item.htm?a=…
请写一段 JS 程序提取 URL 中的各个 GET 参数(参数名和参数个数不确定),将其按 key-value 形式返回到一个 json 结构中,如{a:’1′, b:’2′, c:”, d:’ xxx’, e:undefined} 。

答案:

function serilizeUrl(url) {

var result = {};
url = url.split(“?”)[1]; var map = url.split(“&”);
for(var i = 0, len = map.length; i < len; i++) {
result

41、正则表达式构造函数 var reg=new RegExp(“xxx”)与正则表达字面量 var reg=//有什么不同?匹配邮箱的正则表达式?

答案:当使用 RegExp()构造函数的时候,不仅需要转义引号(即\”表示”),并且还需要双反斜杠(即\表示一个\)。使用正则表达字面量的效率更高。
邮箱的正则匹配:
var regMail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;
24.看下面代码,给出输出结果。for(var i=1;i<=3;i++){
setTimeout(function(){
console.log(i);
},0);
};
答案:4 4 4。

原因:Javascript 事件处理器在线程空闲之前不会运行。追问,如何让上述代码输出 1 2 3? for(var i=1;i<=3;i++){
setTimeout((function(a){ //改成立即执行函数console.log(a);
})(i),0);
};
1 //输出
2
3

42、写一个 function,清除字符串前后的空格。(兼容所有浏览器)

使用自带接口 trim(),考虑兼容性:

if (!String.prototype.trim) { String.prototype.trim = function() {
return this.replace(/^\s+/, “”).replace(/\s+$/,“”);
//\s 匹配空白字符:回车、换行、制表符 tab 空格
}
}
// test the function
var str = " \t\n test string ".trim(); alert(str == “test string”); // alerts “true”

43、Javascript 中 callee 和 caller 的作用?

arguments.callee:获得当前函数的引用

caller 是返回一个对函数的引用,该函数调用了当前函数;

callee 是返回正在被执行的 function 函数,也就是所指定的 function 对象的正文。

那么问题来了?如果一对兔子每月生一对兔子;一对新生兔,从第二个月起就开始生兔子; 假定每对兔子都是一雌一雄,试问一对兔子,第 n 个月能繁殖成多少对兔子?(使用 callee 完成)
var result=[];
function fn(n){ //典型的斐波那契数列if(n1){
return 1;
}else if(n2){

-2);

}

}else{

}

return 1; if(result[n]){
}else{

}

return result[n];

//argument.callee() 表 示 fn() result[n]=arguments.callee(n-1)+arguments.callee(n

return result[n];

44、Javascript 中, 以下哪条语句一定会产生运行错误? 答案( BC )

A、 var _变量=NaN;B、var 0bj = [];C、var obj = //; D、var obj = {};

//正确答案:BC

45、以下两个变量 a 和 b,a+b 的哪个结果是 NaN? 答案( C )

A、var a=undefind; b=NaN //拼写B、var a=‘123’; b=NaN//字符串C、var a =undefined , b =NaN
D、var a=NaN , b=‘undefined’//”Nan”

46、var a=10; b=20; c=4; ++b+c+a++ 以下哪个结果是正确的?答案( B )

A、 34 B、35 C、36 D、37

47、下面的 JavaScript 语句中,( D )实现检索当前页面中的表单元素中的所有文本框,并将它们全部清空

A.for(vari=0;i< form1.elements.length;i++) { if(form1.elements.type==”text”) form1.elements.value=”“;}
B.for(vari=0;i<document.forms.length;i++) { if(forms[0].elements.type==”text”) forms[0].elements.value=””;
}
C.if(document.form.elements.type==”text”) form.elements.value=”“;
D.for(vari=0;i<document.forms.length; i++){ for(var j=0;j<document.forms.elements.length; j++){ if(document.forms.elements[j].type==”text”) document.forms.elements[j].value=””;
}
}

48、要将页面的状态栏中显示“已经选中该文本框”,下列 JavaScript 语句正确的是( A )
A.window.status=”已经选中该文本框”
B.document.status=”已经选中该文本框”
C.window.screen=”已经选中该文本框”
D.document.screen=”已经选中该文本框”

49、以下哪条语句会产生运行错误:(A)正确答案:A、D A.var obj = ();
B.var obj = [];
C.var obj = {};
D.var obj = //;

50、以下哪个单词不属于 javascript 保留字:(B) A.with
B.parent C.class D.void

51、请选择结果为真的表达式:(C) A.null instanceof Object
B.null === undefined
C.null == undefined
D.NaN == NaN

52、Javascript 中, 如果已知 HTML 页面中的某标签对象的 id=”username”, 用_ _document.getElementById(‘username’) _ _方法获得该标签对象。

53 、typeof 运算符返回值中有一个跟 javascript 数据类型不一致, 它是
_ ”function”_ 。

typeof Number typeof Object

54、定义了一个变量,但没有为该变量赋值,如果 alert 该变量,javascript 弹出的对话框中显示_ undefined_ 。

55、分析代码,得出正确的结果。

var a=10, b=20 , c=30;

++a;

a++; e=++a+(++b)+(c++)+a++;
alert(e);

弹出提示对话框:77

56、写出函数 DateDemo 的返回结果,系统时间假定为今天

function DateDemo(){

var d, s=“今天日期是:”; d = new Date();
s += d.getMonth() + “/”; s += d.getDate() + “/”; s += d.getFullYear(); return s;}
结果:今天日期是:7/17/2010

57、写出程序运行的结果?

for(i=0, j=0; i<10, j<6; i++, j++){ k = i + j;}
结果:10

58、阅读以下代码,请分析出结果:
reverse 方法颠倒数组中元素的位置,并返回该数组的引用。

59、补充按钮事件的函数,确认用户是否退出当前页面,确认之后关闭窗口;

}

60、写出简单描述 html 标签(不带属性的开始标签和结束标签)的正则表达式, 并将以下字符串中的 html 标签去除掉

var str = “

这里是 div 里面的段落

”;

//

<scripttype=”text/javascript”> var reg = /</?\w+/?>/gi;//

var str = “

这里是 div 里面的段落

”; alert(str.replace(reg,”"));

61、完成 foo()函数的内容,要求能够弹出对话框提示当前选中的是第几个单选框。

}
}
}

62、完成函数showImg(),要求能够动态根据下拉列表的选项变 化,更新图片的显示

城市生活 都市早报 青山绿水 63、截取字符串 abcdefg 的 efg

alert(‘abcdefg’.substring(4));

64、列举浏览器对象模型 BOM 里常用的至少 4 个对象,并列举 window 对象的常用方法至少 5 个

对象:Window document location screen history navigator 方法:Alert() confirm() prompt() open() close()
65、简述列举文档对象模型 DOM 里 document 的常用的查找访问节点的方法并做
简单说明

Document.getElementById 根据元素 id 查找元素Document.getElementByName 根据元素 name 查找元素Document.getElementTagName 根据指定的元素名查找元素
66、希望获取到页面中所有的 checkbox 怎么做?(不使用第三方框架)

67、JavaScript 的数据类型都有什么?

基本数据类型:String,Boolean,Number,Undefined,Null 引用数据类型:Object(Array,Date,RegExp,Function)
68、javascript 中有哪几种数据类型,分别写出中文和英文。

string boolean number null undefined object

字符串 布尔 数值 空值 未定义 对象

69、javascript 中和=的区别是什么?举例说明。

===会自动进行类型转换,==不会

70、简述创建函数的几种方式

第一种(函数声明):
function sum1(num1,num2){ return num1+num2;
}
第二种(函数表达式):
var sum2 = function(num1,num2){ return num1+num2;
}
匿名函数:
function(){}:只能自己执行自己

第三种(函数对象方式):
var sum3 = new Function(“num1”,“num2”,“return num1+num2”);

71、Javascript 如何实现继承?

原型链继承,借用构造函数继承,组合继承,寄生式继承,寄生组合继承

72、Javascript 创建对象的几种方式?

工厂方式,构造函数方式,原型模式,混合构造函数原型模式,动态原型方式

73、把 Script 标签 放在页面的最底部的 body 封闭之前 和封闭之后有什么区别?浏览器会如何解析它们?

如果说放在 body 的封闭之前,将会阻塞其他资源的加载如果放在 body 封闭之后,不会影响 body 内元素的加载

74、iframe 的优缺点?

优点:
1.解决加载缓慢的第三方内容如图标和广告等的加载问题
2.Security sandbox
3.并行加载脚本缺点:
1.iframe 会阻塞主页面的 Onload 事件

2.即时内容为空,加载也需要时间
3.没有语意

75、请你谈谈 Cookie 的弊端?

缺点:
1.Cookie数量和长度的限制。每个 domain 最多只能有 20 条 cookie,每个 cookie 长度不能超过 4KB,否则会被截掉。
2.安全性问题。如果 cookie 被人拦截了,那人就可以取得所有的 session 信息。即使加密也与事无补,因为拦截者并不需要知道 cookie 的意义,他只要原样转发 cookie 就可以达到目的了。
3.有些状态不可能保存在客户端。例如,为了防止重复提交表单,我们需要在服务器端保存 一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。

76、DOM 操作——怎样添加、移除、移动、复制、创建和查找节点。

1.创建新节点
createDocumentFragment() // 创建一个 DOM 片段createElement() // 创建一个具体的元素createTextNode() // 创建一个文本节点
2.添加、移除、替换、插入
appendChild() removeChild() replaceChild()
insertBefore() // 在已有的子节点前插入一个新的子节点
3.查找
getElementsByTagName() // 通过标签名称
getElementsByName() // 通过元素的 Name 属性的值(IE 容错能力较强,会得到一个数组, 其中包括 id 等于 name 值的)
getElementById() // 通过元素 Id,唯一性

77、js 延迟加载的方式有哪些?

1.defer 和 async
2.动态创建 DOM 方式(创建 script,插入到 DOM 中,加载完毕后 callBack)
3.按需异步载入 js

78、documen.write 和 innerHTML 的区别?

document.write 只能重绘整个页面innerHTML 可以重绘页面的一部分

79、哪些操作会造成内存泄漏?

内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。
垃圾回收器定期扫描对象,并计算引用了每个对象的其他对象的数量。如果一个对象的引用 数量为 0(没有其他对象引用过该对象),或对该对象的惟一引用是循环的,那么该对象的内存即可回收。
1.setTimeout 的第一个参数使用字符串而非函数的话,会引发内存泄漏。
2.闭包
3.控制台日志
4.循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)

80、javascript 的 typeof 返回哪些数据类型?

答:object、 number、 function 、boolean、 underfind

81、split() join() 的区别

答:前者是切割成数组的形式,后者是将数组转换成字符串

82、数组方法 pop() push() unshift() shift()各表示什么意思?

答:Push()尾部添加、pop()尾部删除、Unshift()头部添加、shift()头部删除

83、判断一个字符串中出现次数最多的字符,统计这个次数

答:var str = ‘asdfssaaasasasasaa’; var json = {};
for (var i = 0; i < str.length; i++) {
if(!json[str.charAt(i)]){
json[str.charAt(i)] = 1;

}else{

}
};

json[str.charAt(i)]++;

var iMax = 0; var iIndex = ‘’;
for(var i in json){
if(json[i]>iMax){
iMax = json[i];

iIndex = i;
}
}
alert(‘出现次数最多的是:’+iIndex+‘出现’+iMax+‘次’);

84、javascript 的 typeof 返回哪些数据类型

Object number function boolean underfind

85、例举 3 种强制类型转换和 2 种隐式类型转换?

强制(parseInt,parseFloat,number) 隐式(== – ===)

86、split() join() 的区别

前者是切割成数组的形式,后者是将数组转换成字符串

87、数组方法 pop() push() unshift() shift()

Push()尾部添加 shift() 尾部删除Unshift() 头部添加 shift() 头部删除

89、IE 和 DOM 事件流的区别

1.执行顺序不一样、
2.参数不一样
3.事件加不加 on 4.this 指向问题

90、IE 和标准下有哪些兼容性的写法

Var ev = ev || window.event
document.documentElement.clientWidth || document.body.clientWidth Var target = ev.srcElement||ev.target

91、call 和 apply 的区别

Object.call(this,obj1,obj2,obj3) Object.apply(this,arguments)

93、写一个获取非行间样式的函数

function getStyle(obj,attr,value)
{
if(!value)
{
if(obj.currentStyle)//ie
{
return obj.currentStyle(attr);
}
else{//标准浏览器obj.getComputedStyle(attr,false);
}
}
else
{
obj.style[attr] = value;
}
}

95、闭包是什么,有什么特性,对页面有什么影响

闭包就是能够读取其他函数内部变量的函数。blog.csdn.net/gaoshanwudi… 此链接可查看(问这个问题的不是一个公司)

96、解释 jsonp 的原理,以及为什么不是真正的 ajax

动态创建 script 标签,回调函数Ajax 是页面无刷新请求数据操作

97、javascript 的本地对象,内置对象和宿主对象

本地对象为 array obj regexp 等可以 new 实例化内置对象为 gload Math 等不可以实例化的
宿主为浏览器自带的 document,window 等

98、document load 和 document ready 的区别

Document.onload 是在结构和样式加载完才执行 js
Document.ready 原生种没有这个方法,jquery 中有 $().ready(function)

99、字符串反转,如将 ‘12345678’ 变成 ‘87654321’

//大牛做法;
//思路:先将字符串转换为数组 split(),利用数组的反序函数 reverse()颠倒数组,再利用 jion() 为字符串
var str = ‘12345678’;
str = str.split(‘’).reverse().join(‘’);

100、将数字 12345678 转化成 RMB 形式 如: 12,345,678

//个人方法;
//思路:先将数字转为字符, str= str + ‘’ ;
//利用反转函数,每三位字符加一个 ','最后一位不加; re()是自定义的反转函数,最后再反转回去! for(var i = 1; i <= re(str).length; i++){
tmp += re(str)[i - 1];
if(i % 3 == 0 && i != re(str).length){ tmp += ‘,’;
}
}

101、生成 5 个不同的随机数;

//思路:5 个不同的数,每生成一次就和前面的所有数字相比较,如果有相同的,则放弃当前生成的数字var num1 = [];
for(var i = 0; i < 5; i++){
num1[i] = Math.floor(Math.random()*10) + 1; //范围是 [1, 10] for(var j = 0; j < i; j++){
if(num1[i] == num1[j]){
i–;
}
}
}

102、去掉数组中重复的数字 方法一;

//思路:每遍历一次就和之前的所有做比较,不相等则放入新的数组中!
// 这 里 用 的 原 型 个 人 做 法 ; Array.prototype.unique = function(){
var len = this.length,
newArr = [],

flag = 1;
for(var i = 0; i < len; i++, flag = 1){ for(var j = 0; j < i; j++){
if(this[i] == this[j]){
flag = 0; //找到相同的数字后,不执行添加数
}
}
flag ? newArr.push(this[i]) : ‘’;
}
return newArr;
}

方法二:

(function(arr){
var len = arr.length,
newArr = [], flag;
for(var i = 0; i < len; i+=1, flag = 1){ for(var j = 0; j < i; j++){
if(arr[i] == arr[j]){
flag = 0;
}
}
flag?newArr.push(arr[i]):‘’;
}
alert(newArr);
})([1, 1, 22, 3, 4, 55, 66]);

103、阶乘函数;98765…*1

//原型方法
Number.prototype.N = function(){ var re = 1;
for(var i = 1; i <= this; i++){ re *= i;
}
return re;
}

var num = 5; alert(num.N());

104、window.location.search 返回的是什么?

答:查询(参数)部分。除了给动态语言赋值以外,我们同样可以给静态页面, 并使用 javascript 来获得相信应的参数值
返回值:?ver=1.0&id=timlq 也就是问号后面的!

105、window.location.hash 返回的是什么?

答: 锚点 , 返回值:#love ;
//url:www.sina.com/getage?#age
这时就返回”#age”

106、window.location.reload() 作用?

答:刷新当前页面。

107、阻止冒泡函数

function stopPropagation(e) {
e = e || window.event; if(e.stopPropagation) { //W3C 阻止冒泡方法
e.stopPropagation();
} else {
e.cancelBubble = true; //IE 阻止冒泡方法
}
}
document.getElementById(‘need_hide’).onclick = function(e) { stopPropagation(e);
}

108、什么是闭包? 写一个简单的闭包?;

答: 我的理解是,闭包就是能够读取其他函数内部变量的函数。在本质上, 闭包就是将函数内部和函数外部连接起来的一座桥梁。
function outer(){
var num = 1; function inner(){
var n = 2; alert(n + num);
}
return inner;
}
outer()();

109、javascript 中的垃圾回收机制?

答: 在 Javascript 中,如果一个对象不再被引用,那么这个对象就会被 GC 回收。如果两个对象互相引用,而不再 被第 3 者所引用,那么这两个互相引用的对象也会被回收。因为函数 a 被 b 引用,b 又被 a 外的 c 引用,这就是为什么 函数a 执行后不会被回收的原因。

110、看题做答:

function f1(){
var tmp = 1; this.x = 3;
console.log(tmp); //A console.log(this.x); //B
}

var obj = new f1(); //1
console.log(obj.x) //2
console.log(f1()); //3
分析:
这道题让我重新认识了对象和函数,首先看代码(1),这里实例话
化了 f1 这个类。相当于执行了 f1 函数。所以这个时候 A 会输出 1, 而 B 这个时候的 this 代表的是 实例化的当前对象 obj B 输出 3.。 代码(2)毋庸置疑会输出 3, 重点 代码(3)首先这里将不再是一个类,它只是一个函数。那么 A 输出1, B 呢?这里的 this 代表的其实就是 window 对象,那么 this.x 就是一个全局变量 相当于在外部 的一个全局变量。所以 B 输出 3。最后代码由于 f 没有返回值那

么一个函数如果没返回值的话,将会返回 underfined ,所以答案就是 : 1, 3, 3, 1, 3, underfined 。

111、下面输出多少?

var o1 = new Object();
var o2 = o1;
o2.name = “CSSer”;
console.log(o1.name);
如果不看答案,你回答真确了的话,那么说明你对 javascript 的数据类型了解的还是比较清楚了。js 中有两种数据类型,分别是:基本数据类型和引用数据类型
(object Array)。对于保存基本类型值的变量,变量是按值访问的, 因为我们操作的是变量实际保存的值。对于保存引用类型值的变量,变量是按引用访问的,我们操作的 是变量值所引用( 指向)的对象。答案就清楚了: //CSSer;

112、再来一个

function changeObjectProperty (o) { o.siteUrl = “www.csser.com/”; o = new Object();
o.siteUrl = “www.popcg.com/”;
}
var CSSer = new Object(); changeObjectProperty(CSSer); console.log(CSSer.siteUrl); //
如果 CSSer 参数是按引用传递的, 那么结果应该是"www.popcg.com/“,但实际结果却仍是"… 样的:在函数内部修改了引用类型值的参数,该参数值的原始引用保持不变。我们可 以把参数想象成局部变量,当参数被重写时,这个变量引用的就是一个局部变量,局 部变量的生存期仅限于函数执行的过程中,函数执行完毕,局部变量即被销毁以释放 内存。
(补充:内部环境可以通过作用域链访问所有的外部环境中的变量对象,但 外部环境无法访问内部环境。每个环境都可以向上搜索作用域链,以查询变量和函数 名,反之向下则不能。)

113、输出多少?

var a = 6;

setTimeout(function () {
var a = 666;//由于变量 a 是一个局部变量alert(a); // 输出 666,
}, 1000);
a = 66;
因为 var a = 666;定义了局部变量 a,并且赋值为 666,根据变量作用域链, 全局变量处在作用域末端,优先访问了局部变量, 从而覆盖了全局变量 。

var a = 6; setTimeout(function () {
//变量声明提前
alert(a); // 输 出 undefined var a = 666;
}, 1000);
a = 66;

因为 var a = 666;定义了局部变量 a,同样覆盖了全局变量,但是在 alert(a);之前a 并未赋值,所以输出 undefined。

记住: 异步处理,一切 OK 声明提前

114、输出多少?

function setN(obj){
obj.name=‘屌丝’;
obj = new Object();

obj.name = ‘腐女’;
};
var per = new Object(); setN(per);
alert(per.name); //屌丝 内部

115、JS 的继承性

window.color = ‘red’;
var o = {color: ‘blue’}; function sayColor(){
alert(this.color);
}
考点:1、this 的指向
2、call 的用法sayColor(); //red
sayColor.call(this); //red this 指向的是 window 对象sayColor.call(window); //red
sayColor.call(o); //blue

116、精度问题: JS 精度不能精确到 0.1 所以 。。。。同时存在于值和差值中
var n = 0.3,m = 0.2, i = 0.2, j = 0.1;
alert((n - m) == (i - j)); //false alert((n-m) == 0.1); //false
alert((i-j)==0.1); //true

117、加减运算

alert(‘5’+3); //53 string alert(‘5’+‘3’); //53 string alert(‘5’-3); //2 number alert(‘5’-‘3’); //2 number

118、什么是同源策略?

指: 同协议、端口、域名的安全策略,由网景(Netscape)公司提出来的安全协议!

119、call 和 apply 的区别是什么?

参数形式不同,call(obj, pra, pra)后面是单个参数。apply(obj, [args]) 后面是数组。

120、为什么不能定义 1px 左右的 div 容器?

121、结果是什么?

function foo(){
foo.a = function(){alert(1)}; this.a = function(){alert(2)}; a = function(){alert(3)};
var a = function(){alert(4)};
};
foo.prototype.a = function(){alert(5)}; foo.a = function(){alert(6)};
foo.a(); //6
var obj = new foo(); obj.a(); //2
foo.a(); //1

122、输出结果

var a = 5; function test(){
a = 0;
alert(a);
alert(this.a); //没有定义 a 这个属性var a;
alert(a)

}
test(); // 0, 5, 0
new test(); // 0, undefined, 0 //由于类它自身没有属性 a, 所以是 undefined

123、计算字符串字节数:

new function(s){
if(!arguments.length||!s) return null;
if(“”==s) return 0; //无效代码,因为上一句!s 已经判断过var l=0;
for(var i=0;i<s.length;i++){
if(s.charCodeAt(i)>255) l+=2; else l+=1; //charCodeAt()得到的是 unCod

} //汉字的 unCode 码大于 255bit 就是两个字节alert(l);
}(“hello world!”);

124、结果是:

var bool = !!2; alert(bool);//true;

技巧:双向非操作可以把字符串和数字转换为布尔值。

125、声明对象,添加属性,输出属性

var obj = {
name: ‘leipeng’, showName: function(){
alert(this.name);
}
}
obj.showName();

126、匹配输入的字符:第一个必须是字母或下划线开头,后面就是字母和数字或者下划线构成,长度 5-20

var reg = /1[a-zA-Z0-9_]{4,19}/,

name1 = ‘leipeng’,
name2 = ‘0leipeng’,
name3 = ‘你好 leipeng’,
name4 = ‘hi’;

alert(reg.test(name1)); alert(reg.test(name2)); alert(reg.test(name3)); alert(reg.test(name4));

127、检测变量类型

function checkStr(str){
typeof str == ‘string’? alert(‘true’):alert(‘false’);
}
checkStr(‘leipeng’);

128、如何在 HTML 中添加事件,几种方法?

1、标签之中直接添加 οnclick=“fun()”; 2、JS 添加 Eobj.onclick = method;
3、现代事件 IE9 以前: obj.attachEvent(‘onclick’, method);

标准浏览器: obj.addEventListener(‘click’, method, false);

129、BOM 对象有哪些,列举 window 对象?

1、window 对象 ,是 JS 的最顶层对象,其他的 BOM 对象都是 window 对象的
属性;

2、document 对象,文档对象;

3、location 对象,浏览器当前 URL 信息; 4、navigator 对象,浏览器本身信息;
5、screen 对象,客户端屏幕信息;

6、history 对象,浏览器访问历史信息;

130、请问代码实现 outerHTML
//说明:outerHTML 其实就是 innerHTML 再加上本身; Object.prototype.outerHTML = function(){
var innerCon = this.innerHTML, //获得里面的内容
outerCon = this.appendChild(innerCon); //添加到里面alert(outerCon);

}

演示代码:

Document

hello

131、JS 中的简单继承 call 方法!

//顶一个父母类,注意:类名都是首字母大写的哦! function Parent(name, money){
this.name = name; this.money = money; this.info = function(){
alert('姓名: ‘+this.name+’ 钱 : '+ this.money);
}
}

//定义孩子类
function Children(name){
Parent.call(this, name); //继承 姓名属性,不要钱。this.info = function(){
alert('姓名: '+this.name);
}
}
//实例化类
var per = new Parent(‘parent’, 800000000000); var chi = new Children(‘child’);
per.info();
chi.info();

132、bind(), live(), delegate()的区别

bind: 绑定事件,对新添加的事件不起作用,方法用于将一个处理程序附加到每个匹配元素的事件上并返回 jQuery 对象。
live: 方法将一个事件处理程序附加到与当前选择器匹配的所有元素( 包含现有的或将来添加的) 的指定事件上并返回 jQuery 对象。
delegate: 方法基于一组特定的根元素将处理程序附加到匹配选择器的所有元素(现有的或将来的)的一个或多个事件上。

最佳实现:on() off()

133、typeof 的返回类型有哪些?

alert(typeof [1, 2]); //object alert(typeof ‘leipeng’); //string var i = true;
alert(typeof i); //boolean
alert(typeof 1); //number
var a;
alert(typeof a); //undefined
function a(){;}; alert(typeof a) //function

134、简述 link 和 import 的区别?

区别 1:link 是 XHTML 标签,除了加载 CSS 外,还可以定义 RSS 等其他事务;@import 属于 CSS 范畴,只能加载 CSS。
区别 2:link 引用 CSS 时,在页面载入时同时加载;@import 需要页面网页完全载入以后加载。
区别 3:link 是 XHTML 标签,无兼容问题;@import 是在 CSS2.1 提出的,低版本的浏览器不支持。
区别 4:link 支持使用 Javascript 控制 DOM 去改变样式;而@import 不支持。

135、window.onload 和 document.ready 的区别?

load 要等到图片和包含的文件都加在进来之后执行;

ready 是不包含图片和非文字文件的文档结构准备好就执行;

136、 解析 URL 成一个对象?

String.prototype.urlQueryString = function(){ var url = this.split(‘?’)[1].split(‘&’),
len = url.length;

this.url = {};
for(var i = 0; i < len; i += 1){ var cell = url[i].split(‘=’),
key = cell[0], val = cell[1];
this.url[‘’+key+‘’] = val;
}
return this.url;
}
var url = ‘?name=12&age=23’; console.log(url.urlQueryString().age);

137、看下列代码输出什么?

var foo = “11”+2-“1”; console.log(foo); console.log(typeof foo);
执行完后 foo 的值为 111,foo 的类型为 Number。

138、看下列代码,输出什么?

var a = new Object(); a.value = 1;
b = a; b.value = 2;
alert(a.value);
执行完后输出结果为 2

139、已知数组 var stringArray = ["This”, "is”, "Baidu”, "Campus”], Alert 出”This is Baidu Campus”。

答案:alert(stringArray.join(" "))

140、已知有字符串 foo=“get-element-by-id”,写一个 function 将其转化成驼峰表示法"getElementById"。

答 案 :function combo(msg){ var arr = msg.split(“-”);
var len = arr.length; //将 arr.length 存储在一个局部变量可以提高 for 循环效

for(var i=1;i<len;i++){ arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
}
msg=arr.join(“”); return msg;
}

141、怎样添加、移除、移动、复制、创建和查找节点

1)创建新节点
createDocumentFragment() //创建一个 DOM 片段createElement() //创建一个具体的元素createTextNode() //创建一个文本节点
2)添加、移除、替换、插入appendChild() //添加removeChild() //移除replaceChild() //替换insertBefore() //插入

3)查找
getElementsByTagName() //通过标签名称getElementsByName() //通过元素的 Name 属性的值getElementById() //通过元素 Id,唯一性

142、原生 JS 的 window.onload 与 Jquery 的$(document).ready(function(){}) 有什么不同?

window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行。
$(document).ready()是 DOM 结构绘制完毕后就执行,不必等到加载完毕。

143、你如何优化自己的代码?

代码重用
避免全局变量(命名空间,封闭空间,模块化 mvc…) 拆分函数避免函数过于臃肿:单一职责原则
适当的注释,尤其是一些复杂的业务逻辑或者是计算逻辑,都应该写出这个业务逻辑 的具体过程
内存管理,尤其是闭包中的变量释放

144、请描述出下列代码运行的结果

function d(){
console.log(this);
}
d();//window

145、需要将变量 e 的值修改为“a+b+c+d”,请写出对应的代码

var e=”abcd”;
设计一段代码能够遍历下列整个 DOM 节点

146、怎样实现两栏等高?

147、使用 js 实现这样的效果:在文本域里输入文字时,当按下 enter 键时不换行,而是替换成“{{enter}}”,(只需要考虑在行尾按下 enter 键的情况).

textarea.οnkeydοwn=function(e){
e.preventDefault();//为了阻止 enter 键的默认换行效果
if(e.keycode==”enter 键 码 ”){ testarea.value+=”{{enter}}”;
}
}

148、以下代码中 end 字符串什么时候输出

var t=true; setTimeout(function(){
console.log(123); t=false;
},1000);
while(t){}// 此时是一个死循环,永远不可能执行 setTimeout 中的回调函数console.log(‘end’);

149 、 specify(‘hello,world’)//=>’h,e,l,l,o,w,o,r,l,d’ 实现 specify 函数

150、请将一个 URL 的 search 部分参数与值转换成一个 json 对象

151、请用原生 js 实现 jquery 的 get\post 功能,以及跨域情况下

152、请简要描述 web 前端性能需要考虑哪方面,你的优化思路是什么?
//参见雅虎 14web 优化规则
//减少 http 请求:
//1、小图弄成大图,2、合理的设置缓存
//3、资源合并、压缩
//将外部的 js 文件置底

153、简述readyonly 与 disabled 的区别

readonly 只针对 input(text / password)和 textarea 有效,
而 disabled 对于所有的表单元素都有效,当表单元素在使用了 disabled 后,当我们将表单以POST 或 GET 的方式提交的话,这个元素的值不会被传递出去,而 readonly 会将该值传递出去

154、判断一个字符串出现次数最多的字符,统计这个次数并输出

155、编写一个方法,去掉一个数组的复重元素

156、写出 3 个使用 this 的典型应用

构造函数中使用 this,原型中使用 this,对象字面量使用 this

157、请尽可能详尽的解释 ajax 的工作原理

思路:先解释异步,再解释 ajax 如何使用
Ajax 的原理简单来说通过 XmlHttpRequest 对象来向服务器发异步请求,从服务器获得数据, 然后用javascript 来操作DOM 而更新页面。这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对XMLHttpRequest 有所了解。
XMLHttpRequest 是 ajax 的核心机制,它是在 IE5 中首先引入的,是一种支持异步请求的技术。简单的说,也就是 javascript 可以及时向服务器提出请求和处理响应,而不阻塞用户。达到无刷新的效果。

158、为什么扩展 javascript 内置对象不是好的做法?

因为扩展内置对象会影响整个程序中所使用到的该内置对象的原型属性

159、请解释一下 javascript 的同源策略

域名、协议、端口相同

160、什么是三元表达式?“三元”表示什么意思?

? :
因为运算符会涉及 3 个表达式

161、浏览器标准模式和怪异模式之间的区别是什么?

标准模式是指,浏览器按 W3C 标准解析执行代码;
怪异模式则是使用浏览器自己的方式解析执行代码,因为不同浏览器解析执行的方式不一 样,所以我们称之为怪异模式。

浏览器解析时到底使用标准模式还是怪异模式,与你网页中的 DTD 声明直接相关,DTD 声明定义了标准文档的类型(标准模式解析)文档类型,会使浏览器使用相应的方式加载网页 并显示,忽略 DTD 声明,将使网页进入怪异模式

162、如果设计中使用了非标准的字体,你该如何去实现?

先通过 font-face 定义字体,再引用

163、用 css 分别实现某个 div 元素上下居中和左右居中

margin:0 auto;

164、module(12,5)//2 实现满足这个结果的 modulo 函数

165、HTTP 协议中,GET 和 POST 有什么区别?分别适用什么场景 ?
get 传送的数据长度有限制,post 没有
get 通过 url 传递,在浏览器地址栏可见,post 是在报文中传递

适用场景:
post 一般用于表单提交
get 一般用于简单的数据查询,严格要求不是那么高的场景

166、HTTP 状态消息 200 302 304 403 404 500 分别表示什么

200:请求已成功,请求所希望的响应头或数据体将随此响应返回。
302:请求的资源临时从不同的 URI 响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在 Cache-Control 或Expires 中进行了指定的情况下, 这个响应才是可缓存的
304:如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。
403:服务器已经理解请求,但是拒绝执行它。
404:请求失败,请求所希望得到的资源未被在服务器上发现。
500:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这 个问题都会在服务器端的源代码出现错误时出现。

167 、 HTTP 协 议 中 , header 信 息 里 面 , 怎 么 控 制 页 面 失 效 时 间
(last-modified,cache-control,Expires 分别代表什么)

Last-Modified 文 档的最后改动时间。客户可以通过 If-Modified-Since 请求头提供一个日期,该请求将被视为一个条件 GET,只有改动时间迟于指定时间的文档 才会返回,否则返回一个 304(Not Modified)状态。Last-Modified 也可用 setDateHeader 方法来设置。
Expires 应该在什么时候认为文档已经过期,从而不再缓存它?

168、HTTP 协议目前常用的有哪几个?KEEPALIVE 从哪个版本开始出现的?

http1.0

http1.1 keeplive

169、业界常用的优化 WEB 页面加载速度的方法(可以分别从页面元素展现,请求连接,css,js,服务器等方面介绍)

170、列举常用的 web 页面开发,调试以及优化工具

sublime vscode webstorm hbuilder dw

httpwatch=>ie ff:firebug

chrome:

171、解释什么是 sql 注入,xss 漏洞172、如何判断一个 js 变量是数组类型
ES5:Array.isArray()
[] instanceof Array Object.prototype.toString.call([]);//“[object Array]”

173、请列举 js 数组类型中的常用方法

方法 描述
concat() 连接两个或更多的数组,并返回结果。
join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。
pop() 删除并返回数组的最后一个元素
push() 向数组的末尾添加一个或更多元素,并返回新的长度。
reverse() 颠倒数组中元素的顺序。
shift() 删除并返回数组的第一个元素
slice() 从某个已有的数组返回选定的元素
sort() 对数组的元素进行排序
splice() 删除元素,并向数组添加新元素。
toSource() 返回该对象的源代码。
toString() 把数组转换为字符串,并返回结果。
toLocaleString() 把数组转换为本地数组,并返回结果。
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。
valueOf() 返回数组对象的原始值

174、FF 与 IE 中如何阻止事件冒泡,如何获取事件对象,以及如何获取触发事件的元素

175、列举常用的 js 框架以及分别适用的领域

jquery:简化了 js 的一些操作,并且提供了一些非常好用的 API

jquery ui、jquery-easyui:在 jqeury 的基础上提供了一些常用的组件 日期,下拉框,表格这些组件
require.js、sea.js(阿里的玉帛)+》模块化开发使用的
zepto:精简版的 jquery,常用于手机 web 前端开发 提供了一些手机页面实用功能,touch ext.js:跟 jquery 差不多,但是不开源,也没有 jquery 轻量
angular、knockoutjs、avalon(去哪儿前端总监):MV*框架,适合用于单页应用开发(SPA)

176、js 中如何实现一个 map

数组的 map 方法:

概述

map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。

语法

array.map(callback[, thisArg])

参数

callback
原数组中的元素经过该方法后返回一个新的元素。

currentValue
callback 的第一个参数,数组中当前被传递的元素。
index
callback 的第二个参数,数组中当前被传递的元素的索引。
array
callback 的第三个参数,调用 map 方法的数组。
thisArg
执行 callback 函数时 this 指向的对象。
实现:

177、js 可否实现面向对象编程,如果可以如何实现 js 对象的继承

创建对象的几种方式实现继承的几种方式原型链

178、约瑟夫环—已知 n 个人(以编号 1,2,3…分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出列;他的下一个人又从 1 开始报数,数到 m 的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

179、有 1 到 10w 这个 10w 个数,去除 2 个并打乱次序,如何找出那两个数?

180、如何获取对象 a 拥有的所有属性(可枚举的、不可枚举的, 不包括继承来的属性)
Object.keys——IE9+
或者使用 for…in 并过滤出继承的属性
for(o in obj){ if(obj.hasOwnproperty(o)){
//把 o 这个属性放入到一个数组中
}
}

181、有下面这样一段 HTML 结构,使用css 实现这样的效果:

左边容器无论宽度如何变动,右边容器都能自适应填满父容器剩余的宽度。

182、下面这段代码想要循环昝输出结果 01234,请问输出结果是否正确,如果不正确,请说明为什么,并修改循环内的代码使其输出正确结果

for(var i=0;i<5;++i){ setTimeout(function(){
console.log(i+’’);
},100*i);
}

183、解释下这个 css 选择器什么发生什么?

[role=nav]>ul a:not([href^-mailto]){}

184、JavaScript 以下哪条语句会产生运行错误

A. var obj = (); B. var obj = []; C. var obj = {}; D. var obj = //; 答案:AD
185、以下哪些是 javascript 的全局函数:(ABCDE)

A.escape 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decodeURIComponent() 替代它。

B.parseFloat parseFloat() 函数可解析一个字符串,并返回一个浮点数。

该函数指定字符串中的首个字符是否是数字。如果是,则对字符串进行解析,直到到达数字 的末端为止,然后以数字返回该数字,而不是作为字符串。

C.eval 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

D.setTimeout

E.alert

186、关于 IE 的 window 对象表述正确的有:(CD)

A.window.opener 属性本身就是指向 window 对象
window.opener 返回打开当前窗口的那个窗口的引用.
如果当前窗口是由另一个窗口打开的, window.opener 保留了那个窗口的引用. 如果当前窗口不是由其他窗口打开的, 则该属性返回 null.

B.window.reload()方法可以用来刷新当前页面 //正确答案:应该是 location.reload 或者 window.location.reload

C.window.location=”a.html”和 window.location.href=”a.html”的作用都是把当前页面替换成 a.html 页面

D.定义了全局变量 g;可以用 window.g 的方式来存取该变量

187、描述错误的是 D

A:Http 状态码 302 表示暂时性转移 对B:domContentLoaded 事件早于 onload 事件 //正确
当 onload 事件触发时,页面上所有的 DOM,样式表,脚本,图片,flash 都已经加载完成了。
当 DOMContentLoaded 事件触发时,仅当 DOM 加载完成,不包括样式表, 图片,flash。

C: IE678 不支持事件捕获

D:localStorage 存储的数据在电脑重启后丢失 //错误,因为没有时间限制try…catch 语句。(在 IE5+、Mozilla 1.0、和 Netscape 6 中可用)
188、关于 link 和@import 的区别正确的是 A

A: link 属于 XHTML 标签,而@import 是 CSS 提供的;

B:页面被加载时,link 会同时被加载,而后者引用的 CSS 会等到页面被加载完再加载C:import 只在 IE5 以上才能识别 而 link 是 XHTML 标签,无兼容问题
D: link 方式的样式的权重高于@import 的权重

189、下面正确的是 A

A: 跨域问题能通过 JsonP 方案解决

B:不同子域名间仅能通过修改 window.name 解决跨域 //还可以通过 script 标签 src jsonp

C:只有在 IE 中可通过 iframe 嵌套跨域 //任何浏览器都可以使用 iframe D:MediaQuery 属性是进行视频格式检测的属性是做响应式的
188、错误的是:AC

A: Ajax 本质是 XMLHttpRequest //异步请求 json 和 xml 数据

B: 块元素实际占用的宽度与它的 width、border、padding 属性有关,与 background 无关C: position 属性 absolute、fixed、—relative—会使文档脱标
D: float 属性 left 也会使 div 脱标

189、不用任何插件,如何实现一个 tab 栏切换?

通过改变不同层的 css 设置层的显示和隐藏

190、基本数据类型的专业术语以及单词拼写

191、变量的命名规范以及命名推荐

192、三种弹窗的单词以及三种弹窗的功能

alert confirm prompt

193、console.log( 8 | 1 ); 输出值是多少?

答案:9

194、只允许使用 + - * / 和 Math.* ,求一个函数 y = f(x, a, b);当 x > 100 时返回 a 的值,否则返回 b 的值,不能使用 if else 等条件语句,也不能使用|,?:,数组。

答案:

function f(x, a, b) {

var temp = Math.ceil(Math.min(Math.max(x - 100, 0), 1)); return a * temp + b * (1 - temp);
}

console.log(f(-10, 1, 2));

195、JavaScript alert(0.4*0.2);结果是多少?和你预期的一样吗?如果不一样该如何处理?

有误差,应该比准确结果偏大。 一般我会将小数变为整数来处理。当前之前遇到这个问题时也上网查询发现有人用 try catch return 写了一个函数,

当然原理也是一致先转为整数再计算。看起来挺麻烦的,我没用过。

196、一个 div,有几种方式得到这个 div 的 jQuery 对象?

想直接获取这个 div 的 dom 对象,如何获取?dom 对象如何转化为 jQuery 对象? var domView=document.getElementById(“nodesView”) document.getElementsByClassName(“aabbcc”); document.querySelector(“.aabbcc#nodesView”);

转换为 jquery 对象:$( domView)

197、主流浏览器内核

IE trident 火 狐 gecko 谷歌苹果 webkit Opera:Presto
198、如何显示/隐藏一个 dom 元素?请用原生的 JavaScript 方法实现

dom.style.display=”none”;

dom.style.display=””;

199、JavaScript 有哪几种数据类型

Number String Boolean Null Undefined Object

200、jQuery 框架中$.ajax()的常用参数有哪些?

"text": 返回纯文本字符串

error

写一个post 请求并带有发送数据和返回数据的样例

201、JavaScript 数组元素添加、删除、排序等方法有哪些?

Array.concat( ) 连接数组

Array.join( ) 将数组元素连接起来以构建一个字符串
Array.length 数组的大小
Array.pop( ) 删除并返回数组的最后一个元素
Array.push( ) 给数组添加元素Array.reverse( ) 颠倒数组中元素的顺序Array.shift( ) 将元素移出数组Array.slice( ) 返回数组的一部分Array.sort( ) 对数组元素进行排序
Array.splice( ) 插入、删除或替换数组的元素Array.toLocaleString( ) 把数组转换成局部字符串Array.toString( ) 将数组转换成一个字符串Array.unshift( ) 在数组头部插入一个元素

202、如何添加 html 元素的事件,有几种方法?请列举

a、直接在标签里添加:

这是一个层 b、在元素上通过 js 添加:
c、使用事件注册函数添加 203、JavaScript 的循环语句有哪些?

while for do while for…in

204、作用域-编译期执行期以及全局局部作用域问题

理解 js 执行主要的两个阶段:预解析和执行期

205、闭包:下面这个 ul,如何点击每一列的时候 alert 其 index?

  • 这是第一条
  • 这是第二条
  • 这是第三条
  • //非闭包实现

var lis=document.querySelectorAll(‘li’); document.querySelector(‘#test’).οnclick=functi on(e){
for (var i = 0; i < lis.length; i++) { var li = lis[i];
if(li==e.target){ alert(i);
}
}
};

//闭包实现
var lis=document.querySelectorAll(‘li’); for (var i = 0; i < lis.length; i++) {
var li = lis[i]; li.οnclick=(function(index){
return function(e){ alert(index);
};
})(i);
}

206、列出 3 条以上 ff 和 IE 的脚本兼容问题

1、在 IE 下可通过 document.frames[“id”];得到该 IFRAME 对象,
而在火狐下则是通过 document.getElementById(“content_panel_if”).contentWindow; 2、IE 的写法: _tbody=_table.childNodes[0]
在 FF 中,firefox 会在子节点中包含空白则第一个子节点为空白"“, 而 ie 不会返回空白可以通过 if(”" != node.nodeName)过滤掉空白子对象
3、模拟点击事件if(document.all){ //ie 下
document.getElementById(“a3”).click();
}
else{ //非 IE
var evt = document.createEvent(“MouseEvents”); evt.initEvent(“click”, true, true); document.getElementById(“a3”).dispatchEvent(evt);
}
4、事件注册
if (isIE){window.attachEvent(“onload”, init);}else{window.addEventListener(“load”, init, false);}

207、列举可以哪些方面对前端开发进行优化

代码压缩、合并减少 http 请求,图片制作精灵图、代码优化

208、至少列出一种 JavaScript 继承的实现方式

209、如现在有一个效果,有显示用户头像、用户昵称、用户其他信息;当用户鼠标移到头像上时,会弹出用户的所有信息;如果是你,你会如何实现这个功能,请用代码实现?
//答案见:J:\代码,PPT,笔记,电子书\面试题\面试题 02.html

210、call 与 apply 有什么作用?又有什么什么区别?用 callee 属性实现函数递归?

apply 的参数是数组,call 的参数是单个的值,除此之外,两者没有差别,重点理解 this 的改变,callee 已经不推荐使用

211、用正则表达式,写出由字母开头,其余由数字、字母、下划线组成的 6~30 的字符串?
var reg=/2[\da-zA-Z_]{5,29}/;

212、列举浏览器对象模型 BOM 里常用的至少 4 个对象,并列举 window 对象的常用方法至少 5 个 (10 分)

对象:window document location screen history navigator

方法:alert() confirm() prompt() open() close() setInterval() setTimeout() clearInterval() clearTimeout()

(详细参见:J:\代码,PPT,笔记,电子书\面试题\window 对象方法.png)

213、Javascript 中 callee 和 caller 的作用? caller 是返回一个对函数的引用,该函数调用了当前函数; 用法:fn.caller
callee 是返回正在被执行的 function 函数,也就是所指定的 function 对象的正文。用法:arguments.callee
214、对于 apply 和 call 两者在作用上是相同的,即是调用一个对象的一个方
法,以另一个对象替换当前对象。将一个函数的对象上下文从初始的上下文改 变为由 thisObj 指定的新对象。

但两者在参数上有区别的。对于第一个参数意义都一样,但对第二个参数:?apply 传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而 call 则作为 call 的参数传入(从第二个参数开始)。?如 func.call(func1,var1,var2,var3)对应的 apply 写法为: func.apply(func1,[var1,var2,var3]) 。

215、在 Javascript 中什么是伪数组?如何将伪数组转化为标准数组?

伪数组(类数组):无法直接调用数组方法或期望 length 属性有什么特殊的行为,但仍可以对真正数组遍历方法来遍历它们。典型的是函数的 argument 参数,还有像调用

getElementsByTagName,document.childNodes 之类的,它们都返回 NodeList 对象都属于伪数组。

可以使用 Array.prototype.slice.call(fakeArray)将数组转化为真正的 Array 对象。

216、写一个函数可以计算 sum(5,0,-5);输出 0; sum(1,2,3,4);输出 10;

Js 基本功

217、事件代理怎么实现?

在元素的父节点注册事件,通过事件冒泡,在父节点捕获事件

218、《正则》写出正确的正则表达式匹配固话号,区号 3-4 位, 第一位为 0,中横线,7-8 位数字,中横线,3-4 位分机号格式的固话号
常用正则表达式语法要熟悉
/0[0-9]{2,3}-\d{7,8}/

219、《算法》 一下 A,B 可任选一题作答,两题全答加分

A:农场买了一只羊,第一年是小羊,第二年底生一只,第三年不生,第四年底再生一只,第 五年死掉。

B: 写 出 代 码 对 下 列 数 组 去 重 并 从 大 到 小 排 列

{5,2,3,6,8,6,5,4,7,1,9}

先去重再排序

去重方法参考:J:\代码,PPT,笔记,电子书\面试题

220、请写出一张图片的 HTML 代码,已知道图片地址为“images/abc.jpg”,宽100px,高 50px

221、请写一个正则表达式:要求最短 6 位数,最长 20 位,阿拉伯数和英文字母(不区分大小写)组成

^(?=.\d)(?=.[a-z])(?=.*[A-Z])[a-zA-Z\d]{6,20}$

222、统计 1 到 400 亿之间的自然数中含有多少个 1?比如 1-21 中,有 1、10、11、12、13、14、15、16、17、18、19、20、21 这么多自然数有 13 个 1
答案参考:J:\代码,PPT,笔记,电子书\面试题\面试题_222.html

223、删除与某个字符相邻且相同的字符,比如 fdaffdaaklfjklja 字符串处理之后成为“fdafdaklfjklja”

答案参考:J:\代码,PPT,笔记,电子书\面试题\面试题_223.html

224、请写出三种以上的 Firefox 有但 InternetExplorer 没有的属性和函数

1、在 IE 下可通过 document.frames[“id”];得到该 IFRAME 对象,
而在火狐下则是通过 document.getElementById(“content_panel_if”).contentWindow; 2、IE 的写法: _tbody=_table.childNodes[0]

在 FF 中,firefox 会在子节点中包含空白则第一个子节点为空白"“, 而 ie 不会返回空白可以通过 if(”" != node.nodeName)过滤掉空白子对象
3、模拟点击事件if(document.all){ //ie 下
document.getElementById(“a3”).click();
}
else{ //非 IE
var evt = document.createEvent(“MouseEvents”); evt.initEvent(“click”, true, true); document.getElementById(“a3”).dispatchEvent(evt);
}
4、事件注册
if (isIE){window.attachEvent(“onload”, init);}else{window.addEventListener(“load”, init, false);}

225、请写出一个程序,在页面加载完成后动态创建一个 form 表单,并在里面添加一个 input 对象并给它任意赋值后义 post 方式提交到:http://127.0.0.1/save.php
答案参考:J:\代码,PPT,笔记,电子书\面试题\面试题_225.html

226、用 JavaScript 实现冒泡排序。数据为 23、45、18、37、92、13、24

面试经常遇到的排序,查找算法要熟悉

227、解释一下什么叫闭包,并实现一段闭包代码

简单理解就是函数的嵌套形成闭包,闭包包括函数本身及其外部作用域

228、简述一下什么叫事件委托以及其原理

在元素的父节点注册事件,通过事件冒泡,在父节点捕获事件

229、前端代码优化的方法

var User = { 对象count = 1,属性
getCount:function(){ 方法return this.count;
}

}

console.log(User.getCount()); var func = User.getCount; console.log(func());
1 undefined(window);

230、下列JavaScript 代码执行后,依次 alert 的结果是

(function test(){

var a=b=5; alert(typeof a); alert(typeof b);
})();

alert(typeof a); alert(typeof b);
//number number undefined number

231、下列JavaScript 代码执行后,iNum 的值是

var iNum = 0;

for(var i = 1; i< 10; i++){ if(i % 5 == 0){
continue;

}

iNum++;

}

分析:

i=1 1

i=2 2

i=3 3
i=4 4
i=5
i=6 6
i=7 7
i=8 8
i=9 9

232、输出结果是多少?

1) var a; var b = a * 0; if (b == b) {
console.log(b * 2 + “2” - 0 + 4);

} else {

console.log(!b * 2 + “2” - 0 + 4);

}

答案:26

扩展:关于乘法操作符:J:\代码,PPT,笔记,电子书\面试题\乘性操作符.png 2)

答案:6 3)var t = 10; function test(t){
var t = t++;//此时的 t 是一个局部变量,全局变量没有任何变化console.log(t);//此时的结果又是多少?
}test(t); console.log(t); 答案:10
4)var t = 10; function test(test){
var t = test++;

}test(t); console.log(t); 答案:10
6)var t = 10; function test(test){
t = test++;

}test(t); console.log(t); 答案:10
7)var t = 10; function test(test){
t = t + test;//undefined+10=NaN console.log(t);
var t = 3;

}test(t); console.log(t); 答 案 :NaN 10 8)var a;
var b = a / 0;

if (b == b) {//b=NaN

console.log(!b * 2 + “2” - 0 + 4);

} else {

console.log(!b * 2 + “2” - 0 + 4);

}

答 案 :26 9)

答案:Infinity24

233、用程序实现找到 html 中 id 名相同的元素?

id 名重复的元素

234、下列JavaScript 代码执行后,运行的结果是

点击我

var btn = document.getElementById(‘btn’); var handler = {
id: ‘_eventHandler’, exec: function(){
alert(this.id);

}

}

btn.addEventListener(‘click’, handler.exec);

答案:btn,因为 handler.exec 是由 btn 这个按钮执行的

235、☆☆☆下列 JavaScript 代码执行后,依次 alert 的结果是

var obj = {proto: {a:1,b:2}}; function F(){};
F.prototype = obj.proto; var f = new F(); obj.proto.c = 3;

obj.proto = {a:-1, b:-2}; alert(f.a);//1 alert(f.c);//3
delete F.prototype[‘a’]; alert(f.a);//undefined alert(obj.proto.a);//-1

236、下列JavaScript 代码执行后的效果是

  • item
  • item
  • item
  • item
  • item
  • var items = document.querySelectorAll(‘#list>li’); for(var i = 0;i < items.length; i++){
    setTimeout(function(){ items[i].style.backgroundColor = ‘#fee’;
    }, 5);

}

答案:异常

237、下列 JavaScript 代码执行后的 li 元素的数量是

  • Item
      • Item
  • Item
  • var items = document.getElementsByTagName(‘li’); for(var i = 0; i< items.length; i++){
    if(items[i].innerHTML == ‘’){ items[i].parentNode.removeChild(items[i]);
    }

}

答案:4 个

238、程序中捕获异常的方法? window.error try{}catch(){}finally{}
239、将字符串”{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲{name}”中的{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲替换 成 10,{name}替换成 Tony (使用正则表达式)

答 案 :”{KaTeX parse error: Expected 'EOF', got '}' at position 3: id}̲{id}_{name}”.replace(/{id}/g,’ 10′).replace(/{$name}/g,‘Tony’);

240、给 String 对象添加一个方法,传入一个 string 类型的参数,然后将 string 的每个字符间价格空格返回,例如:

addSpace(“hello world”) // -> ‘h e l l o ?w o r l d’

String.prototype.spacify = function(){

return this.split(‘’).join(’ ');

};

241、写出函数 DateDemo 的返回结果,系统时间假定为今天

function DateDemo(){

var d, s=“今天日期是:”; d = new Date();
s += d.getMonth() + “/”; s += d.getDate() + “/”; s += d.getFullYear();

return s;

}

结果:今天日期是:7/17/2010

242、输出今天的日期,以 YYYY-MM-DD 的方式,比如今天是 2014 年 9 月 26 日,
则输出 2014-09-26

var d = new Date();

// 获取年,getFullYear()返回 4 位的数字var year = d.getFullYear();
// 获取月,月份比较特殊,0 是 1 月,11 是 12 月var month = d.getMonth() + 1;
// 变成两位

month = month < 10 ? ‘0’ + month : month;

// 获取日

var day = d.getDate();

day = day < 10 ? ‘0’ + day : day; alert(year + ‘-’ + month + ‘-’ + day);
243、已知数组 var?stringArray?=?[“This”,?“is”,?“Baidu”,?“Campus”], Alert 出”This?is?Baidu?Campus”。

答案:alert(stringArray.join(“”))

244、已知有字符串 foo=”get-element-by-id”,写一个 function 将其转化成驼峰表示法”getElementById”。

function combo(msg){ var arr=msg.split(“-”);
for(var i=1;i<arr.length;i++){ arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);
}

msg=arr.join(“”); return msg;
}

245、.var numberArray=[3,6,2,4,1,5]; (考察基础 API)

1)实现对该数组的倒排,输出[5,1,4,2,6,3]

2)实现对该数组的降序排列,输出[6,5,4,3,2,1] function combo(msg){
var arr=msg.split(“-”); for(var i=1;i<arr.length;i++){
arr[i]=arr[i].charAt(0).toUpperCase()+arr[i].substr(1,arr[i].length-1);

}

msg=arr.join(“”); return msg;
}

246、把两个数组合并,并删除第二个元素。

var array1 = [‘a’,‘b’,‘c’];

var bArray = [‘d’,‘e’,‘f’]; var cArray = array1
答 案 : array1=array1.concat(bArray) array1.splice(1,1)
247、如何消除一个数组里面重复的元素?

var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4];

function deRepeat(){ var newArr=[];
var obj={}; var index=0;
var l=arr.length; for(var i=0;i<l;i++){
if(obj[arr[i]]==undefined)

{

obj[arr[i]]=1; newArr[index++]=arr[i];
}

else if(obj[arr[i]]==1)

}

return newArr;

}

var newArr2=deRepeat(arr); alert(newArr2); //输出 1,2,3,4,5,6,9,25
248、用 js 实现随机选取 10–100 之间的 10 个数字,存入一个数组,并排序。

var iArray = [];

funtion getRandom(istart, iend){ var iChoice = istart - iend +1;
return Math.floor(Math.random() * iChoice + istart;

}

for(var i=0; i<10; i++){ iArray.push(getRandom(10,100));
}

iArray.sort();

249、正则表达式构造函数 var reg=new RegExp(“xxx”)与正则表达字面量 var reg=//有什么不同?匹配邮箱的正则表达式?

答案:当使用 RegExp()构造函数的时候,不仅需要转义引号(即\”表示”),并且还需要双反斜杠(即\表示一个\)。使用正则表达字面量的效率更高。?
250、1 var regMail =
/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/;

正则表达式对象 3 – 清除空格

写一个 function,清除字符串前后的空格。(兼容所有浏览器)

使用自带接口 trim(),考虑兼容性: if (!String.prototype.trim) {
String.prototype.trim = function() {

return this.replace(/^\s+/, “”).replace(/\s+$/,“”);

} }

// test the function

var str = " \t\n test string ".trim(); alert(str == “test string”); // alerts “true”
251、数组和字符串

输出结果: 答案:lashou 拉手 lashou 1,2,3 1,2,3,4 1,2,3,4

252、下列控制台都输出什么

第 1 题:
function setName(){ name=“张三”;
}
setName(); console.log(name); 答案:“张三”

253、第 2 题:

//考点:1、变量声明提升 2、变量搜索机制var a=1;
function test(){ console.log(a); var a=1;
}
test();
答案:undefined

254、第 3 题:

var b=2; function test2(){
window.b=3; console.log(b);
}
test2(); 答案:3

255、第 4 题:

c=5;//声明一个全局变量 c function test3(){
window.c=3;
console.log©; //答案:undefined,原因:由于此时的 c 是一个局部变量 c, 并且没有被赋值
var c;
console.log(window.c);//答案:3,原因:这里的 c 就是一个全局变量 c

}
test3();

256、第 5 题:

var arr = []; arr[0] = ‘a’;
arr[1] = ‘b’;
arr[10] = ‘c’; alert(arr.length); //答案:11
console.log(arr[5]); //答案:undefined
257、第 6 题: var a=1;
console.log(a++); //答案:1
console.log(++a); //答案:3

258、第 7 题:

console.log(null==undefined); //答案:true
console.log(“1”==1); //答案:true,因为会将数字 1 先转换为字符串 1 console.log(“1”===1); //答案:false,因为数据类型不一致

259、第 8 题:

typeof 1; “number” typeof “hello”; “string” typeof /[0-9]/; “object” typeof {}; “object” typeof null; “object” typeof undefined; “undefined” typeof [1,2,3]; “object”
typeof function(){}; //“function”

260、第 9 题:

parseInt(3.14); //3 parseFloat(“3asdf”); //3 parseInt(“1.23abc456”); parseInt(true);//“true” NaN

261、第 10 题:

//考点:函数声明提前function bar() {
return foo; foo = 10;
function foo() {}
//var foo = 11;
}
alert(typeof bar());//“function”

262、第 11 题:考点:函数声明提前

var foo = 1; function bar() {
foo = 10; return;
function foo() {}
}
bar(); alert(foo);//答案:1

263、第 12 题:

console.log(a);//是一个函数var a = 3;
function a(){} console.log(a);3

264、第 13 题:

//考点:对 arguments 的操作function foo(a) {
arguments[0] = 2;
alert(a);//答案:2,因为:a、arguments 是对实参的访问,b、通过 arguments[i] 可以修改指定实参的值
}
foo(1);

265、第 14 题:

function foo(a) {
alert(arguments.length);//答案:3,因为 arguments 是对实参的访问
}
foo(1, 2, 3);
266、第 15 题bar();//报错
var foo = function bar(name) { console.log(“hello”+name); console.log(bar);
};
//alert(typeof bar); foo(“world”);//“hello” console.log(bar);//undefined console.log(foo.toString()); bar();//报错

267、第 16 题

function test(){ console.log(“test 函数”);
}
setTimeout(function(){ console.log(“定时器回调函数”);
}, 0)
test(); function foo(){
var name=“hello”;
}

三、Jquery

1、jQuery 的 slideUp 动画 ,如果目标元素是被外部事件驱动, 当鼠标快速地连续触发外部元素事件, 动画会滞后的反复执行, 该如何处理呢?
先 stop(true,true)后 slideUp()
示例代码参考:J:\代码,PPT,笔记,电子书\面试题\面试题_jquery_slideup.html 关于 stop()参考:J:\代码,PPT,笔记,电子书\面试题\面试题_jquery.png

四、HTML5 CSS3

1、CSS3 有哪些新特性?

1.CSS3 实现圆角(border-radius),阴影(box-shadow),
2.对文字加特效(text-shadow、),线性渐变(gradient),旋转(transform) 3.transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);// 旋转,缩放,定位,倾斜
4.增加了更多的 CSS 选择器 多背景 rgba
5.在 CSS3 中唯一引入的伪元素是 ::selection.
6.媒体查询,多栏布局
7.border-image

2、html5 有哪些新特性、移除了那些元素?如何处理 HTML5 新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

新特性:
1.拖拽释放(Drag and drop) API
2.语义化更好的内容标签(header,nav,footer,aside,article,section)
3.音频、视频 API(audio,video)
4.画布(Canvas) API
5.地理(Geolocation) API
6.本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;
7.sessionStorage 的数据在浏览器关闭后自动删除
8.表单控件,calendar、date、time、email、url、search
9.新的技术 webworker, websocket, Geolocation

移除的元素:
1.纯表现的元素:basefont,big,center,font, s,strike,tt,u;
2.对可用性产生负面影响的元素:frame,frameset,noframes; 支持 HTML5 新标签:

1. IE8/IE7/IE6 支持通过 document.createElement 方法产生的标签,可以利用这一特性  
 让这些浏览器支持 HTML5 新标签,浏览器支持新标签后,还需要添加标签默认的样式(当然最好的方式是直接使用成熟的框架、使用最多的是 html5shim 框架): 

如何区分: DOCTYPE 声明新增的结构元素、功能元素

3、本地存储(Local Storage )和 cookies(储存在用户本地终端上的数据) 之间的区别是什么?

Cookies:服务器和客户端都可以访问;大小只有 4KB 左右;有有效期,过期后将会删除; 本地存储:只有本地浏览器端可访问数据,服务器不能访问本地存储直到故意通过 POST 或者 GET 的通道发送到服务器;每个域 5MB;没有过期数据,它将保留知道用户从浏览器清除或者使用 Javascript 代码移除

4、如何实现浏览器内多个标签页之间的通信?

调用 localstorge、cookies 等本地存储方式

5、你如何对网站的文件和资源进行优化?

文件合并
文件最小化/文件压缩使用 CDN 托管
缓存的使用

6、什么是响应式设计?

它是关于网页制作的过程中让不同的设备有不同的尺寸和不同的功能。响应式设计是让所有 的人能在这些设备上让网站运行正常

7、新的 HTML5 文档类型和字符集是?

答:HTML5 文档类型:
HTML5 使用的编码

8、HTML5 Canvas 元素有什么用?

9、HTML5 存储类型有什么区别?

答:Media API、Text Track API、Application Cache API、User Interaction、Data Transfer API、Command API、Constraint Validation API、History API

10、用 H5+CSS3 解决下导航栏最后一项掉下来的问题

11、CSS3 新增伪类有那些?

p:first-of-type 选择属于其父元素的首个

元素的每个

元素。p:last-of-type 选择属于其父元素的最后

元素的每个

元素。p:only-of-type 选择属于其父元素唯一的

元素的每个

元素。p:only-child 选择属于其父元素的唯一子元素的每个

元素。p:nth-child(2) 选择属于其父元素的第二个子元素的每个

元素。
:enabled、:disabled 控制表单控件的禁用状态。

:checked,单选框或复选框被选中。

12、请用 CSS 实现:一个矩形内容,有投影,有圆角,hover 状态慢慢变透明。

css 属性的熟练程度和实践经验

13、描述下 CSS3 里实现元素动画的方法

动画相关属性的熟悉程度

14、html5\CSS3 有哪些新特性、移除了那些元素?如何处理 HTML5 新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,地理定位等功能的增加。

+ 绘画 canvas 元素  
 用于媒介回放的 videoaudio 元素  
 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;sessionStorage 的数据在浏览器关闭后自动删除  

语意化更好的内容元素,比如 article、footer、header、nav、section 表单控件,calendar、date、time、email、url、search
CSS3 实现圆角,阴影,对文字加特效,增加了更多的 CSS 选择器 多背景 rgba 新的技术 webworker, websockt, Geolocation
移除的元素
纯表现的元素:basefont,big,center,font, s,strike,tt,u; 对可用性产生负面影响的元素:frame,frameset,noframes;
*是 IE8/IE7/IE6 支持通过 document.createElement 方法产生的标签, 可以利用这一特性让这些浏览器支持 HTML5 新标签,
浏览器支持新标签后,还需要添加标签默认的样式:
*当然最好的方式是直接使用成熟的框架、使用最多的是 html5shim 框架

15、你怎么来实现页面设计图,你认为前端应该如何高质量完成工作? 一个满屏 品 字布局 如何设计?

*首先划分成头部、body、脚部;。。。。。
*实现效果图是最基本的工作,精确到 2px; 与设计师,产品经理的沟通和项目的参与做好的页面结构,页面重构和用户体验
处理 hack,兼容、写出优美的代码格式针对服务器的优化、拥抱 HTML5。

16、你能描述一下渐进增强和优雅降级之间的不同吗?

渐进增强 progressive enhancement:针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。
优雅降级 graceful degradation:一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。
区别:优雅降级是从复杂的现状开始,并试图减少用户体验的供给,而渐进增强则是从 一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要。降级(功 能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带。
“优雅降级”观点

“优雅降级”观点认为应该针对那些最高级、最完善的浏览器来设计网站。而将那些被 认为“过时”或有功能缺失的浏览器下的测试工作安排在开发周期的最后阶段,并把测试对 象限定为主流浏览器(如 IE、Mozilla 等)的前一个版本。
在这种设计范例下,旧版的浏览器被认为仅能提供“简陋却无
妨 (poor, but passable)” 的浏览体验。你可以做一些小的调整来适应某个特定的浏览器。但由于它们并非我们所关注的焦点,因此除了修复较大的错误之外,其它的差异将被 直接忽略。
“渐进增强”观点

“渐进增强”观点则认为应关注于内容本身。

内容是我们建立网站的诱因。有的网站展示它,有的则收集它,有的寻求,有的操作, 还有的网站甚至会包含以上的种种,但相同点是它们全都涉及到内容。这使得“渐进增强” 成为一种更为合理的设计范例。这也是它立即被 Yahoo! 所采纳并用以构建其“分级式浏览器支持 (Graded Browser Support)”策略的原因所在。

那么问题了。现在产品经理看到 IE6,7,8 网页效果相对高版本现代浏览器少了很多圆角,阴影(CSS3),要求兼容(使用图片背景,放弃 CSS3),你会如何说服他?

17、为什么利用多个域名来存储网站资源会更有效?

CDN 缓存更方便
突破浏览器并发限制节约 cookie 带宽
节约主域名的连接数,优化页面响应速度防止不必要的安全问题

18、请谈一下你对网页标准和标准制定机构重要性的理解。

(无标准答案)网页标准和标准制定机构都是为了能让 web 发展的更‘健康’,开发者遵循统一的标准,降低开发难度,开发成本,SEO 也会更好做,也不会因为滥用代码导致各种 BUG、安全问题,最终提高网站易用性。

19、请描述一下 cookies,sessionStorage 和 localStorage 的区别?

sessionStorage 用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此 sessionStorage 不是一种

持久化的本地存储,仅仅是会话级别的存储。而 localStorage 用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
web storage 和 cookie 的区别

Web Storage 的概念和 cookie 相似,区别是它是为了更大容量存储设计的。Cookie 的大小是受限的,并且每次你请求一个新的页面的时候 Cookie 都会被发送过去,这样无形中浪费了带宽,另外 cookie 还需要指定作用域,不可以跨域调用。
除此之外, Web Storage 拥有 setItem,getItem,removeItem,clear 等方法, 不像cookie 需要前端开发者自己封装 setCookie,getCookie。但是 Cookie 也是不可以或缺的:Cookie 的作用是与服务器进行交互,作为 HTTP 规范的一部分而存在 ,而Web Storage 仅仅是为了在本地“存储”数据而生。

20、知道 css 有个 content 属性吗?有什么作用?有什么应用?

知道。css 的 content 属性专门应用在 before/after 伪元素上,用来插入生成内容。最常见的应用是利用伪类清除浮动。
//一种常见利用伪类清除浮动的代码
.clearfix:after {
content:“.”; //这里利用到了 content 属性display:block;
height:0; visibility:hidden; clear:both; }
.clearfix {
*zoom:1;
}

after 伪元素通过 content 在元素的后面生成了内容为一个点的块级素,再利用clear:both 清除浮动。
那么问题继续还有,知道 css 计数器(序列数字字符自动递增)吗?如何通过css content 属性实现 css 计数器?
答案:css 计数器是通过设置 counter-reset 、counter-increment 两个属性 、及counter()/counters()一个方法配合 after / before 伪类实现。

21、如何在 HTML5 页面中嵌入音频?

HTML 5 包含嵌入音频文件的标准方式,支持的格式包括 MP3、Wav 和 Ogg:

Your browser does’nt support audio embedding feature.

22、如何在 HTML5 页面中嵌入视频?

和音频一样,HTML5 定义了嵌入视频的标准方法,支持的格式包括:MP4、WebM 和 Ogg:

Your browser does'nt support video embedding feature. 23、HTML5 引入什么新的表单属性?

Datalist datetime output keygen date month week time number range emailurl

24、CSS3 新增伪类有那些?

p:first-of-type 选择属于其父元素的首个

元素的每个

元素。p:last-of-type 选择属于其父元素的最后

元素的每个

元素。p:only-of-type 选择属于其父元素唯一的

元素的每个

元素。p:only-child 选择属于其父元素的唯一子元素的每个

元素。p:nth-child(2) 选择属于其父元素的第二个子元素的每个

元素。
:enabled、:disabled 控制表单控件的禁用状态。
:checked,单选框或复选框被选中。

25、(写)描述一段语义的 html 代码吧。

(HTML5 中新增加的很多标签(如:

等) 就是基于语义化设计原则)

< div id=“header”>

< h1>标题< /h1>

< h2>专注 Web 前端技术< /h2>

< /div>

语义 HTML 具有以下特性:

文字包裹在元素中,用以反映内容。例如: 段落包含在

元素中。
顺序表包含在

1. 元素中。 
   
 从其他来源引用的大型文字块包含在 
 
> 
>  元素中。HTML 元素不能用作语义用途以外的其他目的。例如: 
>

包含标题,但并非用于放大文本。

包含大段引述,但并非用于文本缩进。 空白段落元素 ( ) 并非用于跳行。 文本并不直接包含任何样式信息。例如: 不使用 或

等格式标记。类或 ID 中不引用颜色或位置。

26.cookie 在浏览器和服务器间来回传递。 sessionStorage 和 localStorage 区别

sessionStorage 和 localStorage 的存储空间更大; sessionStorage 和 localStorage 有更多丰富易用的接口; sessionStorage 和 localStorage 各自独立的存储空间;

27、html5 有哪些新特性、移除了那些元素?如何处理 HTML5 新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?

+ HTML5 现在已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增加。
+ 绘画 canvas  
 用于媒介回放的 videoaudio 元素  
 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失; sessionStorage 的数据在浏览器关闭后自动删除  
 语意化更好的内容元素,比如 articlefooterheadernavsection 表单控件,calendar、date、time、email、url、search  
 新的技术 webworker, websockt, Geolocation  
 \*移除的元素  
 纯表现的元素:basefont,big,center,font, s,strike,tt,u; 对可用性产生负面影响的元素:frame,frameset,noframes;  
 支持 HTML5 新标签:  
 \*IE8/IE7/IE6 支持通过 document.createElement 方法产生的标签, 可以利用这一特性让这些浏览器支持 HTML5 新标签,  
 浏览器支持新标签后,还需要添加标签默认的样式:  
 \*当然最好的方式是直接使用成熟的框架、使用最多的是 html5shim 框架28、如何区分: DOCTYPE 声明\新增的结构元素\功能元素

29、语义化的理解?

用正确的标签做正确的事情!
html 语义化就是让页面的内容结构化,便于对浏览器、搜索引擎解析; 在没有样式 CCS 情况下也以一种文档格式显示,并且是容易阅读的。
搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重,利于 SEO。使阅读源代码的人对网站更容易将网站分块,便于阅读维护理解。

30、HTML5 的离线储存?

localStorage 长期存储数据,浏览器关闭后数据不丢失; sessionStorage 数据在浏览器关闭后自动删除。

31、写出 HTML5 的文档声明方式

32、HTML5 和 CSS3 的新标签

HTML5: nav, footer, header, section, hgroup, video, time, canvas, audio… CSS3: RGBA, opacity, text-shadow, box-shadow, border-radius, border-image, border-color, transform…;

33、自己对标签语义化的理解

在我看来,语义化就是比如说一个段落, 那么我们就应该用

标签来修饰, 标题就应该用 <h?>标签等。符合文档语义的标签。

五、移动 web 开发

1、移动端常用类库及优缺点

知识面宽度,多多益善

2、Zepto 库和 JQ 区别

Zepto 相对 jQuery 更加轻量,主要用在移动端,jQuery 也有对应的 jQuerymobile 移动端框架 d

六、Ajax

1、Ajax 是什么? 如何创建一个 Ajax?

Ajax 并不算是一种新的技术,全称是 asynchronous javascript and xml,可以说是已有技术的组合,主要用来实现客户端与服务器端的异步通信效果,实现页面的局部刷新,早 期的浏览器并不能原生支持 ajax,可以使用隐藏帧(iframe)方式变相实现异步效果,后来的浏览器提供了对 ajax 的原生支持
使 用 ajax 原 生 方 式 发 送 请 求 主 要 通 过 XMLHttpRequest( 标 准 浏 览 器 ) 、ActiveXObject(IE 浏览器)对象实现异步通信效果
基本步骤:
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();//发送请求
js 框架(jQuery/EXTJS 等)提供的 ajax API 对原生的 ajax 进行了封装,熟悉了基础理论,再学习别的框架就会得心应手,好多都是换汤不换药的内容

2、同步和异步的区别?

同步:阻塞的
-张三叫李四去吃饭,李四一直忙得不停,张三一直等着,直到李四忙完两个人一块去吃饭
=浏览器向服务器请求数据,服务器比较忙,浏览器一直等着(页面白屏),直到服务器返回数据,浏览器才能显示页面
异步:非阻塞的
-张三叫李四去吃饭,李四在忙,张三说了一声然后自己就去吃饭了,李四忙完后自己去吃
=浏览器向服务器请求数据,服务器比较忙,浏览器可以自如的干原来的事情(显示页面), 服务器返回数据的时候通知浏览器一声,浏览器把返回的数据再渲染到页面,局部更新

3、如何解决跨域问题?

理解跨域的概念:协议、域名、端口都相同才同域,否则都是跨域
出于安全考虑,服务器不允许 ajax 跨域获取数据,但是可以跨域获取文件内容,所以基于这一点,可以动态创建 script 标签,使用标签的 src 属性访问 js 文件的形式获取 js

脚本,并且这个 js 脚本中的内容是函数调用,该函数调用的参数是服务器返回的数据,为了获取这里的参数数据,需要事先在页面中定义回调函数,在回调函数中处理服务器返回的 数据,这就是解决跨域问题的主流解决方案

4、页面编码和被请求的资源编码如果不一致如何处理?

对于 ajax 请求传递的参数,如果是 get 请求方式,参数如果传递中文,在有些浏览器会乱码,不同的浏览器对参数编码的处理方式不同,所以对于 get 请求的参数需要使用encodeURIComponent 函数对参数进行编码处理,后台开发语言都有相应的解码 api。对于 post 请求不需要
进行编码

5、简述 ajax 的过程。

1.创建 XMLHttpRequest 对象,也就是创建一个异步调用对象
2.创建一个新的 HTTP 请求,并指定该 HTTP 请求的方法、URL 及验证信息
3.设置响应 HTTP 请求状态变化的函数
4.发送 HTTP 请求
5.获取异步调用返回的数据
6.使用 JavaScript 和 DOM 实现局部刷新

6、阐述一下异步加载。

1.异步加载的方案: 动态插入 script 标签
2.通过 ajax 去获取 js 代码,然后通过 eval 执行
3.script 标签上添加 defer 或者 async 属性
4.创建并插入 iframe,让它异步执行 js

7、请解释一下 JavaScript 的同源策略。

同源策略是客户端脚本(尤其是 Javascript)的重要的安全度量标准。它最早出自Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载。所谓同源指的是:协议,域名,端口相同,同源策略是一种安全协议,指一段脚本只能读取来自同一来源 的窗口和文档的属性。

8、GET 和 POST 的区别,何时使用 POST?

GET:一般用于信息获取,使用 URL 传递参数,对所发送信息的数量也有限制,一般在2000 个字符,有的浏览器是 8000 个字符
POST:一般用于修改服务器上的资源,对所发送的信息没有限制
在以下情况中,请使用 POST 请求:
1.无法使用缓存文件(更新服务器上的文件或数据库)

2.向服务器发送大量数据(POST 没有数据量限制)
3.发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

9、ajax 是什么?ajax 的交互模型?同步和异步的区别?如何解决跨域问题?

1.通过异步模式,提升了用户体验
2.优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用
3.Ajax 在客户端运行,承担了一部分本来由服务器承担的工作,减少了大用户量下的服务器负载。

10、 Ajax 的最大的特点是什么。

Ajax 可以实现异步通信效果,实现页面局部刷新,带来更好的用户体验;按需获取数据,节约带宽资源;

11、ajax 的缺点

1、ajax 不支持浏览器 back 按钮。
2、安全问题 AJAX 暴露了与服务器交互的细节。
3、对搜索引擎的支持比较弱。
4、破坏了程序的异常机制。

12、ajax 请求的时候 get 和 post 方式的区别

get 一般用来进行查询操作,url 地址有长度限制,请求的参数都暴露在 url 地址当中,如果传递中文参数,需要自己进行编码操作,安全性较低。
post 请求方式主要用来提交数据,没有数据长度的限制,提交的数据内容存在于 http 请求体中,数据不会暴漏在 url 地址中。

13、解释 jsonp 的原理,以及为什么不是真正的 ajax

Jsonp 并不是一种数据格式,而 json 是一种数据格式,jsonp 是用来解决跨域获取数据的一种解决方案,具体是通过动态创建 script 标签,然后通过标签的 src 属性获取 js 文件中的 js 脚本,该脚本的内容是一个函数调用,参数就是服务器返回的数据,为了处理这些返回的数据,需要事先在页面定义好回调函数,本质上使用的并不是 ajax 技术

14、什么是 Ajax 和 JSON,它们的优缺点。

Ajax 是全称是 asynchronous JavaScript andXML,即异步 JavaScript 和 xml,用于在Web 页面中实现异步数据交互,实现页面局部刷新。
优点:可以使得页面不重载全部内容的情况下加载局部内容,降低数据传输量,避免用 户不断刷新或者跳转页面,提高用户体验

缺点:对搜索引擎不友好;要实现 ajax 下的前后退功能成本较大;可能造成请求数的增加跨域问题限制;
JSON 是一种轻量级的数据交换格式,ECMA 的一个子集
优点:轻量级、易于人的阅读和编写,便于机器(JavaScript)解析,支持复合数据类 型(数组、对象、字符串、数字)

15、http 常见的状态码有那些?分别代表是什么意思?

200 - 请求成功
301 - 资源(网页等)被永久转移到其它 URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误

16、一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?

分为 4 个步骤:
1.当发送一个 URL 请求时,不管这个 URL 是 Web 页面的 URL 还是 Web 页面上每个资源的 URL,浏览器都会开启一个线程来处理这个请求,同时在远程 DNS 服务器上启动一个 DNS查询。这能使浏览器获得请求对应的 IP 地址。
2.浏览器与远程 Web 服务器通过 TCP 三次握手协商来建立一个 TCP/IP 连接。该握手包括一个同步报文,一个同步-应答报文和一个应答报文,这三个报文在 浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,而后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。
3.一旦 TCP/IP 连接建立,浏览器会通过该连接向远程服务器发送 HTTP 的 GET 请求。远程服务器找到资源并使用 HTTP 响应返回该资源,值为 200 的 HTTP 响应状态表示一个正确的响应。
4.此时,Web 服务器提供资源服务,客户端开始下载资源。

17、ajax 请求的时候 get 和 post 方式的区别

get 一般用来进行查询操作,url 地址有长度限制,请求的参数都暴露在 url 地址当中, 如果传递中文参数,需要自己进行编码操作,安全性较低。
post 请求方式主要用来提交数据,没有数据长度的限制,提交的数据内容存在于 http 请求体中,数据不会暴漏在 url 地址中。

18、ajax 请求时,如何解释 json 数据

使用 eval() 或者 JSON.parse() 鉴于安全性考虑,推荐使用 JSON.parse()更靠谱,对数据的安全性更好。

19、.javascript 的本地对象,内置对象和宿主对象

本地对象为独立于宿主环境的 ECMAScript 提供的对象,包括 Array Object RegExp 等可以 new 实例化的对象
内置对象为 Gload,Math 等不可以实例化的(他们也是本地对象,内置对象是本地对象的一个子集)
宿主对象为所有的非本地对象,所有的 BOM 和 DOM 对象都是宿主对象,如浏览器自带的document,window 等对象

20、为什么利用多个域名来存储网站资源会更有效?

确保用户在不同地区能用最快的速度打开网站,其中某个域名崩溃用户也能通过其他郁 闷访问网站,并且不同的资源放到不同的服务器上有利于减轻单台服务器的压力。

21、请说出三种减低页面加载时间的方法

1、压缩 css、js 文件
2、合并 js、css 文件,减少 http 请求3、外部 js、css 文件放在最底下
4、减少 dom 操作,尽可能用变量替代不必要的 dom 操作

22、HTTP 状态码都有那些。

200 OK //客户端请求成功

400 Bad Request //客户端请求有语法错误,不能被服务器所理解
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,输入了错误的 URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

七、JS 高级

1、JQuery 一个对象可以同时绑定多个事件,这是如何实现的?

jQuery 可以给一个对象同时绑定多个事件,低层实现方式是使用 addEventListner 或attachEvent 兼容不同的浏览器实现事件的绑定,这样可以给同一个对象注册多个事件。

2、知道什么是 webkit 么? 知道怎么用浏览器的各种工具来调试和 debug 代码么?

Webkit 是浏览器引擎,包括 html 渲染和 js 解析功能,手机浏览器的主流内核,与之相对应的引擎有 Gecko(Mozilla Firefox 等使用)和 Trident(也称 MSHTML,IE 使用)。

对于浏览器的调试工具要熟练使用,主要是页面结构分析,后台请求信息查看,js 调试工具使用,熟练使用这些工具可以快速提高解决问题的效率

3、如何测试前端代码? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit…)?

了解 BDD 行为驱动开发与 TDD 测试驱动开发已经单元测试相关概念,

4、前端 templating(Mustache, underscore, handlebars)是干嘛的, 怎么用?

Web 模板引擎是为了使用户界面与业务数据(内容)分离而产生的,
Mustache 是一个 logic-less (轻逻辑)模板解析引擎,它的优势在于可以应用在Javascript、PHP、Python、Perl 等多种编程语言中。
Underscore 封装了常用的 JavaScript 对象操作方法,用于提高开发效率。Handlebars 是 JavaScript 一个语义模板库,通过对 view 和 data 的分离来快速构建Web 模板。

5、简述一下 Handlebars 的基本用法?

没有用过的话说出它是干什么的即可官网:handlebarsjs.com/
参考:J:\代码,PPT,笔记,电子书\面试题\handlebarDemo

6、简述一下 Handlerbars 的对模板的基本处理流程, 如何编译的?如何缓存的?
学习技术不仅要会用,还有熟悉它的实现机制,这样在开发中遇到问题时才能更好的解决

7、用 js 实现千位分隔符?

原生 js 的熟练度,实践经验,实现思路

8、检测浏览器版本版本有哪些方式?

IE 与标准浏览器判断,IE 不同版本的判断,userAgent var ie = /@cc_on !@/false;

9、我们给一个 dom 同时绑定两个点击事件,一个用捕获,一个用冒泡,你来说下会执行几次事件,然后会先执行冒泡还是捕获
对两种事件模型的理解

10、实现一个函数 clone,可以对 JavaScript 中的 5 种主要的数据类型(包括

Number、String、Object、Array、Boolean)进行值复制

考察点 1:对于基本数据类型和引用数据类型在内存中存放的是值还是指针这一区别是否清楚
考察点 2:是否知道如何判断一个变量是什么类型的
考察点 3:递归算法的设计
// 方法一:
Object.prototype.clone = function(){
var o = this.constructor === Array ? [] : {}; for(var e in this){
o[e] = typeof this[e] === “object” ? this[e].clone() : this[e];
}
return o;
}
//方法二:
/**
*克隆一个对象
*@param Obj
*@returns
*/
function clone(Obj) {
var buf;
if (Obj instanceof Array) {
buf = [];//创建一个空的数组var i = Obj.length;
while (i–) {
buf[i] = clone(Obj[i]);
}
return buf;
}else if (Obj instanceof Object){ buf = {};//创建一个空对象
for (var k in Obj) { //为这个对象添加新的属性buf[k] = clone(Obj[k]);
}

return buf;
}else{ //普通变量直接赋值return Obj;
}
}

11、如何消除一个数组里面重复的元素?

var arr=[1,2,3,3,4,4,5,5,6,1,9,3,25,4];
function deRepeat(){
var newArr=[]; var obj={}; var index=0;
var l=arr.length; for(var i=0;i<l;i++){
if(obj[arr[i]]==undefined)
{
obj[arr[i]]=1; newArr[index++]=arr[i];
}
else if(obj[arr[i]]==1) continue;
}
return newArr;
}
var newArr2=deRepeat(arr); alert(newArr2); //输出 1,2,3,4,5,6,9,25

12、小贤是一条可爱的小狗(Dog),它的叫声很好听(wow),每次看到主人的时候就会乖乖叫一声(yelp)。从这段描述可以得到以下对象:
function Dog() {
this.wow = function() {
alert(’Wow’);
}
this.yelp = function() {
this.wow();
}
}

小芒和小贤一样,原来也是一条可爱的小狗,可是突然有一天疯了(MadDog),一看到人就会每隔半秒叫一声(wow)地不停叫唤(yelp)。请根据描述,按示例的形式用代码来实。(继承, 原型,setInterval)
function MadDog() {
this.yelp = function() {
var self = this; setInterval(function() {
self.wow();
}, 500);
}
}
MadDog.prototype = new Dog();
//for test
var dog = new Dog(); dog.yelp();
var madDog = new MadDog(); madDog.yelp();

13、下面这个 ul,如何点击每一列的时候 alert 其 index?(闭包)

+ 这是第一条
+ 这是第二条
+ 这是第三条 // 方法一: var lis=document.getElementById('2223').getElementsByTagName('li'); for(var i=0;i<3;i++) { lis[i].index=i; lis[i].οnclick=function(){ alert(this.index); }; } //方法二: var lis=document.getElementById('2223').getElementsByTagName('li'); for(var i=0;i<3;i++){ 

lis[i].index=i; lis[i].οnclick=(function(a){
return function() {
alert(a);
}
})(i);
}

14、编写一个 JavaScript 函数,输入指定类型的选择器(仅需支持 id,class,tagName三种简单 CSS 选择器,无需兼容组合选择器)可以返回匹配的 DOM 节点,需考虑浏览器兼容性和性能。

/*** @param selector {String} 传入的 CSS 选择器。* @return {Array}*/

var query = function(selector) { var reg = /^(#)?(.)?(\w+)$/img;
var regResult = reg.exec(selector); var result = [];
//如果是 id 选择器if(regResult[1]) { if(regResult[3]) {
if(typeof document.querySelector === “function”) { result.push(document.querySelector(regResult[3]));
}else {
result.push(document.getElementById(regResult[3]));
}
}
}
//如果是 class 选择器else if(regResult[2]) {
if(regResult[3]) {
if(typeof document.getElementsByClassName === ‘function’) { var doms = document.getElementsByClassName(regResult[3]); if(doms) {
result = converToArray(doms);
}
}

//如果不支持 getElementsByClassName 函数else {
var allDoms = document.getElementsByTagName(“*”) ; for(var i = 0, len = allDoms.length; i < len; i++) {
if(allDoms[i].className.search(new RegExp(regResult[2])) > -1) { result.push(allDoms[i]);
}
}
}
}
}
//如果是标签选择器
else if(regResult[3]) {
var doms = document.getElementsByTagName(regResult[3].toLowerCase()); if(doms) {
result = converToArray(doms);
}
}
return result;
}
function converToArray(nodes){ var array = null;
try{
array = Array.prototype.slice.call(nodes,0);//针对非 IE 浏览器
}catch(ex){
array = new Array();
for( var i = 0 ,len = nodes.length; i < len ; i++ ) { array.push(nodes[i])
}
}
return array;
}

15、请评价以下代码并给出改进意见。

if(window.addEventListener){
var addListener = function(el,type,listener,useCapture){ el.addEventListener(type,listener,useCapture);

};
}
else if(document.all){
addListener = function(el,type,listener){ el.attachEvent(“on”+type,function(){
listener.apply(el);
});
}
}
不应该在 if 和 else 语句中声明 addListener 函数,应该先声明;
不需要使用 window.addEventListener 或 document.all 来进行检测浏览器,应该使用能力检测;
由于 attachEvent 在 IE 中有 this 指向问题,所以调用它时需要处理一下改进如下:

function addEvent(elem, type, handler){ if(elem.addEventListener){
elem.addEventListener(type, handler, false);
}else if(elem.attachEvent){
elem[‘temp’ + type + handler] = handler; elem[type + handler] = function(){ elem[‘temp’ + type + handler].apply(elem);
};
elem.attachEvent(‘on’ + type, elem[type + handler]);
}else{
elem[‘on’ + type] = handler;
}
}

16、给 String 对象添加一个方法,传入一个 string 类型的参数,然后将 string 的每个字符间价格空格返回,例如:

addSpace(“hello world”) // -> ‘h e l l o w o r l d’ String.prototype.spacify = function(){
return this.split(‘’).join(’ ');
};

接着上述问题答案提问,1)直接在对象的原型上添加方法是否安全?尤其是在 Object 对象上。(这个我没能答出?希望知道的说一下。) 2)函数声明与函数表达式的区别?
答案:在 js 中,解析器在向执行环境中加载数据时,对函数声明和函数表达式并非是一视同仁的,解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问),至于 函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解析执行。

17、定义一个 log 方法,让它可以代理 console.log 的方法。
可 行 的 方 法 一 : function log(msg) {
console.log(msg);
}
log(“hello world!”) // hello world!
如果要传入多个参数呢?显然上面的方法不能满足要求,所以更好的方法是:

function log(){
console.log.apply(console, arguments);
};
到此,追问 apply 和 call 方法的异同。

对于 apply 和 call 两者在作用上是相同的,即是调用一个对象的一个方法,以另一个对象替换当前对象。将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

但两者在参数上有区别的。对于第一个参数意义都一样,但对第二个参数: apply 传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而 call 则作为 call 的参数传入(从第二个参数开始)。 如 func.call(func1,var1,var2,var3)对应的 apply 写法为: func.apply(func1,[var1,var2,var3]) 。

18、在 Javascript 中什么是伪数组?如何将伪数组转化为标准数组?

伪数组(类数组):无法直接调用数组方法或期望 length 属性有什么特殊的行为,但仍可以对真正数组遍历方法来遍历它们。典型的是函数的 argument 参数,还有像调用getElementsByTagName,document.childNodes 之类的,它们都返回 NodeList 对象都属于伪数组。可以使用 Array.prototype.slice.call(fakeArray)将数组转化为真正的Array 对象。

假设接第八题题干,我们要给每个 log 方法添加一个”(app)”前缀,比如’hello world!’
->’(app)hello world!’。方法如下:

function log(){
var args = Array.prototype.slice.call(arguments); //为了使用 unshift 数组方法,将 argument 转化为真正的数组
args.unshift(‘(app)’); console.log.apply(console, args);
};

19、对作用域上下文和 this 的理解,看下列代码:

var User = {
count: 1,
getCount: function() { return this.count;
}
};
console.log(User.getCount()); // what? var func = User.getCount; console.log(func()); // what?
问两处 console 输出什么?为什么? 答案是 1 和 undefined。
func 是在 winodw 的上下文中被执行的,所以会访问不到 count 属性。

继续追问,那么如何确保 Uesr 总是能访问到 func 的上下文,即正确返回 1。正确的方法是使用 Function.prototype.bind。兼容各个浏览器完整代码如下:

Function.prototype.bind = Function.prototype.bind || function(context){ var self = this;
return function(){
return self.apply(context, arguments);
};
}
var func = User.getCount.bind(User); console.log(func());

20、原生 JS 的 window.onload 与 Jquery 的$(document).ready(function(){})有什么不同?如何用原生 JS 实现 Jq 的 ready 方法?
window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行。

$(document).ready()是 DOM 结构绘制完毕后就执行,不必等到加载完毕。

/*
*传递函数给 whenReady()
*当文档解析完毕且为操作准备就绪时,函数作为 document 的方法调用
*/
var whenReady = (function() { //这个函数返回 whenReady() 函数
var funcs = []; //当获得事件时,要运行的函数var ready = false; //当触发事件处理程序时,切换为 true
//当文档就绪时,调用事件处理程序function handler(e) {
if(ready) return; //确保事件处理程序只完整运行一次
//如果发生 onreadystatechange 事件,但其状态不是 complete 的话,那么文

档尚未准备好’complete’) {

if(e.type === ‘onreadystatechange’ && document.readyState !== return;
}
//运行所有注册函数
//注意每次都要计算 funcs.length
//以防这些函数的调用可能会导致注册更多的函数for(var i=0; i<funcs.length; i++) {
funcs[i].call(document);

}
//事件处理函数完整执行,切换 ready 状态, 并移除所有函数ready = true;
funcs = null;
}
//为接收到的任何事件注册处理程序if(document.addEventListener) {
document.addEventListener(‘DOMContentLoaded’, handler, false); document.addEventListener(‘readystatechange’, handler,
false); //IE9+
window.addEventListener(‘load’, handler, false);
}else if(document.attachEvent) { document.attachEvent(‘onreadystatechange’, handler); window.attachEvent(‘onload’, handler);

}
//返回 whenReady()函数
return function whenReady(fn) { if(ready) { fn.call(document); } else { funcs.push(fn); }
}
})();
如果上述代码十分难懂,下面这个简化版:

function ready(fn){
if(document.addEventListener) {//标准浏览器document.addEventListener(‘DOMContentLoaded’, function() {
//注销事件, 避免反复触发document.removeEventListener(‘DOMContentLoaded’,arguments.c

allee, false);

fn();//执行函数
}, false);

}else if(document.attachEvent) {//IE document.attachEvent(‘onreadystatechange’, function() {
if(document.readyState == ‘complete’) { document.detachEvent(‘onreadystatechange’,

arguments.callee);

}
});
}
};

fn();//函数执行

21、(设计题)想实现一个对页面某个节点的拖曳?如何做?(使用原生 JS)

回答出概念即可,下面是几个要点

1.给需要拖拽的节点绑定 mousedown, mousemove, mouseup 事件
2.mousedown 事件触发后,开始拖拽
3.mousemove 时,需要通过 event.clientX 和 clientY 获取拖拽位置,并实时更新位置
4.mouseup 时,拖拽结束
5.需要注意浏览器边界的情况

22、请实现如下功能

function setcookie(name,value,days){ //给 cookie 增加一个时间变量var exp = new Date();
exp.setTime(exp.getTime() + days2460601000); //设置过期时间为 days 天document.cookie = name + “=”+ escape (value) + “;expires=” + exp.toGMTString();
}
function getCookie(name){ var result = “”;
var myCookie = “”+document.cookie+“;”; var searchName = “+name+”=“;
var startOfCookie = myCookie.indexOf(searchName); var endOfCookie;
if(satrtOfCookie != -1){
startOfcookie += searchName.length;
endOfCookie = myCookie.indexOf(”;",startOfCookie); result = (myCookie.substring(startOfCookie,endOfCookie));
}
return result;
}
(function(){
var oTips = document.getElementById(‘tips’);//假设 tips 的 id 为 tips var page = {
check: function(){//检查 tips 的 cookie 是否存在并且允许显示var tips = getCookie(‘tips’);
if(!tips || tips == ‘show’) return true;//tips 的 cookie 不存在if(tips == “never_show_again”) return false;
},
hideTip: function(bNever){
if(bNever) setcookie(‘tips’, ‘never_show_again’, 365); oTips.style.display = “none”;//隐藏

},
showTip: function(){
oTips.style.display = “inline”;//显示,假设 tips 为行级元素
},
init: function(){ var _this = this; if(this.check()){
_this.showTip(); setcookie(‘tips’, ‘show’, 1);
}
oTips.onclick = function(){
_this.hideTip(true);
};
}
};
page.init();
})();

23、说出以下函数的作用是?空白区域应该填写什么?

//define (function(window){
function fn(str){
this.str=str;
}

fn.prototype.format = function(){ var arg = ;
return this.str.replace( ,function(a,b){ return arg[b]||“”;
});
}
window.fn = fn;
})(window);

//use (function(){
var t = new fn(‘

{1}{2}

’); console.log(t.format(‘www.alibaba.com’,‘Alibaba’,‘Welcome’));
})();
答案:访函数的作用是使用 format 函数将函数的参数替换掉{0}这样的内容,返回一个格式化后的结果:

第一个空是:arguments

第二个空是:/{(\d+)}/ig

24、 Javascript 作用域链?

理解变量和函数的访问范围和生命周期,全局作用域与局部作用域的区别,JavaScript 中没有块作用域,函数的嵌套形成不同层次的作用域,嵌套的层次形成链式形式,通过作用 域链查找属性的规则需要深入理解。

25、 谈谈 this 对象的理解。

理解不同形式的函数调用方式下的 this 指向,理解事件函数、定时函数中的 this 指向, 函数的调用形式决定了 this 的指向。

26、 eval 是做什么的?

它的功能是把对应的字符串解析成 JS 代码并运行;应该避免使用 eval,不安全,非常耗性能(2 个步骤,一次解析成 js 语句,一次执行)

27、 关于事件,IE 与火狐的事件机制有什么区别? 如何阻止冒泡?

[1].在 IE 中,事件对象是作为一个全局变量来保存和维护的.所有的浏览器事件,不管是用户触发的, 还是其他事件, 都会更新 window.event 对象. 所以在代码中, 只要调用window.event 就可以获取事件对象, 再 event.srcElement 就可以取得触发事件的元素进行进一步处理.
[2].在 FireFox 中,事件对象却不是全局对象,一般情况下,是现场发生,现场使用,FireFox 把事件对象自动传给事件处理程序.
关于事件的兼容性处理要熟练掌握,事件对象具体哪些属性存在兼容性问题,IE 与标准事件模型事件冒泡与事件捕获的支持要理解

28、 什么是闭包(closure),为什么要用它?

简单的理解是函数的嵌套形成闭包,闭包包括函数本身已经它的外部作用域 使用闭包可以形成独立的空间,延长变量的生命周期,报存中间状态值

29、javascript 代码中的"use strict";是什么意思 ? 使用它区别是什么?

意思是使用严格模式,使用严格模式,一些不规范的语法将不再支持

严格模式

链接:www.ruanyifeng.com/blog/2013/0…

全局变量显式声明

静态绑定

禁止使用with 语句

eval 中定义的变量都是局部变量

禁止this 关键字指向全局对象

禁止在函数内部遍历调用栈

严格模式下无法删除变量。只有configurable 设置为true 的对象属性,才能被删除

正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报 错。

严格模式下,对一个使用getter 方法读取的属性进行赋值,会报错。

严格模式下,对禁止扩展的对象添加新属性,会报错。

严格模式下,删除一个不可删除的属性,会报错。

正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这 属于语法错误。

正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取。严格模式下,这属于语法 错误。

正常模式下,整数的第一位如果是 0,表示这是八进制数,比如 0100 等于十进制的 64。严格模式禁止这种表示法,整数第一位为 0,将报错。

不允许对arguments 赋值

arguments 不再追踪参数的变化

禁止使用arguments.callee

严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码 块内声明函数

严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。

30、如何判断一个对象是否属于某个类(严格来说在 ES6 之前,js 没有类的概念)?

instanceof constructor

31、new 操作符具体干了什么呢?

1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。

32、用原生 JavaScript 的实现过什么功能吗?

主要考察原生 js 的实践经验

33、Javascript 中,有一个函数,执行时对象查找时,永远不会去查找原型, 这个函数是?

HasOwnProperty

34、对 JSON 的了解?

轻量级数据交互格式,可以形成复杂的嵌套格式,解析非常方便

35、js 延迟加载的方式有哪些?

方案一:

36、模块化开发怎么做?

理解模块化开发模式:浏览器端 requirejs,seajs;服务器端 nodejs;ES6 模块化;fis、webpack 等前端整体模块化解决方案;grunt、gulp 等前端工作流的使用

37、AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)规范区别?

理解这两种规范的差异,主要通过 requirejs 与 seajs 的对比,理解模块的定义与引用方式的差异以及这两种规范的设计原则
参考链接 1:www.zhihu.com/question/20… 参考链接 2:github.com/seajs/seajs…

1、对于依赖的模块,AMD 是提前执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始, 也改成可以延迟执行(根据写法不同,处理方式不同)。CMD 推崇 as lazy as possible. 2、CMD 推崇依赖就近,AMD 推崇依赖前置。
3. AMD 的 API 默认是一个当多个用,CMD 的 API 严格区分,推崇职责单一。比如 AMD 里, require 分全局 require 和局部 require,都叫 require。CMD 里,没有全局 require, 而是根据模块系统的完备性,提供 seajs.use 来实现模块系统的加载启动。CMD 里,每个API 都简单纯粹。

38、requireJS 的核心原理是什么?(如何动态加载的?如何避免多次加载的? 如何 缓存的?)

核心是 js 的加载模块,通过正则匹配模块以及模块的依赖关系,保证文件加载的先后顺序, 根据文件的路径对加载过的文件做了缓存

39、让你自己设计实现一个 requireJS,你会怎么做?

核心是实现 js 的加载模块,维护 js 的依赖关系,控制好文件加载的先后顺序

40、谈一谈你对 ECMAScript6 的了解?

ES6 新的语法糖,类,模块化等新特性
关于 ES6 参考链接:es6.ruanyifeng.com/
1.ECMAScript 6 简介
2.let 和 const 命令
3.变量的解构赋值
4.字符串的扩展
5.正则的扩展
6.数值的扩展
7.数组的扩展

8.函数的扩展
9.对象的扩展
10.Symbol
11.Proxy 和 Reflect
12.二进制数组
13.Set 和 Map 数据结构
14.Iterator 和 for…of 循环
15.Generator 函数
16.Promise 对象
17.异步操作和 Async 函数
18.Class
19.Decorator
20.Module

41、ECMAScript6 怎么写 class 么,为什么会出现 class 这种东西?

class Point { constructor(x, y) {
this.x = x; this.y = y;
}
toString() {
return ‘(’+this.x+‘, ‘+this.y+’)’;
}
}

42、异步加载的方式有哪些?

方案一:

43、documen.write 和 innerHTML 的区别?

document.write 是重写整个 document, 写入内容是字符串的 html innerHTML 是 HTMLElement 的属性,是一个元素的内部 html 内容

44、DOM 操作——怎样添加、移除、移动、复制、创建和查找节点?

(1)创建新节点
createDocumentFragment() //创建一个 DOM 片段createElement_x() //创建一个具体的元素

createTextNode() //创建一个文本节点
(2)添加、移除、替换、插入appendChild() removeChild() replaceChild() insertBefore()
(3)查找
getElementsByTagName() //通过标签名称getElementsByName() //通过元素的 Name 属性的值getElementById() //通过元素 Id,唯一性

45、call() 和 apply() 的含义和区别?

apply 的参数是数组形式,call 的参数是单个的值,除此之外在使用上没有差别,重点理解这两个函数调用的 this 改变

46、数组和对象有哪些原生方法,列举一下?

Array.concat( ) 连接数组
Array.join( ) 将数组元素连接起来以构建一个字符串Array.length 数组的大小
Array.pop( ) 删除并返回数组的最后一个元素Array.push( ) 给数组添加元素Array.reverse( ) 颠倒数组中元素的顺序Array.shift( ) 将元素移出数组Array.slice( ) 返回数组的一部分Array.sort( ) 对数组元素进行排序Array.splice( ) 插入、删除或替换数组的元素
Array.toLocaleString( ) 把数组转换成局部字符串Array.toString( ) 将数组转换成一个字符串Array.unshift( ) 在数组头部插入一个元素

Object 对象的常用方法
Object.hasOwnProperty( ) 检查属性是否被继承Object.isPrototypeOf( ) 一个对象是否是另一个对象的原型Object.propertyIsEnumerable( ) 是否可以通过 for/in 循环看到属性Object.toLocaleString( ) 返回对象的本地字符串表示Object.toString( ) 定义一个对象的字符串表示
Object.valueOf( ) 指定对象的原始值

47、JS 怎么实现一个类。怎么实例化这个类

严格来讲 js 中并没有类的概念,不过 js 中的函数可以作为构造函数来使用,通过 new 来实例化,其实函数本身也是一个对象。

48、JavaScript 中的作用域与变量声明提升?

理解 JavaScript 的预解析机制,js 的运行主要分两个阶段:js 的预解析和运行,预解析阶段所有的变量声明和函数定义都会提前,但是变量的赋值不会提前

49、如何编写高性能的 Javascript?

使用 DocumentFragment 优化多次 append 通过模板元素 clone ,替代 createElement 使用一次 innerHTML 赋值代替构建 dom 元素
使用 firstChild 和 nextSibling 代替 childNodes 遍历 dom 元素使用 Array 做为 StringBuffer ,代替字符串拼接的操作
将循环控制量保存到局部变量
顺序无关的遍历时,用 while 替代 for 将条件分支,按可能性顺序从高到低排列
在同一条件子的多( >2 )条件分支时,使用 switch 优于 if 使用三目运算符替代条件分支
需要不断执行的时候,优先考虑使用 setInterval

50、那些操作会造成内存泄漏?

闭包,死循环

51、javascript 对象的几种创建方式?

1.工厂模式
2.构造函数模式
3.原型模式
4.混合构造函数和原型模式
5.动态原型模式
6.寄生构造函数模式
7.稳妥构造函数模式

52、javascript 继承的 6 种方法?

1.原型链继承
2.借用构造函数继承
3.组合继承(原型+借用构造)
4.原型式继承
5.寄生式继承
6.寄生组合式继承

53、eval 是做什么的?

1.它的功能是把对应的字符串解析成 JS 代码并运行
2.应该避免使用 eval,不安全,非常耗性能(2 次,一次解析成 js 语句,一次执行)

54、JavaScript 原型,原型链 ? 有什么特点?

1.原型对象也是普通的对象,是对象一个自带隐式的 proto 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为 null 的话,我们就称之为原型链
2.原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链

55、事件、IE 与火狐的事件机制有什么区别? 如何阻止冒泡?

1.我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为
2.事件处理机制:IE 是事件冒泡、firefox 同时支持两种事件模型,也就是:捕获型事件和冒泡型事件
3.ev.stopPropagation();
注意旧 ie 的方法:ev.cancelBubble = true;

56、简述一下 Sass、Less,且说明区别?

他们是动态的样式语言,是 CSS 预处理器,CSS 上的一种抽象层。他们是一种特殊的语法/语言而编译成 CSS。
变量符不一样,less 是@,而 Sass 是$;
Sass 支持条件语句,可以使用 if{}else{},for{}循环等等。而 Less 不支持;
Sass 是基于 Ruby 的,是在服务端处理的,而 Less 是需要引入 less.js 来处理 Less 代码输

出 Css 到浏览器

57、关于 javascript 中 apply()和 call()方法的区别?

相同点:两个方法产生的作用是完全一样的不同点:方法传递的参数不同Object.call(this,obj1,obj2,obj3) Object.apply(this,arguments)
apply()接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。call()方法第一个参数与 apply()方法相同,但传递给函数的参数必须列举出来。

58、简述一下 JS 中的闭包?

闭包用的多的两个作用:读取函数内部的变量值;让这些变量值始终保存着(在内存中)。 同时需要注意的是:闭包慎用,不滥用,不乱用,由于函数内部的变量都被保存在内存中, 会导致内存消耗大。

59、说说你对 this 的理解?

在 JavaScript 中,this 通常指向的是我们正在执行的函数本身,或者是,指向该函数所属的对象。
全局的 this → 指向的是 Window
函数中的 this → 指向的是函数所在的对象 错误答案对象中的 this → 指向其本身
事件中 this → 指向事件对象

60、分别阐述 split(),slice(),splice(),join()?

join()用于把数组中的所有元素拼接起来放入一个字符串。所带的参数为分割字符串的分隔 符,默认是以逗号分开。归属于 Array
split()即把字符串分离开,以数组方式存储。归属于 Stringstring
slice() 方法可从已有的数组中返回选定的元素。该方法并不会修改数组,而是返回一个子数组。如果想删除数组中的一段元素,应该使用方法 Array.splice()
splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。返回的是含有被删除的元素的数组。

61、事件委托是什么?

让利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!

62、如何阻止事件冒泡和默认事件?

阻止浏览器的默认行为window.event?window.event.returnValue=false:e.preventDefault(); 停止事件冒泡window.event?window.event.cancelBubble=true:e.stopPropagation();
原生JavaScript 中,return false;只阻止默认行为,不阻止冒泡,jQuery 中的return false;既阻止默认行为,又阻止冒泡

63、添加 删除 替换 插入到某个接点的方法?

obj.appendChidl() obj.removeChild() obj.replaceChild() obj.innersetBefore()

64、你用过 require.js 吗?它有什么特性?

(1)实现 js 文件的异步加载,避免网页失去响应;
(2)管理模块之间的依赖性,便于代码的编写和维护。

65、谈一下 JS 中的递归函数,并且用递归简单实现阶乘?

递归即是程序在执行过程中不断调用自身的编程技巧,当然也必须要有一个明确的结束条 件,不然就会陷入死循环。

66、请用正则表达式写一个简单的邮箱验证。

/3+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$/;

67、简述一下你对 web 性能优化的方案?

1、尽量减少 HTTP 请求
2、使用浏览器缓存
3、使用压缩组件
4、图片、JS 的预载入
5、将脚本放在底部
6、将样式文件放在页面顶部
7、使用外部的 JS 和 CSS
8、精简代码

68、在 JS 中有哪些会被隐式转换为 false

Undefined、null、布尔值 false、NaN、零、空字符串

69 、定时器 setInterval 有一个有名函数 fn1 , setInterval( fn1,500 ) 与setInterval(fn1(),500)有什么区别?

第一个是重复执行每 500 毫秒执行一次,后面一个只执行一次。

70、外部 JS 文件出现中文字符,会出现什么问题,怎么解决?

会出现乱码,加 charset=”GB2312”;
另一种解决方式:网页文件和外部 JS 文件都是 UTF8 编码

71、谈谈浏览器的内核,并且说一下什么是内核?

Trident (['traɪd(ə)nt])–IE , Gecko (['gekəʊ])–Firefox, Presto (['prestəʊ])–opera,webkit—谷歌和 Safari
浏览器内核又可以分成两部分:渲染引擎和 JS 引擎。它负责取得网页的内容(HTML、XML、图像等等)、整理讯息(例如加入 CSS 等),以及计算网页的显示方式,然后会输出至显示器或打印机。JS 引擎则是解析 Javascript 语言,执行 javascript 语言来实现网页的动态效果。

72、JavaScript 原型,原型链 ? 有什么特点?

*原型对象也是普通的对象,是对象一个自带隐式的 proto 属性,原型也有可能有自己的原型,如果一个原型对象的原型不为 null 的话,我们就称之为原型链。
*原型链是由一些用来继承和共享属性的对象组成的(有限的)对象链。
*JavaScript 的数据对象有那些属性值? writable:这个属性的值是否可以改。
configurable:这个属性的配置是否可以删除,修改。
enumerable:这个属性是否能在for…in 循环中遍历出来或在Object.keys 中列举出来。 value:属性值。
*当我们需要一个属性的时,Javascript 引擎会先看当前对象中是否有这个属性, 如果没有的话,就会查找他的 Prototype 对象是否有这个属性。
function clone(proto) { function Dummy() { } Dummy.prototype = proto;
Dummy.prototype.constructor = Dummy;

return new Dummy(); //等价于 Object.create(Person);
}
function object(old) { function F() {}; F.prototype = old; return new F();
}
var newObj = object(oldObject);

73、写一个通用的事件侦听器函数

`// event(事件)工具集,来源:github.com/markyun markyun.Event = {
// 页面加载完成后readyEvent : function(fn) {
if (fn==null) { fn=document;
}
var oldonload = window.onload;
if (typeof window.onload != ‘function’) { window.onload = fn;
} else {
window.onload = function() { oldonload();
fn();
};
}
},
// 视能力分别使用 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.removeEnentListener) {
element.removeEnentListener(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;
},
// 获取 event 对象的引用,取到事件的所有信息,确保随时能使用 event; getEvent : function(e) {
var ev = e || window.event;

if (!ev) {
var c = this.getEvent.caller; while © {
ev = c.arguments[0];
if (ev && Event == ev.constructor) { break;
}
c = c.caller;
}
}
return ev;
}
};

74、事件、IE 与火狐的事件机制有什么区别? 如何阻止冒泡?

1.我们在网页中的某个操作(有的操作对应多个事件)。例如:当我们点击一个按钮就会 产生一个事件。是可以被 JavaScript 侦测到的行为。
2.事件处理机制:IE 是事件冒泡、火狐是 事件捕获;
3.ev.stopPropagation();

75、什么是闭包(closure),为什么要用?

执行 say667()后,say667()闭包内部变量会存在,而闭包内部函数的内部变量不会存在.使得 Javascript 的垃圾回收机制 GC 不会收回 say667()所占用的资源,因为 say667()的内部函数的执行需要依赖 say667()中的变量。这是对闭包作用的非常直白的描述.
function say667() {
// Local variable that ends up within closure var num = 666;
var sayAlert = function() { alert(num); } num++;
return sayAlert;
}
var sayAlert = say667(); sayAlert()//执行结果应该弹出的 667

76、如何判断一个对象是否属于某个类?

使用 instanceof (待完善) if(a instanceof Person){

alert(‘yes’);
}

77、new 操作符具体干了什么呢?

1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。var obj = {};
obj. proto = Base.prototype; Base.call(obj);

78、JSON 的了解

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于 JavaScript 的一个子集。数据格式简单, 易于读写, 占用带宽小
{‘age’:‘12’, ‘name’:‘back’}

79、js 延迟加载的方式有哪些

defer 和 async、动态创建 DOM 方式(用得最多)、按需异步载入 js

80、模块化怎么做?

立即执行函数,不暴露私有成员
1、 使用字面量实现命名空间(YUI): Itcast.common.dom={}; Itcast.common.css={}; Itcast.common.event={};
2、使用闭包
var module1 = (function(){ var _count = 0;
var m1 = function(){
//…
};
var m2 = function(){
//…
};
return {

m1 : m1, m2 : m2
};
})();

81、异步加载的方式

(1)defer,只支持 IE
(2)async:
(3)创建 script,插入到 DOM 中,加载完毕后 callBack documen.write 和 innerHTML 的区别document.write 只能重绘整个页面
innerHTML 可以重绘页面的一部分

82、告诉我答案是多少?

(function(x){
delete x; alert(x);
})(1+5);
函数参数无法 delete 删除,delete 只能删除通过 for in 访问的属性。当然,删除失败也不会报错,所以代码运行会弹出“1”。

83、JS 中的 call()和 apply()方法的区别?

例子中用 add 来替换 sub,add.call(sub,3,1) == add(3,1) ,所以运行结果为:alert(4); 注意:js 中的函数其实是对象,函数名是对 Function 对象的引用。
function add(a,b){ alert(a+b);
}
function sub(a,b){ alert(a-b);
}
add.call(sub,3,1);

84、Jquery 与 jQuery UI 有啥区别?

*jQuery 是一个 js 库,主要提供的功能是选择器,属性修改和事件绑定等等。
*jQuery UI 则是在 jQuery 的基础上,利用 jQuery 的扩展性,设计的插件。提供了一些常用的界面元素,诸如对话框、拖动行为、改变大小行为等等

85、jquery 中如何将数组转化为 json 字符串,然后再转化回来?

jQuery 中没有提供这个功能,所以你需要先编写两个 jQuery 的扩展:
.fn.stringifyArray=function(array)returnJSON.stringify(array).fn.stringifyArray = function(array) { return JSON.stringify(array) } .fn.parseArray = function(array) { return JSON.parse(array)
}
然后调用:
$(“”).stringifyArray(array)

总结

=============================================================

从转行到现在,差不多两年的时间,虽不能和大佬相比,但也是学了很多东西。我个人在学习的过程中,习惯简单做做笔记,方便自己复习的时候能够快速理解,现在将自己的笔记分享出来,和大家共同学习。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

个人将这段时间所学的知识,分为三个阶段:

第一阶段:HTML&CSS&JavaScript基础

第二阶段:移动端开发技术

第三阶段:前端常用框架

  • 推荐学习方式:针对某个知识点,可以先简单过一下我的笔记,如果理解,那是最好,可以帮助快速解决问题;如果因为我的笔记太过简陋不理解,可以关注我以后我还会继续分享。

  • 大厂的面试难在,针对一个基础知识点,比如JS的事件循环机制,不会上来就问概念,而是换个角度,从题目入手,看你是否真正掌握。所以对于概念的理解真的很重要。