今日头条实习面试总结

转至:https://blog.csdn.net/runner_123/article/details/82864164

今日头条实习面试总结

1、实现数组扁平化

数组扁平化是指将一个多维数组变为一维数组

[1, [2, 3, [4, 5]]]  ------>    [1, 2, 3, 4, 5]
 
 

(1)toString & split或者jion & split

调用数组的toString方法,将数组变为字符串然后再用split分割还原为数组


 
 
  1. function flatten(Ary){
  2. var midAry=Ary.toString();
  3. // var midAry=Ary.join(",");
  4. var result=midAry.split( ",");
  5. return result;
  6. }

(2)递归

递归的遍历每一项,若为数组则继续遍历,否则concat

2、实现三栏布局,中间自适应,左右两边固定

自己的实现:


 
 
  1. .container{
  2. position:relative;
  3. width: 100%;
  4. }
  5. .left{
  6. width: 100px;
  7. background:red;
  8. float:left;
  9. }
  10. .main{
  11. width: 100%;
  12. padding: 0 100px;
  13. background:green;
  14. }
  15. .right{
  16. width: 100px;
  17. background:red;
  18. position:absolute;
  19. right: 0;
  20. top: 0;
  21. }

html代码段


 
 
  1. <div class="container">
  2. <div class="left">left </div>
  3. <div class="main">main </div>
  4. <div class="right"> right </div>
  5. </div>

3、说一说var 、let、const 的区别

声明变量的三种方式概念区别重复声明作用域问题变量提升问题
varvar 声明全局变量用于声明变量,重复声明同一变量后面的覆盖前面的。可以在作用域外使用var 申明的变量作用域会提升
letlet:声明块级变量,即局部变量。 用于声明变量,let在相同的作用域下面不能申明相同的变量声明的地方形成作用域,作用域外无法访问let 申明的变量作用域不会提升
constconst:用于声明常量,也具有块级作用域 ,也可声明块级用于声明常量,const申明的变量初始化后不能被修改cosnt只能作用于当前作用域const申明的作用域不会被提升

4、css实现圆,梯形

圆:


 
 
  1. #circle{
  2. width: 100px;
  3. height: 100px;
  4. border-radius: 50px;
  5. background: #ccc;
  6. }

椭圆:border-radius可以单独指定水平和垂直半径,只要用一个(/)分隔这两个值就行。还一个特性是,它可以接受长度值,还可以接受百分比,两种特性结合,就可以自适应了。


 
 
  1. .ellipse{
  2. width: 200px;
  3. height: 100px;
  4. background-color: red;
  5. border-radius: 50%;
  6. }

梯形:


 
 
  1. .tx1{
  2. float:left;
  3. width: 0px;
  4. height: 0px;
  5. border-width: 50px;
  6. border-style: solid;
  7. border-color: transparent blue blue transparent;
  8. }
  9. .tx2{
  10. width: 100px;
  11. height: 100px;
  12. background: #ccc;
  13. float:left;
  14. }
  15. .tx3{
  16. float:left;
  17. width: 0px;
  18. height: 0px;
  19. border-width: 50px;
  20. border-style: solid;
  21. border-color: transparent transparent blue blue;
  22. }

  html代码


 
 
  1. <div class="tx1"> </div>
  2. <div class="tx2"> </div>
  3. <div class="tx3"> </div>

5、清除子元素的内容,还要清除其事件,一般用什么

如果仅仅删除父元素下面的子元素,使用removeChild。但是可能为子元素绑定了事件,所以不能只删除元素,而让绑定的时间继续占用内存

btn1.onclick = function(){}
btn1.onclick =null;

这样就是在解除事件绑定。

如果是用addEventListener给元素绑定的事件,那么可以用removeEventListener来解除事件绑定。

6、一般怎么实现响应式布局

(1)先介绍几种其他布局的概念

静态布局:设计固定样式,如果要适配移动端,则单独再设计一套样式

弹性布局:css3引入的一种布局方式(用来替代之前的float浮动布局)

flex-flow: 应用到需要布局的元素的父元素上,先指定元素为flex布局,display:flex;

fllex-flow是 flex-direction和 flex-wrap的简写形式

flex-direction

定义了弹性项目在弹性容器中的放置方向,(默认行内方向、从左到右)

		<p>row初始值,还有row-reverse || column || column-reverse</p>
		</td>
	</tr><tr><td>flex-wrap</td>
		<td style="width:592px;">
		<p>指定项目是否在必要的时候换行,默认不换行</p>

		<p>arap初始值,还有 &nbsp; &nbsp;wrap || wrap-reverse</p>
		</td>
	</tr></tbody></table></div><pre class="has" name="code" onclick="hljs.copyCode(event)"><code class="hljs language-javascript"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">.top ul{</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-attr">display</span>:flex;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">flex-direction: row;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">flex-wrap:nowrap;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">}</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre>

自适应布局:分别为不同的屏幕分辨率定义布局

流式布局:对页面元素的宽度进行适配调整

响应式布局:运用各种样式技巧,实现随着屏幕的变化以及PC端移动端的变化,页面布局做出相应调整。

(2)响应式布局的步骤实现

须加一句头部代码

<meta name="viewport" content="width=device-width",initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
 
 

通过媒体查询来设置样式,媒体查询@media不仅可以设置字体,也可以对图片进行设置。

@media screen and ( min-width:750px){}
 
 

宽度不用固定值,用百分比。

浮动布局使用flex;

图片处理:height:auto;为了保证图片的原始宽高比例,以至于图片不失真。


 
 
  1. .m-home img{
  2. max-width: 100%;
  3. height:auto;
  4. }

7、说一下jsonp的原理,你遇到过跨域嘛,如何解决,除了jsonp还有其他什么方法。                                                                                                                                                                                                                                                                                  (1)jsonp的原理

 ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。                                    (2)jsonp的具体实现

比如访问不同源的域www.practice-zhao.com

直接添加script标签,标签的src指向了另一个域www.practice-zhao.com下的remote.js脚本


 
 
  1. <script type= "text/javascript">
  2. function jsonhandle(data){
  3. alert( "age:" + data.age + "name:" + data.name);
  4. }
  5. < /script>
  6. <script type="text/javascript " src="http: //www.practice-zhao.com/remote.js"></script>

这里调用了跨域的remote.js脚本,remote.js代码如下:


 
 
  1. jsonhandle({
  2. "age" : 15,
  3. "name": "John",
  4. })

 动态的添加了一个script标签,src指向跨域的一个脚本,并且将js函数名作为callback参数传入


 
 
  1. <script type= "text/javascript">
  2. function jsonhandle(data){
  3. alert( "age:" + data.age + "name:" + data.name);
  4. }
  5. < /script>
  6. <script type="text/javascript ">
  7. $(document).ready(function(){
  8. var url = "http: //www.practice-zhao.com/student.php?id=1&callback=jsonhandle";
  9. var obj = $( '<script><\/script>');
  10. obj.attr( "src",url);
  11. $( "body").append(obj);
  12. });
  13. </script>

   这里动态的添加了一个script标签,src指向跨域的一个php脚本,并且将上面的js函数名作为callback参数传入

JSONP将访问跨域请求变成了执行远程JS代码,服务端不再返回JSON格式的数据,而是返回了一段将JSON数据作为传入参数的函数执行代码。

jQuery提供了方便使用JSONP的方式


 
 
  1. $( document).ready( function(){
  2. $.ajax({
  3. type : "get",
  4. async: false,
  5. url : "http://www.practice-zhao.com/student.php?id=1",
  6. dataType: "jsonp",
  7. jsonp: "callback", //请求php的参数名
  8. jsonpCallback: "jsonhandle", //要执行的回调函数
  9. success : function(data) {
  10. alert( "age:" + data.age + "name:" + data.name);
  11. }
  12. });
  13. });

    只要设置dataType为jsonp即可。

总结:JSONP是一种非正式传输协议,该协议的一个要点就是允许用户传递一个callback或者开始就定义一个回调方法,参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
  JSONP只支持GET请求而不支持POST等其它类型的HTTP请求,它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题,JSONP的优势在于支持老式浏览器,弊端也比较明显:需要客户端和服务端定制进行开发,服务端返回的数据不能是标准的Json数据,而是callback包裹的数据。

(3)跨域的其他解决办法

    CORS 前后端协作设置请求头,Access-Control-Allow-Origin等头部信息

普通跨域请求:只服务端设置Access-Control-Allow-Origin即可,前端无须设置,若要带cookie请求:前后端都需要设置。

CORS是现代浏览器支持跨域资源请求的一种方式,全称是"跨域资源共享"(Cross-origin resource sharing),当使用XMLHttpRequest发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin,后台进行一系列处理,如果确定接受请求则在返回结果中加入一个响应头:Access-Control-Allow-Origin;浏览器判断该响应头中是否包含Origin的值,如果有则浏览器会处理响应,我们就可以拿到响应数据,如果不包含浏览器直接驳回,这时我们无法拿到响应数据。
CORS与JSONP的使用目的相同,但是比JSONP更强大,CORS支持所有的浏览器请求类型,承载的请求数据量更大,开放更简洁,服务端只需要将处理后的数据直接返回,不需要再特殊处理。

 

服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。

 

使用HTML5中新引进的window.postMessage方法来跨域传送数据

window.postMessage(message,targetOrigin)  方法是html5新引进的特性,可以使用它来向其它的window对象发送消息,无论这个window对象是属于同源或不同源,目前IE8+、FireFox、Chrome、Opera等浏览器都已经支持window.postMessage方法。

接收2个参数

调用postMessage方法的window对象是指要接收消息的那一个window对象,

该方法的第一个参数message为要发送的消息,类型只能为字符串;

第二个参数targetOrigin用来限定接收消息的那个window对象所在的域,如果不想限定域,可以使用通配符 *  。

                                                                                                                                                     

				<script>
					(function(){
						function setArticleH(btnReadmore,posi){
							var winH = $(window).height();
							var articleBox = $("div.article_content");
							var artH = articleBox.height();
							if(artH > winH*posi){
								articleBox.css({
									'height':winH*posi+'px',
									'overflow':'hidden'
								})
								btnReadmore.click(function(){
									if(typeof window.localStorage === "object" && typeof window.csdn.anonymousUserLimit === "object"){
										if(!window.csdn.anonymousUserLimit.judgment()){
											window.csdn.anonymousUserLimit.Jumplogin();
											return false;
										}else if(!currentUserName){
											window.csdn.anonymousUserLimit.updata();
										}
									}
									
									articleBox.removeAttr("style");
									$(this).parent().remove();
								})
							}else{
								btnReadmore.parent().remove();
							}
						}
						var btnReadmore = $("#btn-readmore");
						if(btnReadmore.length>0){
							if(currentUserName){
								setArticleH(btnReadmore,3);
							}else{
								setArticleH(btnReadmore,1.2);
							}
						}
					})()
				</script>
				</article>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值