前端面试题

210 阅读6分钟

HTML相关

1.HTML元素属性href和src的区别

  • href: link, a 1.超链接 2.建立通道 3.点击元素可以连接到目标资源
  • src: img, style, script, iframe 1.下载目标资源 2.替换当前元素 3.嵌入文档中

CSS相关

1.calc()应用场景

1.水平垂直居中 (支持不同单位混合计算)

img {
	height: 250px;
    width: 300px;
    padding-top: calc(50vh - height/2);
    padding-left: calc(50vw - width/2);
}
  1. 响应式开发布局,两列,三列布局
  2. 渐变色

2.CSS 过渡与动画的区别

  • trasition: 1.只有初始和结束两种状态 2.不能持续循环 3.易于结合js 4.需要:hover等方法触发 5.子属性少,动画简单
  • animation: 1.可以设置多个状态 2.可以添加infinite属性遍历循环,偏向纯css 4.js结合不友好 3.不需要触发,自动运行 5.子属性多,动画复杂

3.CSS等高布局

  1. table布局,内部元素设置display:table-cell。但是限制较多
  2. flexbox布局,display:flex,配套组建较多
  3. grid布局,display:grid; grid-auto-flow:column
  4. 较短的一列用padding-bottom:99999px撑开父元素,再用margin-bottom:-99999px拉回父元素,最后用overflow:hidden剪掉多余的地方。兼容性好

4.CSS Flexbox适用场景

1.水平垂直居中

<div>
	<img>
</div>
div {
    display: flex;
    justify-center: center; //主轴居中
    align-item: center; //垂轴居中
    flex-direction: column; //设置主轴
}

2.flex布局子元素可以用margin-left/right:auto来代替float

3.flex两栏布局

div.domain {
    display:flex; //父元素设置flex
    flex-wrap:wrap;宽度不足变为垂直方向两栏布局
}
div.main nav {
	flex: 0 0 300px; //放大 缩减 宽度
}
div.main div.content {
	flex: 1 0 0; //自动填满剩下的空间
}

4.圣杯布局

div.main {
	flex: 1;
}
div.left, div.right {
	flex: 0 0 50px;
}
div.left {
	order: -1;
}

5.CSS 不使用border创建边框

box-shadow: x轴偏移,y轴偏移,模糊度,扩散,颜色

box-shadow: 0 0 0 5px #fcf876
box-shadow: inset可以用于设置内边框

6.常用的隐藏方法

  • display: none
  • visibility: hidden
  • opacity: 0

7.CSS BFC

BFC不影响全局的布局,起到隔离保护作用

position:absolute或者fixed
float:不是none
overflow:不是visible
display:inline-block或者flex

8.[CSS伪类和伪元素的区别]

9.用CSS画三角形/原型

  • 三角形:用border,把其他三个设为transparent
  • 圆形:border-radius

10.CSS如何让超宽文本替换为省略号

单行省略分为四步:

1.设置宽度:witdh:80;

2.强制一行显示:white-space:nowrap;

3.隐藏溢出内容:overflow:hidden;

4.溢出进行省略:text-overflow:ellipsis;

11. 如何水平居中元素

普通流block:

  • text-align:center;
  • margin:0 auto;

浮动元素:

    width: 200px;
    position: relative
    left: 50%;
    transform: translateX(-50%);
    //margin-left: -100px;

绝对定位:

  • margin: 0 auto
  • left + transform

12.CSS清除浮动的多种方法

对元素进行浮动以后脱离了文档流,如果父元素没有高度,或者高度自适应就会造成浮动塌陷。

  • 在最底部新建一个block元素,并且设置clear:both来撑开父元素
  • 创建BFC:父级设置overflow:auto/hidden或者设置父级一起浮动
  • 伪元素:after设置为block元素,并且clear:both来清除浮动(最优解)

13.CSS外边距塌陷

1.只会发生在块级元素的垂直方向

  1. 外边距计算,两正取最大,两负取最小,一正一负取和

14.如何处理图片间的空隙

1.去除img元素间的空格 2.font-size:0 3.letter-spacing:-100px;

15.rem\em区别

rem是root em根据根元素的字体大小的相对大小元素

em是根据自己的font-size大小,如果自己没有font-size就向上找父级元素的font-size

JS相关

1.Javascript原型链

function Supermarket(){};
Supermarket.product = "口罩"function Shop(){};
Shop.prototype = new Supermarket();
// person.__proto__ === Shop.prototype;
var person = new Shop();
console.log(person.product);

2.Javascript原型对象

  • 基本类型:string, number, boolean, object, null, undifined
  • 引用类型:String, Number, Boolean, Object, Function, Array, Date, Error, RegExp

3.闭包

for (var i = 0; i < 5; i++) {
	(function(x){
    	setTimeout(function(){
        	console.log(x++);
        }, 4000);
    })(i);
}
//每次立即执行函数在传输完x的之后销毁执行上下文,后续任务队列里将用x进行计算

4.this关键字

  • 默认绑定:全局调用/没有指定调用者则默认为window
  • 隐式绑定:自动绑定调用自己的Object
  • 硬绑定:call/apply,指定this对象
  • 构造函数绑定:创造出的实例化对象指向构造函数对象
  • use district不会默认指向window,会指向unde fined

5.Javascript加法运算

88 + NaN = NaN
Infinity + -Infinity = NaN
Infinity + Infinity = Infinity
+0 + +0 = +0
-0 + -0 = -0
+0 + -0 = +0
"10" + 10.10 = 1010.1
"1" + 2 + 3 + 4 = "1234"
1 + 2 + 3 + "4" = "64" //从左到右计算
1 + (2 + "3") + 4 = "1234"//括号内优先运算
"1" + [] = "1"
"1" + ["123"] = "1123"
"1" + [2,3,4] = "12,3,4"
"1" + function uu(){} = "1function uu(){}"
"1" + {} = "1[object Object]"//Object会自动转化为[object Object]

6.函数/变量作用域(链)

  • 全局
  • 局部
  • 块级作用域

7.document.write()和element.innerHTML区别

8.运算符typeof和instanceof区别

  • typeof 检测数据类型并输出类型名字
  • instanceof 检测对象之间的关联性,左边必须是实例化对象

9.Javascript对调两个变量的数值

  • 设置临时变量
  • 加减法
a += b;
b = a - b;
a -= b;
  • 异或运算

10. == 和 === 区别

  • ==相等运算符,会进行隐式类型转化,先转化为数值再转化为字符串
  • ===全等运算符
'' == 0 // true
'    ' == 0 // true
null == undefined // true
null == 0 // false
undefined == ' ' // false
'false' == false // false,false会转为'0'
NaN == NaN // false, NaN不等于任何值
var a = {}
var b = {}
var c = a
a == b // false, a 和 b 实际存的是栈指针
a === b // false
a == c // true
a === c // true

11. 小数精度问题

0.1 + 0.2 = ?(0.300000000000004)

JS采用64位双精度:符号位(1),指数位(11),有效位置(52) 可以用parseFloat((0.1 + 0.2).toFixed(1))先截取为一位小数的字符串,再用parseFloat转化为小数

12. map()和parseInt()

['1','2','3'].map(parseInt)会返回什么?

  • map用来处理数组,默认传入三个值(element, index, array)
  • parseInt(数值,几进制) 答案: 会返回[1, NaN, NaN]

13.var/let/const区别

  • var可以重复定义和修改值
  • let不能重复定义,但是可以修改值,没有变量提升
  • const不能重复定义,也不能修改值
  • 在打括号里使用let/const可以形成块级作用域,不随着全局变量改变而改变

14.箭头函数和普通函数区别

  • 普通函数进入消息队列以后会由全局来调用回调函数
  • 回调函数会绑定到最近一层的普通函数的this

15.原生js实现call,apply,bind

  • call, person.call(egg)相当于在egg中加入了call然后egg再调用person()发生隐式绑定
  1. 判定obj是否为空对象,如果是就默认绑定window
  2. 在egg中暂时加入person方法
  3. 用字符串拼接剩余arguement
  4. 调用egg中的person()方法
function person(){
	console.log(this.name);
}
var egg = {
	name : 'hahaha'
}
Function.prototype.newCall = function (obj) {
	 //当前function的this指向person
     obj = obj | window;
     obj.person = this;
     var newArguments = [];;
     for (var i = 1; i < arguments.length; i++) {
     	newArguments.push('arguments['+i+']');
     }
     var result = eval('obj.person('+newArguments+')');
     delete obj.person;
     return result;
}
person.newCall(egg,'argue1','argue2','argue3');
  • apply接受两个参数,第一个是要绑定的对象,第二个是array of arguement,只要判断一下有没有arguement并改一下for循环就行
  • bind会返回一个函数
  Function.prototype.bind = function(context) {
        var _fn = this;
        var _args = Array.prototype.slice.call(arguments, 1);
        // 新的实例是拷贝了_fn的原型属性的实例
        var newFn = Object.create(_fn.prototype);

        function Fn () {
            Array.prototype.push.apply(_args, arguments);
             _fn.apply(this instanceof newFn.constructor ? this : context || window, _args);
        }

        // 将Fn的原型指向了新的实例
        Fn.prototype = newFn;

        return Fn;
    }