1.JavaScript是一门什么样的语言,它有哪些特点?

没有标准答案。

2.JavaScript的数据类型都有什么?

基本数据类型:String,boolean,Number,Undefined

引用数据类型:Object(Array,Date,RegExp,Function,Null)

那么问题来了,如何判断某变量是否为数组数据类型?

  • 方法一.判断其是否具有“数组性质”,如slice()方法。可自己给该变量定义slice方法,故有时会失效
  • 方法二.obj instanceof Array 在某些IE版本中不正确
  • 方法三.方法一二皆有漏洞,在ECMA Script5中定义了新方法Array.isArray(), 保证其兼容性,最好的方法如下:  
if(typeof Array.isArray==="undefined")
{
Array.isArray = function(arg){
return Object.prototype.toString.call(arg)==="[object Array]"
};
}

3.已知ID的Input输入框,希望改变文本框的背景颜色,怎么做?(原生JS)

document.getElementById("id").style.backgroundColor = "red";

4.希望获取到页面中所有的checkbox怎么做?(原生JS)

var domList = document.getElementsByTagName(‘input’)
var checkBoxList = [];
var len = domList.length;  //缓存到局部变量
while (len--) {  //使用while的效率会比for循环更高
  if (domList[len].type == ‘checkbox’) {
  checkBoxList.push(domList[len]);
  }
}

5.Html事件绑定有几种方式?

  • 直接在DOM里绑定事件:<div onclick=”test()”></div> 这种方式称为原生事件或者属性事件
  • 在JS里通过onclick绑定:xxx.onclick = test
  • Dom标准通过事件添加进行绑定:addEventListener("click",test, false) //第三个参数为是否支持事件捕捉
  • IE事件:attachEvent("onclick",test)

那么问题来了,Javascript的事件流模型都有什么?

  • “事件捕捉”:事件由最不具体的节点先接收,然后逐级向下,一直到最具体的
  • 目标事件
  • “事件冒泡”:事件开始由最具体的元素接受,然后逐级向上传播
  • “DOM事件流”:三个阶段:事件捕捉,目标阶段,事件冒泡
  • 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;
}
}

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

var a=1;
function a(){}
alert(a);//打印1

上面的代码经过变量提升后,等价于下面的代码

var a;function a(){}
a = 1;//只把声明提到最前面,赋值a=1;保留,函数声明也会提到最前面
alert(a);//打印

再看下面的输出结果:

var a=1;
var a=function (){}
alert(a);//打印a函数

此时打印a函数,不会打印1,因为下面是一个函数表达式,跟变量声明一样,只会把var a;提升到最前面,a=function(){}保留,会覆盖前面的a=1;因此打印函数。

此题目,我再百度面试的时候问到过。

7.掌握样式的优先级。
!important > style(内联) > Id(权重100) > class(权重10) > 标签(权重1) 同类别的样式,后面的会覆盖前面的。
百度视频部门一道面试题是这样的:

<style>
.red{color:red;}
.blue{color:blue;}
</style> <p class="blue red"></p>
<!-- 此时显示蓝色,样式的显示跟class里面的先后顺序无关,都是类选择器,后面的会覆盖前面的,因此蓝色覆盖红色的 -->

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

1)创建新节点

createDocumentFragment()    //创建一个DOM片段

createElement()   //创建一个具体的元素

createTextNode()   //创建一个文本节点

2)添加、移除、替换、插入

appendChild()      //添加

removeChild()      //移除

replaceChild()      //替换

insertBefore()      //插入

3)查找

getElementsByTagName()    //通过标签名称

getElementsByName()     //通过元素的Name属性的值

getElementById()        //通过元素Id,唯一性

9.用js写一个正则匹配标签中是否包含一个class(百度面试题)

function hasClassName(id,name){
var cls = document.getElementById(id).className;
var reg = new RegExp("(^|\\s)"+name+"($|\\s)","g")
return reg.test(cls);
}
//正则的意思是:以名字开头或者以空格开头,最终以名字结束或者以空格结束。

10.事件循环绑定,输出结果(考察闭包)

var list = document.getElementsByTagName("a");//假设有10个a
for(var i=0;i<list.length;i++){
list[i].onclick = function(i){
return function(){
alert(i);
}
}
}
//最终点击的时候,都打印10

通过闭包封装后的代码:

var list = document.getElementsByTagName("a");
for(var i=0;i<list.length;i++){
list[i].onclick = (function(i){
return function(){
alert(i);
}
})(i)
}
//打印对应的索引

闭包我所知道的两个作用:

a.通过闭包可以把局部变量传递出来,就是通过闭包可以访问函数内部的变量,比如下面的代码:

function count(){
var num = 1;
return function(){ return num++;
} }
var countFn = count();
countFn();//输出1
countFn();//输出2
countFn();//输出3
countFn();//输出4

通过闭包就可以访问函数内部的局部变量,并且实现数量累加。

b.使用闭包可以避免空间污染,闭包内部的变量都只能在内部使用,这样有效避免和外部变量的混淆。(个人理解)

11.js数组去重。

var arr = [1,6,3,9,4,9,3,8,2];
var obj = {},newArr = [];
function delRepeat(){
for(var i=0,j=arr.length;i<j;i++){
if(!obj[arr[i]]){
newArr.push(arr[i]);
obj[arr[i]] = arr[i];
}
}
} delRepeat();//删掉重复项
newArr//打印新数组

12.两个div标签,如何控制标签左边固定,右边自适应,左边div标签的宽度为100px(滴滴面试题)

//a. 左边左浮动,右边加个overflow:hidden;
#lt{ float: left;width:100px; background: #ff0;}
#rt{ overflow: hidden; background: #f0f;}
//b.左边左浮动,右边加个margin-left;
#lt{ float: left; width:100px; background: #ff0;} //以上两种方式都可以实现

滴滴面试起初问我,现在有并排的三个Div框,如何实现三个div都自适应,我当时就懵了,这个考察的是display:table的使用

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>等高布局</title>
<style>
html {
font-size: 10px;;
}
body {
font-size: 1.4rem;
}
.box {
background-color: rgba(200,200,200,0.7);
margin: 0 1rem;
width: 33.33%;
padding: 1rem;
}
.box:nth-child(2) {
height: 5rem;
background-color: rgba(200,210,230,0.7);
}
.accordant {
display: table-row;
}
.table {
width: 100%;
display: table;
}
.table .accordant {
display: table-row;
}
.table .accordant .box {
display: table-cell;
vertical-align: middle;
text-align: center;
}
</style>
</head>
<body>
<div class="table">
<div class="accordant">
<div class="box">
<p>这是一个 Figure</p>
</div>
<div class="box">
<p>这是一个 Figure</p>
</div>
<div class="box">
<p>这是一个 Figure</p>
</div>
</div>
</div>
</body>
</html>

13.实现一个函数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;
} //方法二:
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;
}
}

14.继承的使用

function Animal(name) {
this.name = name;
this.showName = function() {
console.log(this.name);
};
}
//第一种继承方式
function Cat(name) {
Animal.call(this, name);//此处注意,call不能继承对象原型上的方法
}
//第二种继承方式
Cat.prototype = new Animal();//继承所有属性和方法 function Dog(name) {
Animal.apply(this, name);//同Call一样
}
Dog.prototype = new Animal();

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

if(window.addEventListener){
var addListener = function(el,type,listener,useCapture){
el.addEventListener(type,listener,useCapture);
};
}
else if(document.all){
var 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.attachEvent('on' + type, handler);
  }else{
   elem['on' + type] = handler;
}
}

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

var User = {
count: 1, getCount: function() {
return this.count;
}
}; console.log(User.getCount()); // var func = User.getCount;
console.log(func()); // undefined

 

2016年BAT公司常见的Web前端面试题整理的更多相关文章

  1. 【web前端面试题整理02】前端面试题第二弹袭来,接招!

    前言 今天本来准备先了解下node.js的,但是,看看我们一个小时前与一个小时后的差距: 既然如此,我们继续来搜集我们的前端面试题大业吧!!! 特别感谢玉面小肥鱼提供哟,@玉面小飞鱼 题目一览 Jav ...

  2. 【web前端面试题整理06】成都第一弹,邂逅聚美优品

    前言 上周四回了成都,休息了一下下,工作问题还是需要解决的,于是今天去面试了一下,现在面试回来了,我感觉还是可以整理一下心得. 这个面试题整理系列是为了以后前端方面的兄弟面试时候可以得到一点点帮助,因 ...

  3. 【web前端面试题整理08】说说最近几次面试(水)

    为什么换工作 换工作简单来讲一般会归纳为钱不够或者人不对,我们团队氛围很不错,所以基本就定位到钱不够了,而我更多是考虑到以后的职业发展,简单说来就是对以后几年的工作有想法,而这种想法实现不一定能在现在 ...

  4. 【web前端面试题整理04】阿里一行之大神面对面

    前言 这段时间我在河南一家公司当了一段时间的前端主管,最后可耻的匿了,原因各种各样,最主要的就是不想呆在郑州了. 其实这里的同事还是很不错的,面对老总最后的挽留我不是没有动心,而是这个地方确实不太好, ...

  5. Web 前端面试题整理(不定时更新)

    重要知识需要系统学习.透彻学习,形成自己的知识链.万不可投机取巧,临时抱佛脚只求面试侥幸混过关是错误的! 面试有几点需注意: 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增 ...

  6. 【web前端面试题整理05】做几道前端面试题休息休息吧

    前言 连续学了两天javascript的东西了,我们都累了,于是今天还是上一套面试题吧,大家一起休息休息,也为下个星期可能会有的面试准备下. 题目一览 CSS1.  overflow-x  属于 CS ...

  7. 【web前端面试题整理03】来看一点CSS相关的吧

    前言 昨天我们整理了14到js的题,今天我们再来整理14到CSS相关的题目,昨天整理时候时间有点晚了我便有点心浮气躁,里面的一些题需要再次解答,好了看看今天有些什么吧. PS:我这里挑一点来做就好了, ...

  8. 【web前端面试题整理07】我不理解表现与数据分离。。。

    拜师传说 今天老夫拜师了,老夫有幸认识一个JS高手,在此推荐其博客,悄悄告诉你,我拜他为师了,他承诺我只收我一个男弟子..... 师尊刚注册的账号,现在博客数量还不多,但是后面点会有干货哦,值得期待. ...

  9. 【web前端面试题整理01】各位加班累了吧,来做点前端面试题吧

    前言 最近小叶子有点疲惫,主要是在外地工作生活上不太适应,吃一样的东西,我居然会拉肚子,而且是一个星期一个星期的.... 脸上长了一个豆豆一个星期还没消,我那个去啊. 昨天上午上班后,本来想继续研究j ...

随机推荐

  1. HTML中的table布局

    <table width="100" height="50" border="1" bgcolor="blue"& ...

  2. fastlane安装流程和fastlane match同步证书和PP文件方法

    分步指南 安装fastlane:  ① Make sure you have the latest version of the Xcode command line tools installed: ...

  3. 深入React组件生命周期

    上篇博文使用React开发的一些注意要点对React开发的一些重点进行了简单的罗列总结,虽然也提到了React生命周期,但只略微小结,在此单独写篇React生命周期的总结. 在组件的整个生命周期中,随 ...

  4. CSS前端开发学习总结、一

    1. 属性选择器: 2. CSS伪类选择器: 3. CSS伪元素: 4. CSS优先级: 5. 行内标签: 6. 块级标签: 7. Display: 8. Line-height:行高 9. text ...

  5. Unity无缝循环世界实现

    一年前曾经碰到过已无限世界为题材的游戏开发比赛,虽然对比赛没有兴趣,但是对这个题材倒是有点想法.如何通过unity3d实现无缝的循环世界呢. 有一种想法是动态生成,一块场景一块场景进行动态加载.(做过 ...

  6. 学习Redux之分析Redux核心代码分析

    1. React,Flux简单介绍 学习React我们知道,React自带View和Controller库,因此,实现过程中不需要其他任何库,也可以独立开发应用.但是,随着应用程序规模的增大,其需要控 ...

  7. 如何把phpStorm打造成自己的专属IDE

    1.如何设置phpStorm的默认编码,例如UTF-8?phpStorm的编码分为IDE Encoding 和Project Encoding,设置方法是打开File->Setting-> ...

  8. response.getWriter().write()与out.print()的区别(转)

    1.首先介绍write()和print()方法的区别:  (1).write():仅支持输出字符类型数据,字符.字符数组.字符串等  (2).print():可以将各种类型(包括Object)的数据通 ...

  9. file_get_contents和curl对于post方式的解决办法

    post方式解决办法 其实很简单,我们只要仔细看看就知道了... file_get_contents: $content=$_POST['content'];$access_token=$_POST[ ...

  10. [原]C#与非托管——初体验

    P/Invokes初看起来非常简单,利用DllImport进行extern函数的声明,程序就可以在调用extern函数的时候自动查询调用到对应的非托管函数,有些类似Java的native函数,但更为简 ...