JavaScript 练习题
1. 谈一谈闭包,闭包里的this指向谁?为什么使用它?什么时候闭包中的参数会销毁、什么时候不会?
闭包是可以访问自身所在作用域的函数能在自身所在作用域之外调用;
this指向window;
闭包的优点:扩展变量或函数的作用域,使外部可以访问内部;
避免了变量污染(变量名冲突);
合理使用可以节约内存;
闭包调用结束时参数销毁;
闭包还有被调用不会销毁;
2. jQuery中怎么创建,插入,删除?(就是操作dom)
$("标签名")创建;
prepend()往前面插入;
after()往后面插入
remove删除;
3. 原生JS中怎么创建,插入,删除?(就是操作dom)
createElement()创建节点;
createAttribute()创建属性
createTextNode()创建文本节点
removeChild(删除的节点);
insertBefore(新节点,旧节点)
4. JS查找DOM节点的方法?对应的Jq写法?
JS:
firstChild:第一个节点
lastChild:第二个节点
nextSibling:下一个兄弟节点
previousSibling:上一个兄弟节点
parentNode:父节点
childNodes:所有子节点
jQuery:
first(); 获取匹配的第一个元素
last(); 获取匹配的最后个元素
not( ); 删除与指定表达式匹配的元素
next();找到每个段落的后面紧邻的同辈元素。
nextAll( );查找当前元素之后所有的同辈元素。
siblings(); 用于筛选同辈元素的表达式
prev();用于筛选前一个同辈元素的表达式
prevAll( );查找当前元素之前所有的同辈元素
5. 如何阻止事件冒泡的默认事件?
IE:cancleBubble=true;(属性);
DOM:stopPrcpagation(方法);
6. 事件委托的原理
子集把需要处理的事件通过冒泡交给父集统一处理
7. js里的null和undefined的区别
null:不存在的变量;
undefined:存在变量未赋值;
8. 简单描述js中的prototype的含义和用法
每一个函数都有一个prototype的属性称为原型;
原型也是一个对象又有一个consstractor的函数;
9. setTimeout和setInterval方法的区别
setTimeout:等多久之后执行,只执行一次;
setInterval:每隔多长时间执行一次;
10. js中eval函数的功能
把字符串转换为可运行的JS代码;
11. 列举Jq中的提高性能的方案?
(1)总是从ID选择器开始继承;
(2)尽量在class前加上元素名;
(3)尽量用ID选择器代替class;
(4)在适当的时候选择JQuery的链式操作;
(5)将JQuery给一个变量使用的变量前加$;
(6)限制直接操作DOM的次数;
(7)尽量使用事件委托;
(8)js代码尽量推迟到windo.onload事件执行;
(9)使用事件委托尽量使用delegate代替live;
(10)能用子代选择器就不要用后代选择器;
12. JavaScript中的基本数据类型有哪些?引用数据类型有哪些
基本数据类型:string null undfind number symbol boolean
引用数据类型:object:
13. 简述同步和异步的区别?
同步:依次执行代码;
异步:同时执行代码;
14. JavaScript中callee和caller的作用
aller返回一个函数的引用,这个函数调用了当前的函数;
callee返回正在执行的函数本身的引用,它是arguments的一个属性
15. JS有哪些内置的对象
math Json Global
16. 谈谈你对this对象的理解
this表示当前对象,this的指向是根据调用的上下文来决定的,默认指向window对象,指向window对象时可以省略不写
17. 什么是json?
(1)JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
(2)JSON 是轻量级的文本数据交换格式
(3)JSON 独立于语言
(4)JSON 具有自我描述性,更易理解
18. call()和apply()的区别?bind()的作用,他们的第一个参数是什么?
apply()中的参数写在[]里
bind()调用后只改变指向不调用函数;
第一个参数是改变后this的指向
19. 说说JavaScript的原型和原型链?
首先prototype是一个属性,同时它本身也是一个对象。javascript中所有的函数都有prototype这个属性,反过来所有具有prototype的对象本身也是一个函数。
20. 说明JavaScript中的作用域与变量提升
全局作用域可以在代码中的任何地方都能被访问
局部作用域一般只在固定的代码片段内可以访问得到
变量提升:变量提升,就是把变量提升到函数的顶部,需要注意的是,变量提升只是提升变量的声明,不会吧变量的值也提升上来
21. ECMAScript6的新特性
定义变量使用let
定义常量const
字符串的扩展
模块语法:"模块字符串"
22. JS如何实现继承?
1.原型链
基本思想:利用原型让一个引用类型继承另外一个引用类型的属性和方法。
构造函数,原型,实例之间的关系:每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
2.借用构造函数
基本思想:在子类型构造函数的内部调用超类构造函数,通过使用call()和apply()方法可以在新创建的对象上执行构造函数。
3.组合继承
基本思想:将原型链和借用构造函数的技术组合在一块,从而发挥两者之长的一种继承模式。
4.原型式继承
基本想法:借助原型可以基于已有的对象创建新对象,同时还不必须因此创建自定义的类型。
5.寄生式继承
基本思想:创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真正是它做了所有工作一样返回对象。
6.寄生组合式继承
基本思想:通过借用函数来继承属性,通过原型链的混成形式来继承方法
23. "use strict"是什么意思?使用它的好处和坏处?
严格模式:是ES5新增的js运行模式,使js在更严格、更规范化的模式下运行
好处:(1)消除JS这门语言本身存在的不合理、不严谨之处,使代码更规范,减少一些怪异行为
(2)在该模式下一些糟糕的特效会被禁用,如with,函数必须声明在顶层,arguments、callee不允许使用,
(3)消除一些代码不安全之处,eval()执行与正常模式下不同等
(4)提高编译器效率,增加运行速度,为未来新版本的js作铺垫
所以:"严格模式"体现了Javascript更合理、更安全、更严谨的发展方向. 为了达到更为普遍的兼容性, 我们应该总是在严格模式下编写代码.
坏处:(1)兼容性问题,IE6789均不支持
(2)团队合作问题,有些模块是正常模式,有些是严格模式,会出现问题,解决:统一规范模式,或将不同模块写入不同的立即执行函数,每个函数加上严格和非严格
24. css3的animate和jq的animate的区别
(1)css3的3D动画,JS模拟不了
(2)css3的2D转换,如translate\scale\rotate()\animation等,效率均高于js模拟
(3)其余常规属性,如width、height、opacity、color等,css3均低于js模拟,这里推荐js模拟
(4)css3的动画是利用C语言编写,是系统提供的方法,一般情况下效率高于Jq
25. arguments是什么怎样理解,他是什么?
(1)argument是js的一个内置对象
(2)每个函数都有arguments对象
(3)其表现是一个伪数组,以伪数组的形式保存函数的实参
26. JQuery绑定事件的方式,请说明他们的优缺点
(1)on ,推荐,因为其他三个都是调用on实现的
(2)bind,只能给当前元素绑定事件
(3)live,1.9已移除,解决bind的缺陷,可以给未来元素绑定事件,效率低,绑定在document上
(4)delegate 支持事件委托,支持给未来元素绑定事件,最接近on
27. 如何获取一个对象的所有属性值。
通过for in遍历对象 获得
28. 如何判断一个变量是属于哪种类型,有几种方式,区别是什么,各自怎么使用的。
(1)typeof
(2)intanceof
(3)Object.prototype.toString.call(), 调用顶层对象Object的toString方法,而不是每个对象自身的toString方法
29. 什么是回调函数(callback)
将函数作为参数传入另一个函数在另一个函数内调用;
30. JQuery中的attr和prop的区别
(1)特殊属性,在处理时,使用prop方法。
(2)一般属性,在处理时,使用attr方法。
31. 如何对数组进行排序
scort();
32. 列出数组对象方法,并描述功能,至少4个
push() 添加
pop()删除最后一个
shift()删除第一个
unshift()向开头添加一个或者多个
splice()删除并添加新的
join()将数组元素取出拼接成字符串
reverse()反转顺序
33. '=='和'===''
==进行比较时做隐式转换再比较值;
===进行比较时不做转换直接比较;
34. 什么是伪数组,如何将伪数组转换为真数组
具备数组的形式,已经length属性,但是不具备数组的其他方法
转为数组的方法:
(1)定义一个空数组,for循环伪数组,依次push到空数组
(2)Array.prototype.slice.call(伪数组),调用数组的slice方法
35. Document.write和innerHTML有什么区别?
链接:https://www.nowcoder.com/questionTerminal/2c5d8105b2694d85b06eff85e871cf50
来源:牛客网
document.write是直接写入到页面的内容流,如果在写之前没有调用document.open, 浏览器会自动调用open。
每次写完关闭之后重新调用该函数,会导致页面被重写。
innerHTML则是DOM页面元素的一个属性,代表该元素的html内容。
36. js堆、栈、队列分别是什么?
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。
栈又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作