前端面试题01

  1. 哪种http状态下,浏览器会产生两次http请求?C
    A.400 请求报文中存在语法错误
    B.404 服务器上无法找到请求资源
    C.302 临时性重定向(请求的资源被分配了新的URL,希望本次访问使用新的URL)
    D.304 客户端发送附带条件请求时,请求满足条件的情况下,服务器端允许访问资源并返回状态码

  2. 根据HTML规范,以下代码中,外层容器outer的宽高分别是:D

</head>
<body>
	<div class="outer">outer
		<span class="inner">content</span>
	</div>
</body>

A. 高100px,宽130px
B. 高180px,宽130px
C. 高180px,宽100%
D. 高100px,宽100%

解析:span是display:line设置宽高是不起作用的,宽高是由自身撑起的,div是display:block,若宽高有设置就是设置的,没有设置取默认值。高为自身撑起的,宽为100%。

  1. 有一段html代码:
Hello
Hello的字体颜色是:C
  1. 当表单中包含文件上传控件时,需要将enctype设置为:B
    A. Application/x-www-form-urlencoded
    在发送前编码所有字符(默认)
    B. Multipart/form-data
    不对字符编码。 在使用包含文件上传控件的表单时,必须使用该值。

C. Text/explain
空格转换为 “+” 加号,但不对特殊字符编码。
D. File-data

  1. 下面有关javascript常见事件的触发情况,描述错误的是?C
    A. Onmousedown:某个鼠标键被按下
    B. Onkeypress:某个键盘的键被按下或按住
    C. Onblur:元素获得焦点
    修改:当失去输入焦点后产生该事件
    D. Onchange:用户改变域的内容

常见事件:
1. 点击事件:
1. onclick:单击事件
2. ondblclick:双击事件
2. 焦点事件
1. onblur:失去焦点
2. onfocus:元素获得焦点。
3. 加载事件:
1. onload:一张页面或一幅图像完成加载。
4. 鼠标事件:
1. onmousedown 鼠标按钮被按下。
2. onmouseup 鼠标按键被松开。
3. onmousemove 鼠标被移动。
4. onmouseover 鼠标移到某元素之上。
5. onmouseout 鼠标从某元素移开。
5. 键盘事件:
1. onkeydown 某个键盘按键被按下。
2. onkeyup 某个键盘按键被松开。
3. onkeypress 某个键盘按键被按下并松开。
6. 选择和改变
1. onchange 域的内容被改变。
2. onselect 文本被选中。
7. 表单事件:
1. onsubmit 确认按钮被点击。
2. onreset 重置按钮被点击。

  1. w3c制定的javascript标准事件模型,以下正确的顺序及描述是:B
    A. 事件捕获>事件冒泡
    B. 事件捕获>事件处理>事件冒泡
    C. 事件冒泡>事件处理>事件捕获
    D. 事件处理>事件捕获>事件冒泡

dom2规定的事件流包括3个阶段:
① 事件捕获,②处于目标阶段(事件处理 ),③事件冒泡阶段。
7. 在javascript中,用于阻止默认事件的默认操作的方法是:D
A. stopDefault()
B. stopPropagation()
C. preventPropagation()
D. preventDefaultt()
E. preventDefaultEvent()

如下:
function stopDefault( e ) {
if ( e && e.preventDefault ){
e.preventDefault(); //阻止默认浏览器动作(W3C)
}else {
window.event.returnValue = false; //IE中阻止函数器默认动作的方式
}
return false;
}

  1. 以下javascript代码,在浏览器中运行的结果是:B
    function foo(){
    console.log(“first”);setTimeout(function(){
    console.log(“second”)
    },5);
    }
    for(var i=0;i<123456789;i++){
    foo();
    }
    A. first second first second 依次顺序输出
    B. 事先全部输出first,然后全部输出second
    C. first second 无顺序输出
    D. 首先输出first,超出5ms输出所有second,最后输出余下的first

页面中所有由setTimeout定义的操作,都将放在同一个队列中依次执行。
而这个队列的执行时间需要等到函数调用栈执行完毕后才会执行,也就是等待所有的可执行代码执行完毕,才会轮到setTimeout执行其内部操作,并且按照其时延时间长短顺序执行代码!

  1. 以下javascript代码执行后。浏览器alert出来的结果分别是:B
    var color = “green”;
    var test123 = {
    color:“blue”,
    getColor:function(){
    var color = “red”;
    alert(this.colcor);
    },
    };
    var getColor = test123.getColor;
    getColor(); //由windows调用
    test123.getColor(); //test对象调用
    A. Undefined,red
    B. Green,blue
    C. Undefined,blue
    D. Greenmundefined
    E. Blued,undefined

js中this的用法,this总是指向调用它的对象,倒数第二行的getColor为windows调用的,倒数第一行的getColor是test对象调用的

  1. 有如下代码
    var name = “World”;
    (function(){
    var name;

    		if(typeof name === "undefined")
    		{name = "Jack";
    		console.log("Goodbye "+name)
    		}else{
    			console.log("hello"+name)
    		}
    	})();
    

执行后弹出的值是:B
A. Hello World!
B. Goodbye Jack
C. Hello Jack
D. Goodbye World

在 JavaScript中, Fun 和 var 会被提升相当于
var str = ‘World!’;
(function (name) {
if (typeof name === ‘undefined’) {
var name = ‘Jack’;
console.log('Goodbye ’ + name);
} else {
console.log('Hello ’ + name);
}
})(str);

  1. 有以下代码片段,结果是:6
    var a=[];
    a[0]=1,a[1]=2,a[2]=3,a[5]=4;
    alert(a.length);

  2. 在位运算中,操作数每右移一位,其结果相当于:B
    A. 操作数乘以2
    B. 操作数除以2
    C. 操作数乘以4
    D. 操作数除以4

  3. 超链接访问过后hover样式就不会出现了,被点击访问过的超链接样式不再具有hover和active了,解决方法是改变CSS属性的排列顺序:A
    A. a:link{} a:visited{} a:hover{} a:active{}
    B. a:visited{} a:link{} a:hover{} a:active{}
    C. a:link{} a: active{} a:hover{} a: visited{}
    D. a: active{} a:link{} a:hover{} a: visited{}

不定项选择

  1. cookie的domain属性指定域名example.com后,哪些域名会发送cookie:BC
    A. img example.com
    B. www.example.com
    C. example.com
    D. api example.com

cookie的domain不支持ip也不支持端口 .

  1. 默认情况下,以下哪些元素是行内元素:AD
    A.
    B.


    C.


    D.

块级元素:

    • 、、
      、 内联元素: 、、

  1. 以下关于WebSocket描述正确的是BD
    A. 仅支持文本数据
    B. 双向:客户端和服务端都能交换消息
    C. 单向:仅服务端能发送消息
    D. 支持二进制和文本数据

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

  1. 关于LocalStorage描述正确的是:AC
    A. 在同源的所有标签页和窗口之间共享数据
    B. 数据有过期时间
    C. 数据不会过期
    D. 服务消息通过HTTP header操纵数据库

方便在客户端存储数据,并且不会随着HTTP传输。

  1. 如何在浏览器中存储数据:ACD
    A. IndexDB
    B. FormData
    C. Cookie
    D. LocalAtorage SessionStorage

  2. 当我们尝试发送一个非常简单请求时,浏览器会发送一个特殊的预检(preflight)请求到服务器。
    预检的方法是:A
    A. OPTIONS
    B. GET
    C. POST
    D. PUT

问答题

  1. 假设有个电商项目,匿名加入购物车的东西,登录之后如何出现在已登录账号?

如果你之前登陆了淘宝帐号,并使用了保存登陆信息的话,那么第二次打开淘宝网就会自动加载登陆信息。因此你所述的操作系统视为有效.
购物车
1、未登录:使用cookie保存购物车数据
2、登录后:把购物车数据保存到redis。
2、购物车合并,应该以服务端的购物车为准。

  1. 一个Web应用,用户登录之后,在后续的多个请求中,后端是如何识别出哪个是用户在使用后台功能。

登录之后会获取到一个类似于token的一个字符串,或者是其他的一个字符串,然后每次操作的时候都会发发送字串字符串到服务器上,那服务器就会知道是哪一个用户在操作。
这串字符串呢,就一般放在头里面,HTTP请求头。

  1. 远程车辆管理,车主在手机app上点击【关窗】按钮,汽车在几千公里之外就能关窗。在这种情况下,手机app是如何与几千公里外的汽车通信并且关窗的?描述应用层及其构架。

点击关窗按钮之后会调用一个接口,一般是HTTPS或者HTTP的,然后告诉服务器要关窗,然后服务器跟车辆会有一个长连接,服务器就通过这个长连接,告诉这个车需要关窗。实现这个长链接,通过web shocking来链接。

  1. QQ农场是一个网页游戏,有几种方法实现游戏外挂实现自动偷菜。

(1)抓包,看偷菜,刷新好友列表,就是调用哪些接口记录下来,然后呢,我们就可以定时的去调用这些接口,就可以实现自动偷菜。

(2)也可以通过模拟点击,但是这个方法不太靠谱,模拟点击某个位置某个按钮。

  1. 一个项目的首页有很多图片,有哪些方法优化图片加载性能。

第一种方法就是先获取小图片,然后点击这张图片在加载大图片,这样子就可以加快这个网页加载图片性能。
第二种就是用Webp来代替部分图片,因为web批这种图片格式一般会小一点,而且它的压缩率会比较高。

  1. 简述JS实现对象拷贝的几种方法。
    深拷贝:
    (1)遍历+递归
    function deepClone(obj){
    let newObj = {}
    for(let key in obj){
    if(obj.hasOwnProperty(key)){
    if(typeof(obj[key]) === ‘object’ && obj[key] !== null){
    newObj[key] = (Array.isArray(obj[key]) ? [] : {})
    newObj[key] = (Array.isArray(newObj[key]) ? […obj[key]] : deepClone(obj[key]));
    }else{
    newObj[key] = obj[key];
    }
    }
    }
    return newObj;
    }

(2)Object.assign + 递归
function deepClone(obj){
let newObj = {}
for(let key in obj){
if(obj.hasOwnProperty(key)){
newObj[key] = (typeof obj[key] === ‘object’ ? Object.assign(obj[key]) : obj[key])
}
}
return newObj
}

(3)对象扩展 + 递归
function deepClone(obj){
var newObj ={}
for(let key in obj){
if(obj.hasOwnProperty(key)){
if(typeof obj[key] === ‘object’){
newObj[key] = (Array.isArray(obj[key]) ? [] : {})
newObj[key] = (Array.isArray(newObj[key]) ? […obj[key]] : {…obj[key]})
}
else{
newObj[key] = obj[key]
}
}
}
return newObj
}

(4)JSON复制
对NAN和undefined无法正确复制
function deepClone(obj){
var newObj = JSON.parse(JSON.stringify(obj))
return newObj
}
(5)测试对象
var obj = {
name:‘lily’,
age:23,
homework:{
math:‘not complite’,
chinese:‘complite’
},
extra:{
num:NaN,
under:undefined,
empty:null
},
arr:[1,2,3,4]
}
console.log(deepClone(obj))
(6)第三方库:lodash或者jQuery的extend方法
$.extend(true,object1,object2) //深拷贝
$.extend(object1,object2) //浅拷贝
一、浅拷贝
(1) Object.assign()
Object.assign我们经常会用到合并对象,当然利用Object.assign性质我们也可以实现对象的拷贝。
var obj1 = {a: 1, b: 2}

var obj2 = Object.assign({}, obj1)

obj2.a = 4

console.log(obj1, obj2)
结果如图:
这里要注意的是Object.assign第一个参数必须是个空对象
(2) 解构赋值
var obj1 = {a: 1, b: 2}

var obj2 = {…obj1}

obj2.a = 4

console.log(obj1, obj2)
结果如图:
这里一样可以实现之前上面的结果。
但这两种拷贝有一个问题就是只能赋值一层,假设我们有如下数据结构
var obj1 = [{
name: ‘臧三’,
childs: [‘小明’, ‘小芳’]
}]

var obj2 = […obj1]

obj2[0].childs = []

console.log(obj1, obj2)
我们会发现打印出的结果如下:
上图可看出obj1,obj2 的结果均变了,这并不是我们想要的结果,所以我们要用到深拷贝。
二、深拷贝
(1) 利用json.stringify
var obj1 = [{
name: ‘臧三’,
childs: [‘小明’, ‘小芳’]
}]

var obj2 = JSON.parse(JSON.stringify(obj1))

obj2[0].childs = []

console.log(obj1, obj2)
结果如下:
这样的话就能达到我们想要的结果。
这种方法简单,但也有弊端,看看下面的数据结构:
var obj1 = [{
name: ‘臧三’,
childs: [‘小明’, ‘小芳’],
fn: function() {},
age: undefined
}]

var obj2 = JSON.parse(JSON.stringify(obj1))

obj2[0].childs = []

console.log(obj1, obj2)
结果:
我们从结果中发现,值为undefined,或者function的时候并不会拷贝过来。
(2) 利用递归来实现一个方法进行拷贝
var obj1 = [{
name: ‘臧三’,
childs: [‘小明’, ‘小芳’],
fn: function() {},
age: undefined
}]

var obj2 = extend(obj1)

obj2[0].childs = []

console.log(obj1, obj2)

function extend(data) {
if (typeof data === ‘object’ && data) {
let val = typeof data.length === ‘number’ ? [] : {}
for(let i in data) {
val[i] = extend(data[i])
}
return val
} else {
return data
}
}
结果:
这样我们就能把所有值都拷贝过来。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值