几个前端面试问题,供大家参考
1、js中原型与原型链的区别(prototype 和 proto 区别是什么)
- prototype是构造函数的属性
__proto__
是每个实例都有的属性,可以访问 [[prototype]] 属性- 实例的
__proto__
与其构造函数的prototype指向的是同一个对象原型是为了实现对象间的联系,解决构造函数无法数据共享而引入的一个属性,而原型链是一个实现对象间联系即继承的主要方法
2、深复制与浅复制的区别
注:深浅拷贝的区别只适用于Array与Object这样的复杂对象。
1、浅拷贝:只是复制了原数据的内存地址,相当于两个数据指针指向了相同的地址,其中任一数据元素发生改变,会影响另一个。
2、深拷贝:两个数据指向了不同的地址,数据元素发生改变时不会相互影响。
3、如何确定数组对象的类型
1、Array.prototype.isPrototypeOf(obj); //返回true 或者false
2、obj instanceof Array //返回true 或者false
3、Array.isArray(要判断的对象) //返回true 或者false
4、如何防止前端不停的向后端发起请求?例如不停的搜索不同的内容。
1、增加状态标记,在服务器返回消息后,修改状态,让用户进行其他请求
2、利用Axios 进行重复请求的判断 如何取消axios的重复请求_万物之恋的博客-CSDN博客_axios取消重复请求
5、字符串如何倒序?
第一种
let str = "i am good man"; let newStr = str.split('').reverse().join(""); console.log(newStr)
首先将字符串转为数组,再反转数组,最后将数组转为字符串
split("") ------根据字符串拆分数组
reverse()------数组反转元素位置
join("")-------数组转回字符串,不带分隔符
第二种
定义新的空字符串,遍历str,charAt() 是提取字符串的一个字符,先去最后一个字符,再取第二个,依次取,将取到的结果都放到新的字符前面,以此来实现倒序let str = "i am good man "; let newStr = ""; for(let i = 0;i<str.length;i++){ let s = str.charAt(str.length-i-1) newStr += s; } console.log(newStr)//nam doog ma i //从尾部开始遍历字符串,然后逐个拼接字符,得到最终的结果。
6、什么是构造函数?
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
构造:它是设计,组合。将没有的东西先概念实现,比如建筑图纸
构造函数:首先,它是函数,并且任何的函数都可以作为构造函数存在,它的本质是初始化对象。构造函数都是和new 关键词一起使用的。 new就是在创建对象,从无到有,构造函数就是在为初始化的对象添加属性和方法( 成员 )
7、如何优化前端?
8、css中的加号+ 是在什么时候使用的?
加号又被称作兄弟选择器。A+B表示选择紧邻在A后面的B元素,且A和B必须拥有相同的父元素,所选到的仅为一个B元素标签。
<style> h3+h5{ color: red; } </style> <body> <div> <h1>我是第1行</h1> <h2>我是第2行</h2> <div> <h3>我是第3行</h3> <h5>我是测试行</h5> <h4>我是第6行</h4> <h5>我是测试行</h5> </div> <h4>我是第4行</h4> <h5>我是第5行</h5> </div> </body>
9、什么是伪元素?
CSS 伪元素用于设置元素指定部分的样式。
例如,它可用于:
- 设置元素的首字母、首行的样式
- 在元素的内容之前或之后插入内容
- 伪元素的语法:
selector::pseudo-element { property: value; }