Tip:Js面试题,不定期更新。
当前题数:40道
JS基础篇
1、javascript的typeof返回哪些数据类型
object number function boolean underfind string
1 | typeof null;//object |
2、例举3种强制类型转换和2种隐式类型转换?
强制(parseInt,parseFloat,Number())
隐式(==)
1==”1”//true
null==undefined//true
3、split() /join() 的区别
前者是切割成数组的形式,
后者是将数组转换成字符串
4、数组方法pop() /push() /unshift() /shift()
Push()尾部添加 pop()尾部删除
Unshift()头部添加 shift()头部删除
5、事件绑定和普通事件有什么区别
传统事件绑定和符合W3C标准的事件绑定有什么区别?
普通事件:div1.onclick=function(){}
;
<button onmouseover=""></button>
1、如果说给同一个元素绑定了两次或者多次相同类型的事件,那么后面的绑定会覆盖前面的绑定
2、不支持DOM事件流 事件捕获阶段è目标元素阶段=>事件冒泡阶段
事件绑定:addEventListener
1、 如果说给同一个元素绑定了两次或者多次相同类型的事件,所以的绑定将会依次触发
2、 支持DOM事件流的
3、 进行事件绑定传参不需要on前端
addEventListener(“click”,function(){},true);
//此时的事件就是在事件冒泡阶段执行
ie9开始,ie11 edge:addEventListener
ie9以前:attachEvent/detachEvent
1、 进行事件类型传参需要带上on前缀
2、 这种方式只支持事件冒泡,不支持事件捕获
事件绑定是指把事件注册到具体的元素之上,普通事件指的是可以用来注册的事件
普通添加事件的方法不支持添加多个事件,最下面的事件会覆盖上面的,不支持事件冒泡
而事件绑定(addEventListener)方式添加事件可以添加多个,支持事件冒泡
6、IE和DOM事件流的区别
1.执行顺序不一样、
2.参数不一样
3.事件加不加on
4.this指向问题
IE9以前:attachEvent(“onclick”)、detachEvent(“onclick”)
IE9开始跟DOM事件流是一样的,都是addEventListener
7、IE和标准下有哪些兼容性的写法
1 | var ev = ev || window.event |
8、call和apply的区别
call和apply相同点:
都是为了用一个本不属于一个对象的方法,让这个对象去执行
1 | toString.call([],1,2,3) |
9、b继承a的方法
考点:继承的多种方式
1 | function b(){} |
10、JavaScript this指针、闭包、作用域
this:指向调用上下文
闭包:内层作用域可以访问外层作用域的变量
作用域:定义一个函数就开辟了一个局部作用域,整个js执行环境有一个全局作用域
11、事件委托是什么
符合W3C标准的事件绑定addEventLisntener /attachEvent
让利用事件冒泡的原理,让自己的所触发的事件,让他的父元素代替执行!
12、闭包是什么,有什么特性,对页面有什么影响
闭包就是能够读取其他函数内部变量的函数。
闭包的缺点:滥用闭包函数会造成内存泄露,因为闭包中引用到的包裹函数中定义的变量都永远不会被释放,所以我们应该在必要的时候,及时释放这个闭包函数
13、如何阻止事件冒泡和默认事件
1 | e. stopPropagation();//标准浏览器 |
14、添加 删除 替换 插入到某个接点的方法
1 | obj.appendChild() |
15、javascript的本地对象,内置对象和宿主对象
本地对象为array obj regexp等可以new实例化
内置对象为gload Math 等不可以实例化的
宿主为浏览器自带的document,window 等
16、document load 和document ready的区别
Document.onload 是在结构和样式加载完才执行js
window.onload:不仅仅要在结构和样式加载完,还要执行完所有的样式、图片这些资源文件,全部加载完才会触发window.onload事件
Document.ready原生种没有这个方法,jquery中有 $().ready(function)
17、==
和===
的不同
前者会自动转换类型
后者不会
1==”1”
null==undefined
===先判断左右两边的数据类型,如果数据类型不一致,直接返回false
之后才会进行两边值的判断
18、javascript的同源策略
一段脚本只能读取来自于同一来源的窗口和文档的属性,这里的同一来源指的是主机名、协议和端口号的组合
http,ftp:协议
主机名;localhost
端口名:80:http协议的默认端口
https:默认端口是8083
同源策略带来的麻烦:ajax在不同域名下的请求无法实现,
如果说想要请求其他来源的js文件,或者json数据,那么可以通过jsonp来解决
19、编写一个数组去重的方法
var arr=[1,1,3,4,2,4,7];
=>[1,3,4,2,7]
一个比较简单的实现就是:
1、 先创建一个空数组,用来保存最终的结果
2、 循环原数组中的每个元素
3、 再对每个元素进行二次循环,判断是否有与之相同的元素,如果没有,将把这个元素放到新数组中
4、 返回这个新数组
1 | function oSort(arr) { |
20、JavaScript是一门什么样的语言,它有哪些特点?
没有标准答案。
运行环境:浏览器中的JS引擎(v8.。。)
语言特性:面向对象,动态语言:
1 | //动态语言的特性 |
21、JavaScript的数据类型都有什么?
基本数据类型:String,Boolean,number,undefined,object,Null
引用数据类型:Object(Array,Date,RegExp,Function)
那么问题来了,如何判断某变量是否为数组数据类型?
方法一.判断其是否具有“数组性质”,如slice()方法。可自己给该变量定义slice方法,故有时会失效
方法二.obj instanceof Array 在某些IE版本中不正确
方法三.方法一二皆有漏洞,在ECMA Script5中定义了新方法Array.isArray(), 保证其兼容性,最好的方法如下:
toString.call(18);//”[object Number]”
toString.call(“”);//”[object String]”
解析这种简单的数据类型直接通过typeof就可以直接判断[张曼莉1]
toString.call常用于判断数组、正则这些复杂类型
toString.call(/[0-9]{10}/)//”[object RegExp]”
1 | if(typeof Array.isArray==="undefined"){ |
22、已知ID的Input输入框,希望获取这个输入框的输入值,怎么做?(原生)
document.getElementById(“ID”).value
23、希望获取到页面中所有的checkbox怎么做?(原生)
1 | var domList = document.getElementsByTagName(‘input’) |
24、设置一个已知ID的DIV的html内容为xxxx,字体颜色设置为黑色
1 | var dom = document.getElementById(“ID”); |
25、当一个DOM节点被点击时候,我们希望能够执行一个函数,应该怎么做?
直接在DOM里绑定事件:<div onclick="test()"></div>
在JS里通过onclick绑定:xxx.onclick = test
通过事件添加进行绑定:addEventListener(xxx, ‘click’, test)
那么问题来了,Javascript的事件流模型都有什么?
“事件冒泡”:事件开始由最具体的元素接受,然后逐级向上传播
“事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的
“DOM事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡
26、看下列代码输出为何?解释原因。
1 | var a; |
解释:Undefined是一个只有一个值的数据类型,这个值就是“undefined”,在使用var声明变量但并未对其赋值进行初始化时,这个变量的值就是undefined。而b由于未声明将报错。注意未申明的变量和声明了未赋值的是不一样的。
undefined会在以下三种情况下产生:
1、 一个变量定义了却没有被赋值
2、 想要获取一个对象上不存在的属性或者方法:
3、 一个数组中没有被赋值的元素
注意区分undefined跟not defnied(语法错误)是不一样的
27、看下列代码,输出什么?解释原因。
1 | var a = null; |
解释:null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以用typeof检测会返回”object”。
28、看下列代码,输出什么?解释原因。
1 | var undefined;//此时undefined这个变量的值是undefined |
· undefined与null相等,但不恒等(===)
一个是number一个是string时,会尝试将string转换为number
尝试将boolean转换为number,0或1
尝试将Object转换成number或string,取决于另外一个对比量的类型
所以,对于0、空字符串的判断,建议使用 “===
” 。“===
”会先判断两边的值类型,类型不匹配时为false。
那么问题来了,看下面的代码,输出什么,foo的值为什么?
1 | var foo = "11"+2-"1"; |
执行完后foo的值为111,foo的类型为number。
29、看代码给答案。
1 | var a = new Object(); |
答案:2(考察引用数据类型细节)
30、已知数组
已知数组var stringArray = [“This”, “is”, “Baidu”, “Campus”],Alert出”This is Baidu Campus”。
答案:alert(stringArray.join(“ ”))
已知有字符串foo=”get-element-by-id”,写一个function将其转化成驼峰表示法”getElementById”。
1 | function combo(msg){ |
(考察基础API)
31、var numberArray = [3,6,2,4,1,5]; (考察基础API)
- 实现对该数组的倒排,输出[5,1,4,2,6,3]
- 实现对该数组的降序排列,输出[6,5,4,3,2,1]
1 | function combo(msg){ |
32、输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26
1 | var d = new Date(); // 获取年,getFullYear()返回4位的数字 |
33、将字符串
”<tr><td>{$id}</td><td>{$name}</td></tr>
”
中的{$id}
替换成10,{$name}
替换成Tony (使用正则表达式)
答案:”<tr><td>{$id}</td><td>{$id}_{$name}</td></tr>”.replace(/{\$id}/g, ’10′).replace(/{\$name}/g, ‘Tony’)
;
34、字符转义
为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,请写一个函数escapeHtml,将<, >, &, “
进行转义
1 | function escapeHtml(str) { //[<>”&]:中括号中字符只要其中的一个出现就代表满足条件 //给replace第二个参数传递一个回调函数,回调函数中参数就是匹配结果,如果匹配不到就是null |
35、foo = foo||bar ,这行代码是什么意思?为什么要这样写?
这种写法称之为短路表达式
答案:if(!foo) foo = bar; //如果foo存在,值不变,否则把bar的值赋给foo。
短路表达式:作为”&&”和”||”操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值。
注意if条件的真假判定,记住以下是false的情况:
空字符串、false、undefined、null、0
36、看下列代码,将会输出什么?(变量声明提升)
1 | var foo = 1; |
答案:输出undefined 和 2。上面代码相当于:
1 | var foo = 1; |
函数声明与变量声明会被JavaScript引擎隐式地提升到当前作用域的顶部,但是只提升名称不会提升赋值部分。
37、用js实现随机选取10–100之间的10个数字,存入一个数组,并排序。
1 | var iArray = []; |
38、把两个数组合并,并删除第二个元素。
1 | var array1 = ['a','b','c']; |
39、怎样添加、移除、移动、复制、创建和查找节点(原生JS,实在基础,没细写每一步)
1)创建新节点
createDocumentFragment() //创建一个DOM片段
createElement() //创建一个具体的元素
createTextNode() //创建一个文本节点
2)添加、移除、替换、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替换
insertBefore() //插入
3)查找
getElementsByTagName() //通过标签名称
getElementsByName() //通过元素的Name属性的值
getElementById() //通过元素Id,唯一性
40、URL处理
有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e
请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中,如{a:’1′, b:’2′, c:”, d:’xxx’, e:undefined}。
答案:
1 | var url = 'http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e'; |
Tips: Please indicate the source and original author when reprinting or quoting this article.