前端常见面试题总结

你们觉得什么样的工作最不能一直做,我觉得是安逸。尤其是我们,没有五年八年经验的刚入行的。准备换工作,虽然工资不算低,但安逸是一种毒药,而且很容易上瘾。

css:

行内元素有哪些?块级元素有哪些

行内元素:span,a,b,img,input,strong,select,label,em,button

块级元素:div,ul,li,dl,dt,dd,p,h1-h6

2:css引入方式有哪些?link和@import的区别

link外部引入css,通过@import方式引入,行内样式引入,在head标签里放在<style></style>标签引入

@import引入方式是@import url()

link是放在head标签里,通过<link rel="stylesheet" href="">

link会和dom结构一起加载,@import是先加载完dom以后才渲染页面,link是xhtml标签,没有兼容性问题,@import只能在ie6以上,link可以加载除了css以外的文件,@import只能加载css文件

3:前端页面有哪三层构成,分别是什么?作用是什么

前端页面有行为层,结构层,渲染层构成

结构层主要是由html或xhtml之类的标记语言负责创建

渲染层是由css负责创建

行为层是由javascript负责完成

html是搭建文档的结构,css是设置文档的呈现效果,行为层是用来完成用户交互

4:标签上title与alt属性的区别是什么?

title是关于元素的注释信息,主要是给用户解读,当鼠标放到文字或者图片上的时候有title文字提示

而alt主要用于img标签,它是图片在无法显示时的替代文本。比如网速太慢或者浏览器禁用图像等

5:描述css reset和css sprites的作用和用途

css reset是样式重置,作用主要是重置浏览器默认的css样式,不同的浏览器默认的样式会有出入,通过样式重置可以在不同的

浏览器中达到一致的效果

css sprites也叫css精灵,是一种css图像合成技术。是按照一定的顺序把很多个小图标合成一站图像的技术。通过该技术可以大大的减少网络请求次数,加快网页的加载速度。图片当成背景图,通过background-position来定位到你想要显示的图标

6:举例说明你如何对网站的文件和资源进行优化?

1:文件合并,常用的比如css sprites

2:文件压缩,目的是直接减少文件下载的体积

3:使用缓存

7:什么是语义化的html

语义化的主要目的在于直观的认识标签和属性的用途和作用,可以概括为:用正确的标签做正确的事

html语义化可以让页面的内容结构化,便于浏览器解析,便于搜索引擎解析,并提高代码的可维护度和可重用性,比如可以减少无语义的标签,多实用结构化的标签,比如<header></header>,<footer></footer>等

8:javascript的typeof返回哪些数据类型

string,boolean,number,null,undifined,object,function

9.split() join() 的区别

split是按照指定的分隔符对字符串进行分割,并以数组的形式返回结果

join跟split相反,是以指定的符号将数组的元素进行拼接,并以字符串返回。

10:如何检测一个变量是一个string类型

        if(typeof(s)=="string"){
			alert("该变量是字符串")
		}
		if(typeof s=="string"){
			alert("该变量是字符串")
		}
		if(s.constructor==String){
			alert("该变量是字符串")
		}

11:如何去除字符串空格

             var a=" 你好啊 正则 ";
		//去除所有的空格
		var str=a.replace(/\s*/g,"");
		console.log(str)
		//去除左右两边的空格
		var str1=a.replace(/^\s*|\s*$/g,'')
		console.log(str1)
		//去除开始的空格,也就是左边的空格
		var str2=a.replace(/^\s*/,'');
		console.log(str2)
		//去除最后的空格,也就是右边的空格
		var str3=a.replace(/\s*$/,'');
		console.log(str3)

这里解释下这个正则

/g代表全局匹配,\s代表空格,*代表一个或多个,^代表开始,$代表结束,|代表拿第一个来说

var str=a.replace(/\s*/g,"");
代表全局匹配一个或多个空格,用“”替代,这样就去除了所有的空格。

这里还有一个我们常用的方法,str.trim()方法,该方法跟第二种去除左右两边的空格正则是一样的效果,不能去除中间的空格。

还有str.trimLeft(),str.trimRight()分别用于去除字符串左边的空格和右空格

12:普通事件与事件绑定的区别

普通事件添加的方法不支持添加多个事件,下面的会覆盖上面的事件

事件绑定可以添加多个事件

13:get和post请求方式的区别

get把请求的数据放在url上,传输的格式是以?为分割,参数之间以&连接,而post把数据放在http的包体内

get提交的数据最大是2k,而post则大得多

get请求会被浏览器主动地cache,而post不会

get请求会在浏览器的历史记录中找到,所以不安全,而post不会,所以相对比post安全

14:eval 与JSON.parse的区别

eval与JSON.parse都是将json字符串转变成json对象,但是两者是有区别的

eval解析json字符串的时候不会去检查是不是符合json格式,对格式要求没那么严格

而且如果字符串中有js代码也会在解析的时候执行js代码

但如果json字符串不符合json格式,用JSON.parse解析则会报错

另外,因为用eval解析的字符串可以插入恶意的js代码,所以不安全,因此推荐使用JSON.parse来解析json字符串

15:请写一个方法获取浏览器url中查询字符串的参数

var data={};
		var url="http://www.douban.com/api/movie/top250?number=10&start=0";
		function getUrl(url){
			var str=url.split("?")[1];
			if(str){
				var s=str.split("&");
				for(var i=0;i<s.length;i++){
					var key=s[i].split("=")[0];
					var val=s[i].split("=")[1];
					data[key]=val;
				}
				console.log(data)
			}
		}
		getUrl(url)

16:如何创建一个节点,增加一个节点,删除一个节点,替换一个节点

创建节点:createElement(),该方法的参数是节点名称,比如button就是创建一个按钮,a就是创建一个超链接,以此类推

创建文本节点:createTextNode()

添加节点:appendChild()

删除节点:removeChild()

替换节点:repalceChild()

插入节点:insertBefore()

这里呢,我习惯上使用jquery方法,下面我随手写了几个例子,是关于节点的增删插入节点以及移动节点的

<ul id="list">
			<li>11</li>
			<li>22</li>
			<li>33</li>
		</ul>
		<button onclick="add()">点我添加子元素</button>
		<button onclick="deletes()">点我删除子元素</button>
		<button onclick="move()">点我上移节点</button>
		<script src="js/jquery-1.11.3.js"></script>
		<script>
		
		function add(){
			var li='<li>44</li>';
			$("#list").append(li)//在list的后面插入一个子元素
			$("#list").prepend(li);//在list的前面插入一个子元素
		}
		function deletes(){
		$("#list li:last-child").remove()
		}
		function move(){
			var node=$("#list li:last-child").prev();
			$("#list li:last-child").insertBefore(node);//向上移动
			$("#list li:last-child").insertAfter(node);//向下移动
			
		}

17:怎么在html元素事件属性中使用this

<button onclick="add(this)">点我添加子元素</button>
<script>function add(e){alert($(e).html())}</script>

18:编写一个数组去重的方法

1:自己写的一个方法

<script type="text/javascript">
		var array=[1,3,4,5,6,3,4,1,8]
			function quchong(arr){
				for(var i=0;i<arr.length;i++){
					for(var j=(i+1);j<arr.length;j++){
						if(arr[i]==arr[j]){
							var newArr=arr.splice(j,1)
						}
					}
				
				}
				console.log(arr)
			}
			quchong(array)
		</script>

2:借鉴的别人的我觉得很棒的方法

var arr = [2,3,4,4,5,2,3,6],
   arr2 = [];
for(var i = 0;i< arr.length;i++){
    if(arr2.indexOf(arr[i]) < 0){
        arr2.push(arr[i]);
    }
}
console.log(arr2);

19:什么是闭包

js中作用域分两种,全局变量和函数内声明的局部变量,当然如果在函数内没有用var声明变量的话就是全局变量,那么问题来了,如果出了声明局部变量的代码块想使用该局部变量怎么办呢,这时候就需要用到闭包了

所以,简单的说,闭包就是为了能跟读取函数内声明的局部变量。

闭包的形式是一个函数返回另一个函数,而返回的函数使用了该函数内部的变量,然后把外层函数的执行结果赋值给一个变量,再执行该变量。

20:什么是跨域,产生跨域的原因以及如何解决跨域

跨域产生的原因是由于浏览器的同源策略,发送的请求地址的协议,域名,端口号三者有一个跟当前请求页面的地址不同就会产生跨域问题。

常见的解决跨域问题的方法有三种

1:CORS

这是最常见的方法,我们公司用的也是这种方法,该方法主要是后端人员来操作,是需要后端人员在请求的服务器文件上添加允许访问的地址,以及访问方式等,如下

res.writeHead(200, {
    "Content-Type": "text/html; charset=UTF-8",
    "Access-Control-Allow-Origin":'http://localhost',//这里指定你允许的域名
    'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
    'Access-Control-Allow-Headers': 'X-Requested-With, Content-Type'
});

2:porxy代理

定义和用法:proxy代理用于将请求发送给后台服务器,通过服务器来发送请求,然后将请求的结果传递给前端。

实现方法:通过nginx代理;

注意点:1、如果你代理的是https协议的请求,那么你的proxy首先需要信任该证书(尤其是自定义证书)或者忽略证书检查,否则你的请求无法成功

3:jsonp

这个好像很多前端都会回答的一个答案,但是好像很多人并不是很清楚具体原因,而且个人觉得这个方法并不好用。关于这个放大我写过一篇详细的博客来说明,附上链接

https://mp.csdn.net/postedit/79578886




猜你喜欢

转载自blog.csdn.net/ygy211715/article/details/80263785