轉至:https://blog.csdn.net/runner_123/article/details/82864164
原
今日頭條實習面試總結
2018年10月21日 14:19:39 runner_123 閱讀數:96
1、實作數組扁平化
數組扁平化是指将一個多元數組變為一維數組
[1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5]
(1)toString & split或者jion & split
調用數組的toString方法,将數組變為字元串然後再用split分割還原為數組
- function flatten(Ary){
- var midAry=Ary.toString();
- // var midAry=Ary.join(",");
- var result=midAry.split( ",");
- return result;
- }
(2)遞歸
遞歸的周遊每一項,若為數組則繼續周遊,否則concat
2、實作三欄布局,中間自适應,左右兩邊固定
自己的實作:
- .container{
- position:relative;
- width: ;
- }
- .left{
- width: ;
- background:red;
- float:left;
- }
- .main{
- width: ;
- padding: ;
- background:green;
- }
- .right{
- width: ;
- background:red;
- position:absolute;
- right: ;
- top: ;
- }
html代碼段
- <div class="container">
- <div class="left">left </div>
- <div class="main">main </div>
- <div class="right"> right </div>
- </div>
3、說一說var 、let、const 的差別
聲明變量的三種方式 | 概念差別 | 重複聲明 | 作用域問題 | 變量提升問題 |
var | var 聲明全局變量 | 用于聲明變量,重複聲明同一變量後面的覆寫前面的。 | 可以在作用域外使用 | var 申明的變量作用域會提升 |
let | let:聲明塊級變量,即局部變量。 | 用于聲明變量,let在相同的作用域下面不能申明相同的變量 | 聲明的地方形成作用域,作用域外無法通路 | let 申明的變量作用域不會提升 |
const | const:用于聲明常量,也具有塊級作用域 ,也可聲明塊級 | 用于聲明常量,const申明的變量初始化後不能被修改 | cosnt隻能作用于目前作用域 | const申明的作用域不會被提升 |
4、css實作圓,梯形
圓:
- #circle{
- width: ;
- height: ;
- border-radius: ;
- background: ;
- }
橢圓:border-radius可以單獨指定水準和垂直半徑,隻要用一個(/)分隔這兩個值就行。還一個特性是,它可以接受長度值,還可以接受百分比,兩種特性結合,就可以自适應了。
- .ellipse{
- width: ;
- height: ;
- background-color: red;
- border-radius: ;
- }
梯形:
- .tx1{
- float:left;
- width: ;
- height: ;
- border-width: ;
- border-style: solid;
- border-color: transparent blue blue transparent;
- }
- .tx2{
- width: ;
- height: ;
- background: ;
- float:left;
- }
- .tx3{
- float:left;
- width: ;
- height: ;
- border-width: ;
- border-style: solid;
- border-color: transparent transparent blue blue;
- }
html代碼
- <div class="tx1"> </div>
- <div class="tx2"> </div>
- <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 | 定義了彈性項目在彈性容器中的放置方向,(預設行内方向、從左到右) |
自适應布局:分别為不同的螢幕分辨率定義布局
流式布局:對頁面元素的寬度進行适配調整
響應式布局:運用各種樣式技巧,實作随着螢幕的變化以及PC端移動端的變化,頁面布局做出相應調整。
(2)響應式布局的步驟實作
須加一句頭部代碼
<meta name="viewport" content="width=device-width",initial-scale=,minimum-scale=,maximum-scale=,user-scalable=no">
通過媒體查詢來設定樣式,媒體查詢@media不僅可以設定字型,也可以對圖檔進行設定。
@media screen and ( min-width:px){}
寬度不用固定值,用百分比。
浮動布局使用flex;
圖檔處理:height:auto;為了保證圖檔的原始寬高比例,以至于圖檔不失真。
- .m-home img{
- max-width: %;
- height:auto;
- }
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腳本
- <script type= "text/javascript">
- function jsonhandle(data){
- alert( "age:" + data.age + "name:" + data.name);
- }
- < /script>
- <script type="text/javascript " src="http: //www.practice-zhao.com/remote.js"></script>
這裡調用了跨域的remote.js腳本,remote.js代碼如下:
- jsonhandle({
- "age" : ,
- "name": "John",
- })
動态的添加了一個script标簽,src指向跨域的一個腳本,并且将js函數名作為callback參數傳入
- <script type= "text/javascript">
- function jsonhandle(data){
- alert( "age:" + data.age + "name:" + data.name);
- }
- < /script>
- <script type="text/javascript ">
- $(document).ready(function(){
- var url = "http: //www.practice-zhao.com/student.php?id=1&callback=jsonhandle";
- var obj = $( '<script><\/script>');
- obj.attr( "src",url);
- $( "body").append(obj);
- });
- </script>
這裡動态的添加了一個script标簽,src指向跨域的一個php腳本,并且将上面的js函數名作為callback參數傳入
JSONP将通路跨域請求變成了執行遠端JS代碼,服務端不再傳回JSON格式的資料,而是傳回了一段将JSON資料作為傳入參數的函數執行代碼。
jQuery提供了友善使用JSONP的方式
- $( document).ready( function(){
- $.ajax({
- type : "get",
- async: false,
- url : "http://www.practice-zhao.com/student.php?id=1",
- dataType: "jsonp",
- jsonp: "callback", //請求php的參數名
- jsonpCallback: "jsonhandle", //要執行的回調函數
- success : function(data) {
- alert( "age:" + data.age + "name:" + data.name);
- }
- });
- });
隻要設定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>
1、實作數組扁平化