91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Web前端開發常見的一些面試題及解決方法

發布時間:2020-08-07 14:36:32 來源:億速云 閱讀:131 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關Web前端開發常見的一些面試題及解決方法的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

1、JavaScript 中如何檢測一個變量是一個 String 類型?請寫出函數實現
typeof(obj) === "string"
typeof obj === "string"
obj.constructor === String

2、請用 js 去除字符串空格?

方法一:使用 replace 正則匹配的方法

去除所有空格: str = str.replace (/s*/g,"");

去除兩頭空格: str = str.replace (/^s|s$/g,"");

去除左空格: str = str.replace (/^s*/, “”);

去除右空格: str = str.replace (/(s*$)/g, "");

str 為要去除空格的字符串,實例如下:

1var str = " 23 23 ";
2var str2 = str.replace(/s*/g,"");
3console.log(str2); // 2323

方法二:使用 str.trim () 方法

str.trim () 局限性:無法去除中間的空格,實例如下:

var str = " xiao ming ";
var str2 = str.trim();
console.log(str2); //xiao ming

同理,str.trimLeft (),str.trimRight () 分別用于去除字符串左右空格。

方法三:使用 jquery,$.trim (str) 方法

$.trim (str) 局限性:無法去除中間的空格,實例如下:

var str = " xiao ming ";
var str2 = $.trim(str)
console.log(str2); // xiao ming

3、你如何獲取瀏覽器 URL 中查詢字符串中的參數?

測試地址為:http://www.runoob.com/jquery/misc-trim.html?channelid=12333&name=xiaoming&age=23

實例如下:

function showWindowHref(){
var sHref = window.location.href;
var args = sHref.split('?');
if(args[0] == sHref){
return "";
}
var arr = args[1].split('&');
var obj = {};
for(var i = 0;i< arr.length;i++){ var arg = arr[i].split('='); obj[arg[0]] = arg[1]; } return obj;}var href = showWindowHref(); // objconsole.log(href['name']); // xiaoming

4、js 字符串操作函數
我這里只是列舉了常用的字符串函數,具體使用方法,請參考網址。

concat () – 將兩個或多個字符的文本組合起來,返回一個新的字符串。

indexOf () – 返回字符串中一個子串第一處出現的索引。如果沒有匹配項,返回 -1 。

charAt () – 返回指定位置的字符。

lastIndexOf () – 返回字符串中一個子串最后一處出現的索引,如果沒有匹配項,返回 -1 。

match () – 檢查一個字符串是否匹配一個正則表達式。

substr () 函數 -- 返回從 string 的 startPos 位置,長度為 length 的字符串

substring () – 返回字符串的一個子串。傳入參數是起始位置和結束位置。

slice () – 提取字符串的一部分,并返回一個新字符串。

replace () – 用來查找匹配一個正則表達式的字符串,然后使用新字符串代替匹配的字符串。

search () – 執行一個正則表達式匹配查找。如果查找成功,返回字符串中匹配的索引值。否則返回 -1 。

split () – 通過將字符串劃分成子串,將一個字符串做成一個字符串數組。

length – 返回字符串的長度,所謂字符串的長度是指其包含的字符的個數。

toLowerCase () – 將整個字符串轉成小寫字母。

toUpperCase () – 將整個字符串轉成大寫字母。

5、怎樣添加、移除、移動、復制、創建和查找節點?
1)創建新節點

  createDocumentFragment () // 創建一個 DOM 片段

  createElement () // 創建一個具體的元素

  createTextNode () // 創建一個文本節點

2)添加、移除、替換、插入

  appendChild () // 添加

  removeChild () // 移除

  replaceChild () // 替換

  insertBefore () // 插入

3)查找

  getElementsByTagName () // 通過標簽名稱

  getElementsByName () // 通過元素的 Name 屬性的值

  getElementById () // 通過元素 Id,唯一性

6、寫出 3 個使用 this 的典型應用
(1)、在 html 元素事件屬性中使用,如:

<input type=”button” onclick=”showInfo (this);” value=” 點擊一下”/>

(2)、構造函數

function Animal(name, color) {
  this.name = name;
  this.color = color;
}

(3)、input 點擊,獲取值

<input type="button" id="text" value="點擊一下" /><script type="text/javascript">
var btn = document.getElementById("text");
btn.onclick = function() {
alert(this.value); //此處的this是按鈕元素
}</script>

(4)、apply ()/call () 求數組最值

var numbers = [5, 458 , 120 , -215 ];
var maxInNumbers = Math.max.apply(this, numbers);
console.log(maxInNumbers); // 458
var maxInNumbers = Math.max.call(this,5, 458 , 120 , -215);
console.log(maxInNumbers); // 458

7、比較 typeof 與 instanceof?
相同點:JavaScript 中 typeof 和 instanceof 常用來判斷一個變量是否為空,或者是什么類型的。

typeof 的定義和用法:返回值是一個字符串,用來說明變量的數據類型。

細節:

(1)、typeof 一般只能返回如下幾個結果:number,boolean,string,function,object,undefined。

(2)、typeof 來獲取一個變量是否存在,如 if (typeof a!="undefined"){alert ("ok")},而不要去使用 if (a) 因為如果 a 不存在(未聲明)則會出錯。

(3)、對于 Array,Null 等特殊對象使用 typeof 一律返回 object,這正是 typeof 的局限性。

Instanceof 定義和用法:instanceof 用于判斷一個變量是否屬于某個對象的實例。

實例演示:

a instanceof b?alert ("true"):alert ("false"); //a 是 b 的實例?真:假

var a = new Array();
alert(a instanceof Array); // true
alert(a instanceof Object) // true

如上,會返回 true,同時 alert (a instanceof Object) 也會返回 true; 這是因為 Array 是 object 的子類。

function test(){};
var a = new test();
alert(a instanceof test) // true

細節:

(1)、如下,得到的結果為‘N’, 這里的 instanceof 測試的 object 是指 js 語法中的 object,不是指 dom 模型對象。

if (window instanceof Object){ alert('Y')} else { alert('N');} //'N'

如何理解閉包?
1、定義和用法:當一個函數的返回值是另外一個函數,而返回的那個函數如果調用了其父函數內部的其它變量,如果返回的這個函數在外部被執行,就產生了閉包。

2、表現形式:使函數外部能夠調用函數內部定義的變量。

3、實例如下:

(1)、根據作用域鏈的規則,底層作用域沒有聲明的變量,會向上一級找,找到就返回,沒找到就一直找,直到 window 的變量,沒有就返回 undefined。這里明顯 count 是函數內部的 flag2 的那個 count 。

var count=10; //全局作用域 標記為flag1
function add(){
var count=0; //函數全局作用域 標記為flag2
return function(){
count+=1; //函數的內部作用域
alert(count);
}
}
var s = add()
s();//輸出1
s();//輸出2

變量的作用域
要理解閉包,首先必須理解 Javascript 特殊的變量作用域。

變量的作用域分類:全局變量和局部變量。

特點:

1、函數內部可以讀取函數外部的全局變量;在函數外部無法讀取函數內的局部變量。

2、函數內部聲明變量的時候,一定要使用 var 命令。如果不用的話,你實際上聲明了一個全局變量!

使用閉包的注意點
1)濫用閉包,會造成內存泄漏:由于閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在 IE 中可能導致內存泄露。解決方法是,在退出函數之前,將不使用的局部變量全部刪除。

2)會改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。

什么是跨域?跨域請求資源的方法有哪些?
1、什么是跨域?

由于瀏覽器同源策略,凡是發送請求 url 的協議、域名、端口三者之間任意一與當前頁面地址不同即為跨域。存在跨域的情況:

網絡協議不同,如 http 協議訪問 https 協議。

端口不同,如 80 端口訪問 8080 端口。

域名不同,如 http://qianduanblog.com 訪問 http://baidu.com。

子域名不同,如 http://abc.qianduanblog.com 訪問 http://def.qianduanblog.com。

域名和域名對應 ip, 如 http://www.a.com 訪問 20.205.28.90.

2、跨域請求資源的方法:

(1)、porxy 代理

定義和用法:proxy 代理用于將請求發送給后臺服務器,通過服務器來發送請求,然后將請求的結果傳遞給前端。

實現方法:通過 nginx 代理;

注意點:1、如果你代理的是 https 協議的請求,那么你的 proxy 首先需要信任該證書(尤其是自定義證書)或者忽略證書檢查,否則你的請求無法成功。

(2)、CORS 【Cross-Origin Resource Sharing】

定義和用法:是現代瀏覽器支持跨域資源請求的一種最常用的方式。

使用方法:一般需要后端人員在處理請求數據的時候,添加允許跨域的相關操作。如下:

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'
});

(3)、jsonp

定義和用法:通過動態插入一個 script 標簽。瀏覽器對 script 的資源引用沒有同源限制,同時資源加載到頁面后會立即執行(沒有阻塞的情況下)。

特點:通過情況下,通過動態創建 script 來讀取他域的動態資源,獲取的數據一般為 json 格式。

實例如下:

<script>
function testjsonp(data) { console.log(data.name); // 獲取返回的結果
}</script><script>
var _script = document.createElement('script');
_script.type = "text/javascript";
_script.src = "http://localhost:8888/jsonp?callback=testjsonp"; document.head.appendChild(_script);</script>

缺點:

  1、這種方式無法發送 post 請求(這里)

  2、另外要確定 jsonp 的請求是否失敗并不容易,大多數框架的實現都是結合超時時間來判定。
談談垃圾回收機制方式及內存管理
回收機制方式

1、定義和用法:垃圾回收機制 (GC:Garbage Collection), 執行環境負責管理代碼執行過程中使用的內存。

2、原理:垃圾收集器會定期(周期性)找出那些不在繼續使用的變量,然后釋放其內存。但是這個過程不是實時的,因為其開銷比較大,所以垃圾回收器會按照固定的時間間隔周期性的執行。

3、實例如下:

function fn1() {
var obj = {name: 'hanzichi', age: 10};
}
function fn2() {
var obj = {name:'hanzichi', age: 10};
return obj;
}
var a = fn1();
var b = fn2();

fn1 中定義的 obj 為局部變量,而當調用結束后,出了 fn1 的環境,那么該塊內存會被 js 引擎中的垃圾回收器自動釋放;在 fn2 被調用的過程中,返回的對象被全局變量 b 所指向,所以該塊內存并不會被釋放。

4、垃圾回收策略:標記清除 (較為常用) 和引用計數。

標記清除:

  定義和用法:當變量進入環境時,將變量標記 "進入環境",當變量離開環境時,標記為:"離開環境"。某一個時刻,垃圾回收器會過濾掉環境中的變量,以及被環境變量引用的變量,剩下的就是被視為準備回收的變量。

  到目前為止,IE、Firefox、Opera、Chrome、Safari 的 js 實現使用的都是標記清除的垃圾回收策略或類似的策略,只不過垃圾收集的時間間隔互不相同。

引用計數:

  定義和用法:引用計數是跟蹤記錄每個值被引用的次數。

  基本原理:就是變量的引用次數,被引用一次則加 1,當這個引用計數為 0 時,被視為準備回收的對象。

內存管理

1、什么時候觸發垃圾回收?

垃圾回收器周期性運行,如果分配的內存非常多,那么回收工作也會很艱巨,確定垃圾回收時間間隔就變成了一個值得思考的問題。

IE6 的垃圾回收是根據內存分配量運行的,當環境中的變量,對象,字符串達到一定數量時觸發垃圾回收。垃圾回收器一直處于工作狀態,嚴重影響瀏覽器性能。

IE7 中,垃圾回收器會根據內存分配量與程序占用內存的比例進行動態調整,開始回收工作。

2、合理的 GC 方案:(1)、遍歷所有可訪問的對象;(2)、回收已不可訪問的對象。

3、GC 缺陷:(1)、停止響應其他操作;

4、GC 優化策略:(1)、分代回收(Generation GC);(2)、增量 GC

開發過程中遇到的內存泄露情況,如何解決的?
1、定義和用法:

內存泄露是指一塊被分配的內存既不能使用,又不能回收,直到瀏覽器進程結束。C# 和 Java 等語言采用了自動垃圾回收方法管理內存,幾乎不會發生內存泄露。我們知道,瀏覽器中也是采用自動垃圾回收方法管理內存,但由于瀏覽器垃圾回收方法有 bug,會產生內存泄露。

2、內存泄露的幾種情況:

(1)、當頁面中元素被移除或替換時,若元素綁定的事件仍沒被移除,在 IE 中不會作出恰當處理,此時要先手工移除事件,不然會存在內存泄露。

實例如下:

<div id="myDiv">
<input type="button" value="Click me" id="myBtn"></div><script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){ document.getElementById("myDiv").innerHTML = "Processing...";
}</script>

解決方法如下:

<div id="myDiv">
<input type="button" value="Click me" id="myBtn"></div><script type="text/javascript">
var btn = document.getElementById("myBtn");
btn.onclick = function(){
btn.onclick = null; document.getElementById("myDiv").innerHTML = "Processing...";
}</script>

(2)、由于是函數內定義函數,并且內部函數 -- 事件回調的引用外暴了,形成了閉包。閉包可以維持函數內局部變量,使其得不到釋放。

實例如下:

function bindEvent(){
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
}

解決方法如下:

function bindEvent(){
var obj=document.createElement("XXX");
obj.onclick=function(){
//Even if it's a empty function
}
obj=null;
}

javascript 面向對象中繼承實現?
面向對象的基本特征有:封閉、繼承、多態。

在 JavaScript 中實現繼承的方法:

原型鏈(prototype chaining)call()/apply()混合方式 (prototype 和 call ()/apply () 結合)對象冒充

繼承的方法如下:

1、prototype 原型鏈方式:

function teacher(name){
this.name = name;
}
teacher.prototype.sayName = function(){
console.log("name is "+this.name);
}
var teacher1 = new teacher("xiaoming");
teacher1.sayName();

function student(name){
this.name = name;
}
student.prototype = new teacher()
var student1 = new student("xiaolan");
student1.sayName();
// name is xiaoming
// name is xiaolan

2、call ()/apply () 方法

function teacher(name,age){
this.name = name;
this.age = age;
this.sayhi = function(){
alert('name:'+name+", age:"+age);
}
}
function student(){
var args = arguments;
teacher.call(this,args[0],args[1]);
// teacher.apply(this,arguments);
}
var teacher1 = new teacher('xiaoming',23);
teacher1.sayhi();

var student1 = new student('xiaolan',12);
student1.sayhi();

// alert: name:xiaoming, age:23
// alert: name:xiaolan, age:12

3、混合方法【prototype,call/apply】

01function teacher(name,age){
02this.name = name;
03this.age = age;
04}
05teacher.prototype.sayName = function(){
06console.log('name:'+this.name);
07}
08teacher.prototype.sayAge = function(){
09console.log('age:'+this.age);
10}
11
12function student(){
13var args = arguments;
14teacher.call(this,args[0],args[1]);
15}
16student.prototype = new teacher();
17
18var student1 = new student('xiaolin',23);
19student1.sayName();
20student1.sayAge();
21// name:xiaolin
22// age:23

4、對象冒充

01function Person(name,age){
02this.name = name;
03this.age = age;
04this.show = function(){
05console.log(this.name+", "+this.age);
06}
07}
08
09function Student(name,age){
10this.student = Person; // 將 Person 類的構造函數賦值給 this.student
11this.student (name,age); //js 中實際上是通過對象冒充來實現繼承的
12delete this.student; // 移除對 Person 的引用
13}
14
15var s = new Student ("小明",17);
16s.show();
17
18var p = new Person ("小花",18);
19p.show();
20// 小明,17
21// 小花,18

判斷一個字符串中出現次數最多的字符,統計這個次數
01var str = 'asdfssaaasasasasaa';
02var json = {};
03for (var i = 0; i < str.length; i++) {
04 if(!json[str.charAt(i)]){
05 json[str.charAt(i)] = 1;
06 }else{
07 json[str.charAt(i)]++;
08 }
09};
10var iMax = 0;
11var iIndex = '';
12for(var i in json){
13 if(json[i]>iMax){
14 iMax = json[i];
15 iIndex = i;
16 }
17}
18console.log (' 出現次數最多的是:'+iIndex+' 出現 '+iMax+' 次 ');
19 結果如下:出現次數最多的是:a 出現 9 次

Array 相關的屬性和方法
這里只是做了相關的列舉,具體的使用方法,請參考網址。

Array 對象屬性

constructor 返回對創建此對象的數組函數的引用。

length 設置或返回數組中元素的數目。

prototype 使您有能力向對象添加屬性和方法。

Array 對象方法
concat () 連接兩個或更多的數組,并返回結果。

join () 把數組的所有元素放入一個字符串。元素通過指定的分隔符進行分隔。

pop () 刪除并返回數組的最后一個元素。

shift () 刪除并返回數組的第一個元素

push () 向數組的末尾添加一個或更多元素,并返回新的長度。

unshift () 向數組的開頭添加一個或更多元素,并返回新的長度。

reverse () 顛倒數組中元素的順序。

slice () 從某個已有的數組返回選定的元素

sort () 對數組的元素進行排序

splice () 刪除元素,并向數組添加新元素。

toSource () 返回該對象的源代碼。

toString () 把數組轉換為字符串,并返回結果。

toLocaleString () 把數組轉換為本地數組,并返回結果。

valueOf () 返回數組對象的原始值

2、編寫一個方法 去掉一個數組的重復元素
方法一:

01var arr = [0,2,3,4,4,0,2];
02var obj = {};
03var tmp = [];
04for(var i = 0 ;i< arr.length;i++){
05 if( !obj[arr[i]] ){
06 obj[arr[i]] = 1;
07 tmp.push(arr[i]);
08 }
09}
10console.log(tmp);
11 結果如下: [0, 2, 3, 4]

方法二:

1var arr = [2,3,4,4,5,2,3,6],
2 arr2 = [];
3for(var i = 0;i< arr.length;i++){
4 if(arr2.indexOf(arr[i]) < 0){
5 arr2.push(arr[i]);
6 }
7}
8console.log(arr2);
9 結果為:[2, 3, 4, 5, 6]

方法三:

1var arr = [2,3,4,4,5,2,3,6];
2var arr2 = arr.filter(function(element,index,self){
3return self.indexOf(element) === index;
4});
5console.log(arr2);
6
7 結果為:[2, 3, 4, 5, 6]

jQuery 庫中的 $() 是什么?
  $() 函數是 jQuery () 函數的別稱。$() 函數用于將任何對象包裹成 jQuery 對象,接著你就被允許調用定義在 jQuery 對象上的多個不同方法。你可以將一個選擇器字符串傳入 $() 函數,它會返回一個包含所有匹配的 DOM 元素數組的 jQuery 對象。

如何找到所有 HTML select 標簽的選中項?
$('[name=selectname] :selected')

$(this) 和 this 關鍵字在 jQuery 中有何不同?
$(this) 返回一個 jQuery 對象,你可以對它調用多個 jQuery 方法,比如用 text () 獲取文本,用 val () 獲取值等等。

而 this 代表當前元素,它是 JavaScript 關鍵詞中的一個,表示上下文中的當前 DOM 元素。你不能對它調用 jQuery 方法,直到它被 $() 函數包裹,例如 $(this)。

jquery 怎么移除標簽 onclick 屬性?
獲得 a 標簽的 onclick 屬性: $("a").attr ("onclick")

刪除 onclick 屬性:$("a").removeAttr ("onclick");

設置 onclick 屬性:$("a").attr ("onclick","test ();");

jquery 中 addClass,removeClass,toggleClass 的使用。
$(selector).addClass (class):為每個匹配的元素添加指定的類名

$(selector).removeClass (class):從所有匹配的元素中刪除全部或者指定的類,刪除 class 中某個值;

$(selector).toggleClass (class):如果存在(不存在)就刪除(添加)一個類

$(selector).removeAttr (class); 刪除 class 這個屬性;

JQuery 有幾種選擇器?
(1)、基本選擇器:#id,class,element,*;

(2)、層次選擇器:parent > child,prev + next ,prev ~ siblings

(3)、基本過濾器選擇器::first,:last ,:not ,:even ,:odd ,:eq ,:gt ,:lt

(4)、內容過濾器選擇器: :contains ,:empty ,:has ,:parent

(5)、可見性過濾器選擇器::hidden ,:visible

(6)、屬性過濾器選擇器:[attribute] ,[attribute=value] ,[attribute!=value] ,[attribute^=value] ,[attribute$=value] ,[attribute*=value]

(7)、子元素過濾器選擇器::nth-child ,:first-child ,:last-child ,:only-child

(8)、表單選擇器: :input ,:text ,:password ,:radio ,:checkbox ,:submit 等;

(9)、表單過濾器選擇器::enabled ,:disabled ,:checked ,:selected

jQuery 中的 Delegate () 函數有什么作用?
delegate () 會在以下兩個情況下使用到:

1、如果你有一個父元素,需要給其下的子元素添加事件,這時你可以使用 delegate () 了,代碼如下:

$("ul").delegate("li", "click", function(){ $(this).hide(); });

2、當元素在當前頁面中不可用時,可以使用 delegate ()

$(document).ready () 方法和 window.onload 有什么區別?
(1)、window.onload 方法是在網頁中所有的元素 (包括元素的所有關聯文件) 完全加載到瀏覽器后才執行的。

(2)、$(document).ready () 方法可以在 DOM 載入就緒時就對其進行操縱,并調用執行綁定的函數。

如何用 jQuery 禁用瀏覽器的前進后退按鈕?
實現代碼如下:

1<script type="text/javascript" language="javascript">
2  $(document).ready(function() {
3    window.history.forward(1);
4     //OR window.history.forward(-1);
5  });
6</script>

jquery 中 $.get () 提交和 $.post () 提交有區別嗎?
相同點:都是異步請求的方式來獲取服務端的數據;

異同點:

1、請求方式不同:$.get () 方法使用 GET 方法來進行異步請求的。$.post () 方法使用 POST 方法來進行異步請求的。

2、參數傳遞方式不同:get 請求會將參數跟在 URL 后進行傳遞,而 POST 請求則是作為 HTTP 消息的實體內容發送給 Web 服務器的,這種傳遞是對用戶不可見的。

3、數據傳輸大小不同:get 方式傳輸的數據大小不能超過 2KB 而 POST 要大的多

4、安全問題: GET 方式請求的數據會被瀏覽器緩存起來,因此有安全問題。

寫出一個簡單的 $.ajax () 的請求方式?
01$.ajax({
02 url:'http://www.baidu.com',
03 type:'POST',
04 data:data,
05 cache:true,
06 headers:{},
07 beforeSend:function(){},
08 success:function(){},
09 error:function(){},
10 complete:function(){}
11});

jQuery 的事件委托方法 bind 、live、delegate、on 之間有什么區別?
(1)、bind 【jQuery 1.3 之前】

定義和用法:主要用于給選擇到的元素上綁定特定事件類型的監聽函數;

語法:bind (type,[data],function (eventObject));

特點:

  (1)、適用于頁面元素靜態綁定。只能給調用它的時候已經存在的元素綁定事件,不能給未來新增的元素綁定事件。

  (2)、當頁面加載完的時候,你才可以進行 bind (),所以可能產生效率問題。

實例如下:$("#members li a").bind ( "click", function ( e ) {} );

(2)、live 【jQuery 1.3 之后】

定義和用法:主要用于給選擇到的元素上綁定特定事件類型的監聽函數;

語法:live (type, [data], fn);

特點:

  (1)、live 方法并沒有將監聽器綁定到自己 (this) 身上,而是綁定到了 this.context 上了。

  (2)、live 正是利用了事件委托機制來完成事件的監聽處理,把節點的處理委托給了 document,新添加的元素不必再綁定一次監聽器。

  (3)、使用 live()方法但卻只能放在直接選擇的元素后面,不能在層級比較深,連綴的 DOM 遍歷方法后面使用,即 $(“ul”").live... 可以,但 $("body").find ("ul").live... 不行;

實例如下:$(document).on ( "click", "#members li a", function ( e ) {} );

(3)、delegate 【jQuery 1.4.2 中引入】

定義和用法:將監聽事件綁定在就近的父級元素上

語法:delegate (selector,type,[data],fn)

特點:

  (1)、選擇就近的父級元素,因為事件可以更快的冒泡上去,能夠在第一時間進行處理。

  (2)、更精確的小范圍使用事件代理,性能優于.live ()。可以用在動態添加的元素上。

實例如下:

$("#info_table").delegate("td","click",function(){/ 顯示更多信息 /});

$("table").find("#info").delegate("td","click",function(){/ 顯示更多信息 /});

(4)、on 【1.7 版本整合了之前的三種方式的新事件綁定機制】

定義和用法:將監聽事件綁定到指定元素上。

語法:on (type,[selector],[data],fn)

實例如下:$("#info_table").on ("click","td",function (){/ 顯示更多信息 /}); 參數的位置寫法與 delegate 不一樣。

說明:on 方法是當前 JQuery 推薦使用的事件綁定方法,附加只運行一次就刪除函數的方法是 one ()。

總結:.bind (), .live (), .delegate (),.on () 分別對應的相反事件為:.unbind (),.die (), .undelegate (),.off ()

什么是盒子模型?
在網頁中,一個元素占有空間的大小由幾個部分構成,其中包括元素的內容(content),元素的內邊距(padding),元素的邊框(border),元素的外邊距(margin)四個部分。這四個部分占有的空間中,有的部分可以顯示相應的內容,而有的部分只用來分隔相鄰的區域或區域。4 個部分一起構成了 css 中元素的盒模型。

行內元素有哪些?塊級元素有哪些? 空 (void) 元素有那些?
行內元素:a、b、span、img、input、strong、select、label、em、button、textarea

塊級元素:div、ul、li、dl、dt、dd、p、h2-h7、blockquote

空元素:即系沒有內容的 HTML 元素,例如:br、meta、hr、link、input、img

CSS 實現垂直水平居中
一道經典的問題,實現方法有很多種,以下是其中一種實現:

HTML 結構:

01<div class="wrapper">
02 <div class="content"></div>
03</div>
04CSS:
05
06.wrapper {
07 position: relative;
08 width: 500px;
09 height: 500px;
10 border: 1px solid red;
11 }
12.content{
13 position: absolute;
14 width: 200px;
15 height: 200px;
16 /top、bottom、left 和 right 均設置為 0/
17 top: 0;
18 bottom: 0;
19 left: 0;
20 right: 0;
21 /margin 設置為 auto/
22 margin:auto;
23 border: 1px solid green;
24}

簡述一下 src 與 href 的區別
href 是指向網絡資源所在位置,建立和當前元素(錨點)或當前文檔(鏈接)之間的鏈接,用于超鏈接。

src 是指向外部資源的位置,指向的內容將會嵌入到文檔中當前標簽所在位置;在請求 src 資源時會將其指向的資源下載并應用到文檔內,例如 js 腳本,img 圖片和 frame 等元素。

當瀏覽器解析到該元素時,會暫停其他資源的下載和處理,直到將該資源加載、編譯、執行完畢,圖片和框架等元素也如此,類似于將所指向資源嵌入當前標簽內。這也是為什么將 js 腳本放在底部而不是頭部。

簡述同步和異步的區別
同步是阻塞模式,異步是非阻塞模式。

同步就是指一個進程在執行某個請求的時候,若該請求需要一段時間才能返回信息,那么這個進程將會一直等待下去,直到收到返回信息才繼續執行下去;

異步是指進程不需要一直等下去,而是繼續執行下面的操作,不管其他進程的狀態。當有消息返回時系統會通知進程進行處理,這樣可以提高執行的效率。

px 和 em 的區別
相同點:px 和 em 都是長度單位;

異同點:px 的值是固定的,指定是多少就是多少,計算比較容易。em 得值不是固定的,并且 em 會繼承父級元素的字體大小。

瀏覽器的默認字體高都是 16px。所以未經調整的瀏覽器都符合: 1em=16px。那么 12px=0.75em, 10px=0.625em。

瀏覽器的內核分別是什么?
IE: trident 內核

Firefox:gecko 內核

Safari:webkit 內核

Opera:以前是 presto 內核,Opera 現已改用 Google Chrome 的 Blink 內核

Chrome:Blink (基于 webkit,Google 與 Opera Software 共同開發)

什么叫優雅降級和漸進增強?
漸進增強 progressive enhancement:

針對低版本瀏覽器進行構建頁面,保證最基本的功能,然后再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。

優雅降級 graceful degradation:

一開始就構建完整的功能,然后再針對低版本瀏覽器進行兼容。

區別:

優雅降級是從復雜的現狀開始,并試圖減少用戶體驗的供給漸進增強則是從一個非常基礎的,能夠起作用的版本開始,并不斷擴充,以適應未來環境的需要降級(功能衰減)意味著往回看;而漸進增強則意味著朝前看,同時保證其根基處于安全地帶

sessionStorage 、localStorage 和 cookie 之間的區別
共同點:用于瀏覽器端存儲的緩存數據

不同點:

(1)、存儲內容是否發送到服務器端:當設置了 Cookie 后,數據會發送到服務器端,造成一定的寬帶浪費;

web storage, 會將數據保存到本地,不會造成寬帶浪費;

(2)、數據存儲大小不同:Cookie 數據不能超過 4K, 適用于會話標識;web storage 數據存儲可以達到 5M;

(3)、數據存儲的有效期限不同:cookie 只在設置了 Cookid 過期時間之前一直有效,即使關閉窗口或者瀏覽器;

sessionStorage, 僅在關閉瀏覽器之前有效;localStorage, 數據存儲永久有效;

(4)、作用域不同:cookie 和 localStorage 是在同源同窗口中都是共享的;sessionStorage 不在不同的瀏覽器窗口中共享,即使是同一個頁面;

Web Storage 與 Cookie 相比存在的優勢:
(1)、存儲空間更大:IE8 下每個獨立的存儲空間為 10M,其他瀏覽器實現略有不同,但都比 Cookie 要大很多。

(2)、存儲內容不會發送到服務器:當設置了 Cookie 后,Cookie 的內容會隨著請求一并發送的服務器,這對于本地存儲的數據是一種帶寬浪費。而 Web Storage 中的數據則僅僅是存在本地,不會與服務器發生任何交互。

(3)、更多豐富易用的接口:Web Storage 提供了一套更為豐富的接口,如 setItem,getItem,removeItem,clear 等,使得數據操作更為簡便。cookie 需要自己封裝。

(4)、獨立的存儲空間:每個域(包括子域)有獨立的存儲空間,各個存儲空間是完全獨立的,因此不會造成數據混亂。

Ajax 的優缺點及工作原理?
定義和用法:

AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。Ajax 是一種用于創建快速動態網頁的技術。Ajax 是一種在無需重新加載整個網頁的情況下,能夠更新部分網頁的技術。

傳統的網頁(不使用 Ajax)如果需要更新內容,必須重載整個網頁頁面。

優點:

1. 減輕服務器的負擔,按需取數據,最大程度的減少冗余請求

2. 局部刷新頁面,減少用戶心理和實際的等待時間,帶來更好的用戶體驗

3. 基于 xml 標準化,并被廣泛支持,不需安裝插件等,進一步促進頁面和數據的分離

缺點:

1.AJAX 大量的使用了 javascript 和 ajax 引擎,這些取決于瀏覽器的支持。在編寫的時候考慮對瀏覽器的兼容性.

2.AJAX 只是局部刷新,所以頁面的后退按鈕是沒有用的.

3. 對流媒體還有移動設備的支持不是太好等

AJAX 的工作原理:
1. 創建 ajax 對象(XMLHttpRequest/ActiveXObject (Microsoft.XMLHttp))

2. 判斷數據傳輸方式 (GET/POST)

3. 打開鏈接 open ()

4. 發送 send ()

5. 當 ajax 對象完成第四步(onreadystatechange)數據接收完成,判斷 http 響應狀態(status)200-300 之間或者 304(緩存)執行回調函數

請指出 document load 和 document ready 的區別?
共同點:這兩種事件都代表的是頁面文檔加載時觸發。

異同點:

ready 事件的觸發,表示文檔結構已經加載完成(不包含圖片等非文字媒體文件)。

onload 事件的觸發,表示頁面包含圖片等文件在內的所有元素都加載完成。

寫一個 function,清除字符串前后的空格。(兼容所有瀏覽器)
1function trim(str) {
2 if (str && typeof str === "string") {
3 return str.replace(/(^s)|(s)$/g,""); // 去除前后空白符
4 }
5}

使用正則表達式驗證郵箱格式
1var reg = /^(w)+(.w+)*@(w)+((.w{2,3}){1,3})$/;
2var email = "example@qq.com";
3console.log(reg.test(email)); // true

規避 javascript 多人開發函數重名問題
命名空間

封閉空間

js 模塊化 mvc(數據層、表現層、控制層)

seajs

變量轉換成對象的屬性

對象化

請說出三種減低頁面加載時間的方法
壓縮 css、js 文件

合并 js、css 文件,減少 http 請求

外部 js、css 文件放在最底下

減少 dom 操作,盡可能用變量替代不必要的 dom 操作

你所了解到的 Web 攻擊技術
(1)XSS(Cross-Site Scripting,跨站腳本攻擊):指通過存在安全漏洞的 Web 網站注冊用戶的瀏覽器內運行非法的 HTML 標簽或者 JavaScript 進行的一種攻擊。

(2)SQL 注入攻擊

(3)CSRF(Cross-Site Request Forgeries,跨站點請求偽造):指攻擊者通過設置好的陷阱,強制對已完成的認證用戶進行非預期的個人信息或設定信息等某些狀態更新。

web 前端開發,如何提高頁面性能優化?
內容方面:

1. 減少 HTTP 請求 (Make Fewer HTTP Requests)

2. 減少 DOM 元素數量 (Reduce the Number of DOM Elements)

3. 使得 Ajax 可緩存 (Make Ajax Cacheable)

針對 CSS:

1. 把 CSS 放到代碼頁上端 (Put Stylesheets at the Top)

2. 從頁面中剝離 JavaScript 與 CSS (Make JavaScript and CSS External)

3. 精簡 JavaScript 與 CSS (Minify JavaScript and CSS)

4. 避免 CSS 表達式 (Avoid CSS Expressions)

針對 JavaScript :

腳本放到 HTML 代碼頁底部 (Put Scripts at the Bottom)從頁面中剝離 JavaScript 與 CSS (Make JavaScript and CSS External)精簡 JavaScript 與 CSS (Minify JavaScript and CSS)移除重復腳本 (Remove Duplicate Scripts)

面向圖片 (Image):

1. 優化圖片

2 不要在 HTML 中使用縮放圖片

3 使用恰當的圖片格式

4 使用 CSS Sprites 技巧對圖片優化

5、前端開發中,如何優化圖像?圖像格式的區別?

優化圖像:

1、不用圖片,盡量用 css3 代替。 比如說要實現修飾效果,如半透明、邊框、圓角、陰影、漸變等,在當前主流瀏覽器中都可以用 CSS 達成。

2、 使用矢量圖 SVG 替代位圖。對于絕大多數圖案、圖標等,矢量圖更小,且可縮放而無需生成多套圖。現在主流瀏覽器都支持 SVG 了,所以可放心使用!

3.、使用恰當的圖片格式。我們常見的圖片格式有 JPEG、GIF、PNG。

基本上,內容圖片多為照片之類的,適用于 JPEG。

而修飾圖片通常更適合用無損壓縮的 PNG。

GIF 基本上除了 GIF 動畫外不要使用。且動畫的話,也更建議用 video 元素和視頻格式,或用 SVG 動畫取代。

4、按照 HTTP 協議設置合理的緩存。

5、使用字體圖標 webfont、CSS Sprites 等。

6、用 CSS 或 JavaScript 實現預加載。

7、WebP 圖片格式能給前端帶來的優化。WebP 支持無損、有損壓縮,動態、靜態圖片,壓縮比率優于 GIF、JPEG、JPEG2000、PG 等格式,非常適合用于網絡等圖片傳輸。

圖像格式的區別:
矢量圖:圖標字體,如 font-awesome;svg

位圖:gif,jpg (jpeg),png

區別:

  1、gif: 是是一種無損,8 位圖片格式。具有支持動畫,索引透明,壓縮等特性。適用于做色彩簡單 (色調少) 的圖片,如 logo, 各種小圖標 icons 等。

  2、JPEG 格式是一種大小與質量相平衡的壓縮圖片格式。適用于允許輕微失真的色彩豐富的照片,不適合做色彩簡單 (色調少) 的圖片,如 logo, 各種小圖標 icons 等。

  3、png:PNG 可以細分為三種格式:PNG8,PNG24,PNG32。后面的數字代表這種 PNG 格式最多可以索引和存儲的顏色值。

關于透明:PNG8 支持索引透明和 alpha 透明;PNG24 不支持透明;而 PNG32 在 24 位的 PNG 基礎上增加了 8 位(256 階)的 alpha 通道透明;

優缺點:

  1、能在保證最不失真的情況下盡可能壓縮圖像文件的大小。

  2、對于需要高保真的較復雜的圖像,PNG 雖然能無損壓縮,但圖片文件較大,不適合應用在 Web 頁面上。

瀏覽器是如何渲染頁面的?
渲染的流程如下:

1. 解析 HTML 文件,創建 DOM 樹。

自上而下,遇到任何樣式(link、style)與腳本(script)都會阻塞(外部樣式不阻塞后續外部腳本的加載)。

2. 解析 CSS。優先級:瀏覽器默認設置 < 用戶設置 < 外部樣式 < 內聯樣式 < HTML 中的 style 樣式;

3. 將 CSS 與 DOM 合并,構建渲染樹(Render Tree)

4. 布局和繪制,重繪(repaint)和重排(reflow)

感謝各位的閱讀!關于Web前端開發常見的一些面試題及解決方法就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

砚山县| 巴林右旗| 洱源县| 凤山县| 中宁县| 顺平县| 闵行区| 宿州市| 东乡县| 启东市| 会昌县| 辽中县| 蒲江县| 晋城| 横山县| 安义县| 曲麻莱县| 揭阳市| 香港| 含山县| 通海县| 海林市| 长寿区| 商洛市| 瓦房店市| 汨罗市| 高平市| 同江市| 如东县| 海城市| 锡林郭勒盟| 辽中县| 正定县| 灵台县| 建水县| 罗定市| 武清区| 刚察县| 获嘉县| 井陉县| 廉江市|