來源:執(zhí)波仔丶 發(fā)布時間:2018-11-22 14:54:11 閱讀量:1029
javascript:
JavaScript中如何檢測一個變量是一個String類型?請寫出函數(shù)實現(xiàn)
typeof(obj) === "string"
typeof obj === "string"
obj.constructor === String
請用js去除字符串空格?
方法一:使用replace正則匹配的方法
去除所有空格: str = str.replace(/\s*/g,"");
去除兩頭空格: str = str.replace(/^\s*|\s*$/g,"");
去除左空格: str = str.replace( /^\s*/, “”);
去除右空格: str = str.replace(/(\s*$)/g, "");
str為要去除空格的字符串,實例如下:
var str = " 23 23 ";
var str2 = str.replace(/\s*/g,"");
console.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
你如何獲取瀏覽器URL中查詢字符串中的參數(shù)?
測試地址為: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(); // obj
console.log(href['name']); // xiaoming
js 字符串操作函數(shù)
我這里只是列舉了常用的字符串函數(shù),具體使用方法,請參考網(wǎng)址。
concat() – 將兩個或多個字符的文本組合起來,返回一個新的字符串。
indexOf() – 返回字符串中一個子串第一處出現(xiàn)的索引。如果沒有匹配項,返回 -1 。
charAt() – 返回指定位置的字符。
lastIndexOf() – 返回字符串中一個子串最后一處出現(xiàn)的索引,如果沒有匹配項,返回 -1 。
match() – 檢查一個字符串是否匹配一個正則表達式。
substr() 函數(shù) -- 返回從string的startPos位置,長度為length的字符串
substring() – 返回字符串的一個子串。傳入?yún)?shù)是起始位置和結(jié)束位置。
slice() – 提取字符串的一部分,并返回一個新字符串。
replace() – 用來查找匹配一個正則表達式的字符串,然后使用新字符串代替匹配的字符串。
search() – 執(zhí)行一個正則表達式匹配查找。如果查找成功,返回字符串中匹配的索引值。否則返回 -1 。
split() – 通過將字符串劃分成子串,將一個字符串做成一個字符串數(shù)組。
length – 返回字符串的長度,所謂字符串的長度是指其包含的字符的個數(shù)。
toLowerCase() – 將整個字符串轉(zhuǎn)成小寫字母。
toUpperCase() – 將整個字符串轉(zhuǎn)成大寫字母。
怎樣添加、移除、移動、復制、創(chuàng)建和查找節(jié)點?
1)創(chuàng)建新節(jié)點
createDocumentFragment() //創(chuàng)建一個DOM片段
createElement() //創(chuàng)建一個具體的元素
createTextNode() //創(chuàng)建一個文本節(jié)點
2)添加、移除、替換、插入
appendChild() //添加
removeChild() //移除
replaceChild() //替換
insertBefore() //插入
3)查找
getElementsByTagName() //通過標簽名稱
getElementsByName() //通過元素的Name屬性的值
getElementById() //通過元素Id,唯一性
寫出3個使用this的典型應用
(1)、在html元素事件屬性中使用,如:
<input type=”button” onclick=”showInfo(this);” value=”點擊一下”/>
(2)、構(gòu)造函數(shù)
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()求數(shù)組最值
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
比較typeof與instanceof?
相同點:JavaScript 中 typeof 和 instanceof 常用來判斷一個變量是否為空,或者是什么類型的。
typeof的定義和用法:返回值是一個字符串,用來說明變量的數(shù)據(jù)類型。
細節(jié):
(1)、typeof 一般只能返回如下幾個結(jié)果: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
細節(jié):
(1)、如下,得到的結(jié)果為‘N’,這里的 instanceof 測試的 object 是指 js 語法中的 object,不是指 dom 模型對象。
if (window instanceof Object){ alert('Y')} else { alert('N');} // 'N'
如何理解閉包?
1、定義和用法:當一個函數(shù)的返回值是另外一個函數(shù),而返回的那個函數(shù)如果調(diào)用了其父函數(shù)內(nèi)部的其它變量,如果返回的這個函數(shù)在外部被執(zhí)行,就產(chǎn)生了閉包。
2、表現(xiàn)形式:使函數(shù)外部能夠調(diào)用函數(shù)內(nèi)部定義的變量。
3、實例如下:
(1)、根據(jù)作用域鏈的規(guī)則,底層作用域沒有聲明的變量,會向上一級找,找到就返回,沒找到就一直找,直到window的變量,沒有就返回undefined。這里明顯count 是函數(shù)內(nèi)部的flag2 的那個count 。
var count=10; //全局作用域 標記為flag1
function add(){
var count=0; //函數(shù)全局作用域 標記為flag2
return function(){
count+=1; //函數(shù)的內(nèi)部作用域
alert(count);
}
}
var s = add()
s();//輸出1
s();//輸出2
4、變量的作用域
要理解閉包,首先必須理解Javascript特殊的變量作用域。
變量的作用域分類:全局變量和局部變量。
特點:
1、函數(shù)內(nèi)部可以讀取函數(shù)外部的全局變量;在函數(shù)外部無法讀取函數(shù)內(nèi)的局部變量。
2、函數(shù)內(nèi)部聲明變量的時候,一定要使用var命令。如果不用的話,你實際上聲明了一個全局變量!
5、使用閉包的注意點
1)濫用閉包,會造成內(nèi)存泄漏:由于閉包會使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,所以不能濫用閉包,否則會造成網(wǎng)頁的性能問題,在IE中可能導致內(nèi)存泄露。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。
2)會改變父函數(shù)內(nèi)部變量的值。所以,如果你把父函數(shù)當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內(nèi)部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數(shù)內(nèi)部變量的值。
什么是跨域?跨域請求資源的方法有哪些?
1、什么是跨域?
由于瀏覽器同源策略,凡是發(fā)送請求url的協(xié)議、域名、端口三者之間任意一與當前頁面地址不同即為跨域。存在跨域的情況:
網(wǎng)絡協(xié)議不同,如http協(xié)議訪問https協(xié)議。
端口不同,如80端口訪問8080端口。
域名不同,如qianduanblog.com訪問baidu.com。
子域名不同,如abc.qianduanblog.com訪問def.qianduanblog.com。
域名和域名對應ip,如www.a.com訪問20.205.28.90.
2、跨域請求資源的方法:
(1)、porxy代理
定義和用法:proxy代理用于將請求發(fā)送給后臺服務器,通過服務器來發(fā)送請求,然后將請求的結(jié)果傳遞給前端。
實現(xiàn)方法:通過nginx代理;
注意點:1、如果你代理的是https協(xié)議的請求,那么你的proxy首先需要信任該證書(尤其是自定義證書)或者忽略證書檢查,否則你的請求無法成功。
(2)、CORS 【Cross-Origin Resource Sharing】
定義和用法:是現(xiàn)代瀏覽器支持跨域資源請求的一種最常用的方式。
使用方法:一般需要后端人員在處理請求數(shù)據(jù)的時候,添加允許跨域的相關(guān)操作。如下:
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
定義和用法:通過動態(tài)插入一個script標簽。瀏覽器對script的資源引用沒有同源限制,同時資源加載到頁面后會立即執(zhí)行(沒有阻塞的情況下)。
特點:通過情況下,通過動態(tài)創(chuàng)建script來讀取他域的動態(tài)資源,獲取的數(shù)據(jù)一般為json格式。
實例如下:
<script>
function testjsonp(data) {
console.log(data.name); // 獲取返回的結(jié)果
}
</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、這種方式無法發(fā)送post請求(這里)
2、另外要確定jsonp的請求是否失敗并不容易,大多數(shù)框架的實現(xiàn)都是結(jié)合超時時間來判定。
談談垃圾回收機制方式及內(nèi)存管理
回收機制方式
1、定義和用法:垃圾回收機制(GC:Garbage Collection),執(zhí)行環(huán)境負責管理代碼執(zhí)行過程中使用的內(nèi)存。
2、原理:垃圾收集器會定期(周期性)找出那些不在繼續(xù)使用的變量,然后釋放其內(nèi)存。但是這個過程不是實時的,因為其開銷比較大,所以垃圾回收器會按照固定的時間間隔周期性的執(zhí)行。
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為局部變量,而當調(diào)用結(jié)束后,出了fn1的環(huán)境,那么該塊內(nèi)存會被js引擎中的垃圾回收器自動釋放;在fn2被調(diào)用的過程中,返回的對象被全局變量b所指向,所以該塊內(nèi)存并不會被釋放。
4、垃圾回收策略:標記清除(較為常用)和引用計數(shù)。
標記清除:
定義和用法:當變量進入環(huán)境時,將變量標記"進入環(huán)境",當變量離開環(huán)境時,標記為:"離開環(huán)境"。某一個時刻,垃圾回收器會過濾掉環(huán)境中的變量,以及被環(huán)境變量引用的變量,剩下的就是被視為準備回收的變量。
到目前為止,IE、Firefox、Opera、Chrome、Safari的js實現(xiàn)使用的都是標記清除的垃圾回收策略或類似的策略,只不過垃圾收集的時間間隔互不相同。
引用計數(shù):
定義和用法:引用計數(shù)是跟蹤記錄每個值被引用的次數(shù)。
基本原理:就是變量的引用次數(shù),被引用一次則加1,當這個引用計數(shù)為0時,被視為準備回收的對象。
內(nèi)存管理
1、什么時候觸發(fā)垃圾回收?
垃圾回收器周期性運行,如果分配的內(nèi)存非常多,那么回收工作也會很艱巨,確定垃圾回收時間間隔就變成了一個值得思考的問題。
IE6的垃圾回收是根據(jù)內(nèi)存分配量運行的,當環(huán)境中的變量,對象,字符串達到一定數(shù)量時觸發(fā)垃圾回收。垃圾回收器一直處于工作狀態(tài),嚴重影響瀏覽器性能。
IE7中,垃圾回收器會根據(jù)內(nèi)存分配量與程序占用內(nèi)存的比例進行動態(tài)調(diào)整,開始回收工作。
2、合理的GC方案:(1)、遍歷所有可訪問的對象; (2)、回收已不可訪問的對象。
3、GC缺陷:(1)、停止響應其他操作;
4、GC優(yōu)化策略:(1)、分代回收(Generation GC);(2)、增量GC
開發(fā)過程中遇到的內(nèi)存泄露情況,如何解決的?
1、定義和用法:
內(nèi)存泄露是指一塊被分配的內(nèi)存既不能使用,又不能回收,直到瀏覽器進程結(jié)束。C#和Java等語言采用了自動垃圾回收方法管理內(nèi)存,幾乎不會發(fā)生內(nèi)存泄露。我們知道,瀏覽器中也是采用自動垃圾回收方法管理內(nèi)存,但由于瀏覽器垃圾回收方法有bug,會產(chǎn)生內(nèi)存泄露。
2、內(nèi)存泄露的幾種情況:
(1)、當頁面中元素被移除或替換時,若元素綁定的事件仍沒被移除,在IE中不會作出恰當處理,此時要先手工移除事件,不然會存在內(nèi)存泄露。
實例如下:
<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)、由于是函數(shù)內(nèi)定義函數(shù),并且內(nèi)部函數(shù)--事件回調(diào)的引用外暴了,形成了閉包。閉包可以維持函數(shù)內(nèi)局部變量,使其得不到釋放。
實例如下:
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面向?qū)ο笾欣^承實現(xiàn)?
面向?qū)ο蟮幕咎卣饔校悍忾]、繼承、多態(tài)。
在JavaScript中實現(xiàn)繼承的方法:
1. 原型鏈(prototype chaining)
2. call()/apply()
3. 混合方式(prototype和call()/apply()結(jié)合)
4. 對象冒充
繼承的方法如下:
1、prototype原型鏈方式:
[html] view plain copy
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】
function teacher(name,age){
this.name = name;
this.age = age;
}
teacher.prototype.sayName = function(){
console.log('name:'+this.name);
}
teacher.prototype.sayAge = function(){
console.log('age:'+this.age);
}
function student(){
var args = arguments;
teacher.call(this,args[0],args[1]);
}
student.prototype = new teacher();
var student1 = new student('xiaolin',23);
student1.sayName();
student1.sayAge();
// name:xiaolin
// age:23
4、對象冒充
function Person(name,age){
this.name = name;
this.age = age;
this.show = function(){
console.log(this.name+", "+this.age);
}
}
function Student(name,age){
this.student = Person; //將Person類的構(gòu)造函數(shù)賦值給this.student
this.student(name,age); //js中實際上是通過對象冒充來實現(xiàn)繼承的
delete this.student; //移除對Person的引用
}
var s = new Student("小明",17);
s.show();
var p = new Person("小花",18);
p.show();
// 小明, 17
// 小花, 18
javascript相關(guān)程序計算題
1、判斷一個字符串中出現(xiàn)次數(shù)最多的字符,統(tǒng)計這個次數(shù)
var str = 'asdfssaaasasasasaa';
var json = {};
for (var i = 0; i < str.length; i++) {
if(!json[str.charAt(i)]){
json[str.charAt(i)] = 1;
}else{
json[str.charAt(i)]++;
}
};
var iMax = 0;
var iIndex = '';
for(var i in json){
if(json[i]>iMax){
iMax = json[i];
iIndex = i;
}
}
console.log('出現(xiàn)次數(shù)最多的是:'+iIndex+'出現(xiàn)'+iMax+'次');
結(jié)果如下:出現(xiàn)次數(shù)最多的是:a出現(xiàn)9次
JavaScript 數(shù)組(Array)對象
1、Array相關(guān)的屬性和方法
這里只是做了相關(guān)的列舉,具體的使用方法,請參考網(wǎng)址。
Array 對象屬性
constructor 返回對創(chuàng)建此對象的數(shù)組函數(shù)的引用。
length 設置或返回數(shù)組中元素的數(shù)目。
prototype 使您有能力向?qū)ο筇砑訉傩院头椒ā?/span>
Array 對象方法
concat() 連接兩個或更多的數(shù)組,并返回結(jié)果。
join() 把數(shù)組的所有元素放入一個字符串。元素通過指定的分隔符進行分隔。
pop() 刪除并返回數(shù)組的最后一個元素。
shift() 刪除并返回數(shù)組的第一個元素
push() 向數(shù)組的末尾添加一個或更多元素,并返回新的長度。
unshift() 向數(shù)組的開頭添加一個或更多元素,并返回新的長度。
reverse() 顛倒數(shù)組中元素的順序。
slice() 從某個已有的數(shù)組返回選定的元素
sort() 對數(shù)組的元素進行排序
splice() 刪除元素,并向數(shù)組添加新元素。
toSource() 返回該對象的源代碼。
toString() 把數(shù)組轉(zhuǎn)換為字符串,并返回結(jié)果。
toLocaleString() 把數(shù)組轉(zhuǎn)換為本地數(shù)組,并返回結(jié)果。
valueOf() 返回數(shù)組對象的原始值
2、編寫一個方法 去掉一個數(shù)組的重復元素
方法一:
var arr = [0,2,3,4,4,0,2];
var obj = {};
var tmp = [];
for(var i = 0 ;i< arr.length;i++){
if( !obj[arr[i]] ){
obj[arr[i]] = 1;
tmp.push(arr[i]);
}
}
console.log(tmp);
結(jié)果如下: [0, 2, 3, 4]
方法二:
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);
結(jié)果為:[2, 3, 4, 5, 6]
方法三:
var arr = [2,3,4,4,5,2,3,6];
var arr2 = arr.filter(function(element,index,self){
return self.indexOf(element) === index;
});
console.log(arr2);
結(jié)果為:[2, 3, 4, 5, 6]
回到頂部
jquery相關(guān)
1、 jQuery 庫中的 $() 是什么?
$() 函數(shù)是 jQuery() 函數(shù)的別稱。$() 函數(shù)用于將任何對象包裹成 jQuery 對象,接著你就被允許調(diào)用定義在 jQuery 對象上的多個不同方法。你可以將一個選擇器字符串傳入 $() 函數(shù),它會返回一個包含所有匹配的 DOM 元素數(shù)組的 jQuery 對象。
2、如何找到所有 HTML select 標簽的選中項?
$('[name=selectname] :selected')
3、$(this) 和 this 關(guān)鍵字在 jQuery 中有何不同?
$(this) 返回一個 jQuery 對象,你可以對它調(diào)用多個 jQuery 方法,比如用 text() 獲取文本,用val() 獲取值等等。
而 this 代表當前元素,它是 JavaScript 關(guān)鍵詞中的一個,表示上下文中的當前 DOM 元素。你不能對它調(diào)用 jQuery 方法,直到它被 $() 函數(shù)包裹,例如 $(this)。
4、jquery怎么移除標簽onclick屬性?
獲得a標簽的onclick屬性: $("a").attr("onclick")
刪除onclick屬性:$("a").removeAttr("onclick");
設置onclick屬性:$("a").attr("onclick","test();");
5、jquery中addClass,removeClass,toggleClass的使用。
$(selector).addClass(class):為每個匹配的元素添加指定的類名
$(selector).removeClass(class):從所有匹配的元素中刪除全部或者指定的類,刪除class中某個值;
$(selector).toggleClass(class):如果存在(不存在)就刪除(添加)一個類
$(selector).removeAttr(class);刪除class這個屬性;
6、JQuery有幾種選擇器?
(1)、基本選擇器:#id,class,element,*;
(2)、層次選擇器:parent > child,prev + next ,prev ~ siblings
(3)、基本過濾器選擇器::first,:last ,:not ,:even ,:odd ,:eq ,:gt ,:lt
(4)、內(nèi)容過濾器選擇器: :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
7、jQuery中的Delegate()函數(shù)有什么作用?
delegate()會在以下兩個情況下使用到:
1、如果你有一個父元素,需要給其下的子元素添加事件,這時你可以使用delegate()了,代碼如下:
$("ul").delegate("li", "click", function(){ $(this).hide(); });
2、當元素在當前頁面中不可用時,可以使用delegate()
8、$(document).ready()方法和window.onload有什么區(qū)別?
(1)、window.onload方法是在網(wǎng)頁中所有的元素(包括元素的所有關(guān)聯(lián)文件)完全加載到瀏覽器后才執(zhí)行的。
(2)、$(document).ready() 方法可以在DOM載入就緒時就對其進行操縱,并調(diào)用執(zhí)行綁定的函數(shù)。
9、如何用jQuery禁用瀏覽器的前進后退按鈕?
實現(xiàn)代碼如下:
<script type="text/javascript" language="javascript">
$(document).ready(function() {
window.history.forward(1);
//OR window.history.forward(-1);
});
</script>
10、 jquery中$.get()提交和$.post()提交有區(qū)別嗎?
相同點:都是異步請求的方式來獲取服務端的數(shù)據(jù);
異同點:
1、請求方式不同:$.get() 方法使用GET方法來進行異步請求的。$.post() 方法使用POST方法來進行異步請求的。
2、參數(shù)傳遞方式不同:get請求會將參數(shù)跟在URL后進行傳遞,而POST請求則是作為HTTP消息的實體內(nèi)容發(fā)送給Web服務器的,這種傳遞是對用戶不可見的。
3、數(shù)據(jù)傳輸大小不同:get方式傳輸?shù)臄?shù)據(jù)大小不能超過2KB 而POST要大的多
4、安全問題: GET 方式請求的數(shù)據(jù)會被瀏覽器緩存起來,因此有安全問題。
11、寫出一個簡單的$.ajax()的請求方式?
$.ajax({
url:'http://www.baidu.com',
type:'POST',
data:data,
cache:true,
headers:{},
beforeSend:function(){},
success:function(){},
error:function(){},
complete:function(){}
});
12、jQuery的事件委托方法bind 、live、delegate、on之間有什么區(qū)別?
(1)、bind 【jQuery 1.3之前】
定義和用法:主要用于給選擇到的元素上綁定特定事件類型的監(jiān)聽函數(shù);
語法:bind(type,[data],function(eventObject));
特點:
(1)、適用于頁面元素靜態(tài)綁定。只能給調(diào)用它的時候已經(jīng)存在的元素綁定事件,不能給未來新增的元素綁定事件。
(2)、當頁面加載完的時候,你才可以進行bind(),所以可能產(chǎn)生效率問題。
實例如下:$( "#members li a" ).bind( "click", function( e ) {} );
(2)、live 【jQuery 1.3之后】
定義和用法:主要用于給選擇到的元素上綁定特定事件類型的監(jiān)聽函數(shù);
語法:live(type, [data], fn);
特點:
(1)、live方法并沒有將監(jiān)聽器綁定到自己(this)身上,而是綁定到了this.context上了。
(2)、live正是利用了事件委托機制來完成事件的監(jiān)聽處理,把節(jié)點的處理委托給了document,新添加的元素不必再綁定一次監(jiān)聽器。
(3)、使用live()方法但卻只能放在直接選擇的元素后面,不能在層級比較深,連綴的DOM遍歷方法后面使用,即$(“ul”").live...可以,但$("body").find("ul").live...不行;
實例如下:$( document ).on( "click", "#members li a", function( e ) {} );
(3)、delegate 【jQuery 1.4.2中引入】
定義和用法:將監(jiān)聽事件綁定在就近的父級元素上
語法:delegate(selector,type,[data],fn)
特點:
(1)、選擇就近的父級元素,因為事件可以更快的冒泡上去,能夠在第一時間進行處理。
(2)、更精確的小范圍使用事件代理,性能優(yōu)于.live()??梢杂迷趧討B(tài)添加的元素上。
實例如下:
$("#info_table").delegate("td","click",function(){/*顯示更多信息*/});
$("table").find("#info").delegate("td","click",function(){/*顯示更多信息*/});
(4)、on 【1.7版本整合了之前的三種方式的新事件綁定機制】
定義和用法:將監(jiān)聽事件綁定到指定元素上。
語法:on(type,[selector],[data],fn)
實例如下:$("#info_table").on("click","td",function(){/*顯示更多信息*/});參數(shù)的位置寫法與delegate不一樣。
說明:on方法是當前JQuery推薦使用的事件綁定方法,附加只運行一次就刪除函數(shù)的方法是one()。
總結(jié):.bind(), .live(), .delegate(),.on()分別對應的相反事件為:.unbind(),.die(), .undelegate(),.off()
回到頂部
HTML & CSS:
1、什么是盒子模型?
在網(wǎng)頁中,一個元素占有空間的大小由幾個部分構(gòu)成,其中包括元素的內(nèi)容(content),元素的內(nèi)邊距(padding),元素的邊框(border),元素的外邊距(margin)四個部分。這四個部分占有的空間中,有的部分可以顯示相應的內(nèi)容,而有的部分只用來分隔相鄰的區(qū)域或區(qū)域。4個部分一起構(gòu)成了css中元素的盒模型。
2、行內(nèi)元素有哪些?塊級元素有哪些? 空(void)元素有那些?
行內(nèi)元素:a、b、span、img、input、strong、select、label、em、button、textarea
塊級元素:div、ul、li、dl、dt、dd、p、h1-h6、blockquote
空元素:即系沒有內(nèi)容的HTML元素,例如:br、meta、hr、link、input、img
3、CSS實現(xiàn)垂直水平居中
一道經(jīng)典的問題,實現(xiàn)方法有很多種,以下是其中一種實現(xiàn):
HTML結(jié)構(gòu):
<div class="wrapper">
<div class="content"></div>
</div>
CSS:
.wrapper {
position: relative;
width: 500px;
height: 500px;
border: 1px solid red;
}
.content{
position: absolute;
width: 200px;
height: 200px;
/*top、bottom、left和right 均設置為0*/
top: 0;
bottom: 0;
left: 0;
right: 0;
/*margin設置為auto*/
margin:auto;
border: 1px solid green;
}
效果如下:
4、簡述一下src與href的區(qū)別
href 是指向網(wǎng)絡資源所在位置,建立和當前元素(錨點)或當前文檔(鏈接)之間的鏈接,用于超鏈接。
src是指向外部資源的位置,指向的內(nèi)容將會嵌入到文檔中當前標簽所在位置;在請求src資源時會將其指向的資源下載并應用到文檔內(nèi),例如js腳本,img圖片和frame等元素。
當瀏覽器解析到該元素時,會暫停其他資源的下載和處理,直到將該資源加載、編譯、執(zhí)行完畢,圖片和框架等元素也如此,類似于將所指向資源嵌入當前標簽內(nèi)。這也是為什么將js腳本放在底部而不是頭部。
5、簡述同步和異步的區(qū)別
同步是阻塞模式,異步是非阻塞模式。
同步就是指一個進程在執(zhí)行某個請求的時候,若該請求需要一段時間才能返回信息,那么這個進程將會一直等待下去,直到收到返回信息才繼續(xù)執(zhí)行下去;
異步是指進程不需要一直等下去,而是繼續(xù)執(zhí)行下面的操作,不管其他進程的狀態(tài)。當有消息返回時系統(tǒng)會通知進程進行處理,這樣可以提高執(zhí)行的效率。
6、px和em的區(qū)別
相同點:px和em都是長度單位;
異同點:px的值是固定的,指定是多少就是多少,計算比較容易。em得值不是固定的,并且em會繼承父級元素的字體大小。
瀏覽器的默認字體高都是16px。所以未經(jīng)調(diào)整的瀏覽器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em。
7、瀏覽器的內(nèi)核分別是什么?
IE: trident內(nèi)核
Firefox:gecko內(nèi)核
Safari:webkit內(nèi)核
Opera:以前是presto內(nèi)核,Opera現(xiàn)已改用Google Chrome的Blink內(nèi)核
Chrome:Blink(基于webkit,Google與Opera Software共同開發(fā))
8、什么叫優(yōu)雅降級和漸進增強?
漸進增強 progressive enhancement:
針對低版本瀏覽器進行構(gòu)建頁面,保證最基本的功能,然后再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。
優(yōu)雅降級 graceful degradation:
一開始就構(gòu)建完整的功能,然后再針對低版本瀏覽器進行兼容。
區(qū)別:
a. 優(yōu)雅降級是從復雜的現(xiàn)狀開始,并試圖減少用戶體驗的供給
b. 漸進增強則是從一個非常基礎的,能夠起作用的版本開始,并不斷擴充,以適應未來環(huán)境的需要
c. 降級(功能衰減)意味著往回看;而漸進增強則意味著朝前看,同時保證其根基處于安全地帶
9、sessionStorage 、localStorage 和 cookie 之間的區(qū)別
共同點:用于瀏覽器端存儲的緩存數(shù)據(jù)
不同點:
(1)、存儲內(nèi)容是否發(fā)送到服務器端:當設置了Cookie后,數(shù)據(jù)會發(fā)送到服務器端,造成一定的寬帶浪費;
web storage,會將數(shù)據(jù)保存到本地,不會造成寬帶浪費;
(2)、數(shù)據(jù)存儲大小不同:Cookie數(shù)據(jù)不能超過4K,適用于會話標識;web storage數(shù)據(jù)存儲可以達到5M;
(3)、數(shù)據(jù)存儲的有效期限不同:cookie只在設置了Cookid過期時間之前一直有效,即使關(guān)閉窗口或者瀏覽器;
sessionStorage,僅在關(guān)閉瀏覽器之前有效;localStorage,數(shù)據(jù)存儲永久有效;
(4)、作用域不同:cookie和localStorage是在同源同窗口中都是共享的;sessionStorage不在不同的瀏覽器窗口中共享,即使是同一個頁面;
10、Web Storage與Cookie相比存在的優(yōu)勢:
(1)、存儲空間更大:IE8下每個獨立的存儲空間為10M,其他瀏覽器實現(xiàn)略有不同,但都比Cookie要大很多。
(2)、存儲內(nèi)容不會發(fā)送到服務器:當設置了Cookie后,Cookie的內(nèi)容會隨著請求一并發(fā)送的服務器,這對于本地存儲的數(shù)據(jù)是一種帶寬浪費。而Web Storage中的數(shù)據(jù)則僅僅是存在本地,不會與服務器發(fā)生任何交互。
(3)、更多豐富易用的接口:Web Storage提供了一套更為豐富的接口,如setItem,getItem,removeItem,clear等,使得數(shù)據(jù)操作更為簡便。cookie需要自己封裝。
(4)、獨立的存儲空間:每個域(包括子域)有獨立的存儲空間,各個存儲空間是完全獨立的,因此不會造成數(shù)據(jù)混亂。
11、Ajax的優(yōu)缺點及工作原理?
定義和用法:
AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。Ajax 是一種用于創(chuàng)建快速動態(tài)網(wǎng)頁的技術(shù)。Ajax 是一種在無需重新加載整個網(wǎng)頁的情況下,能夠更新部分網(wǎng)頁的技術(shù)。
傳統(tǒng)的網(wǎng)頁(不使用 Ajax)如果需要更新內(nèi)容,必須重載整個網(wǎng)頁頁面。
優(yōu)點:
1.減輕服務器的負擔,按需取數(shù)據(jù),最大程度的減少冗余請求
2.局部刷新頁面,減少用戶心理和實際的等待時間,帶來更好的用戶體驗
3.基于xml標準化,并被廣泛支持,不需安裝插件等,進一步促進頁面和數(shù)據(jù)的分離
缺點:
1.AJAX大量的使用了javascript和ajax引擎,這些取決于瀏覽器的支持.在編寫的時候考慮對瀏覽器的兼容性.
2.AJAX只是局部刷新,所以頁面的后退按鈕是沒有用的.
3.對流媒體還有移動設備的支持不是太好等
AJAX的工作原理:
1.創(chuàng)建ajax對象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp))
2.判斷數(shù)據(jù)傳輸方式(GET/POST)
3.打開鏈接 open()
4.發(fā)送 send()
5.當ajax對象完成第四步(onreadystatechange)數(shù)據(jù)接收完成,判斷http響應狀態(tài)(status)200-300之間或者304(緩存)執(zhí)行回調(diào)函數(shù)
12、請指出document load和document ready的區(qū)別?
共同點:這兩種事件都代表的是頁面文檔加載時觸發(fā)。
異同點:
ready 事件的觸發(fā),表示文檔結(jié)構(gòu)已經(jīng)加載完成(不包含圖片等非文字媒體文件)。
onload 事件的觸發(fā),表示頁面包含圖片等文件在內(nèi)的所有元素都加載完成。
回到頂部
正則表達式
1、寫一個function,清除字符串前后的空格。(兼容所有瀏覽器)
function trim(str) {
if (str && typeof str === "string") {
return str.replace(/(^\s*)|(\s*)$/g,""); //去除前后空白符
}
}
2、使用正則表達式驗證郵箱格式
var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/;
var email = "example@qq.com";
console.log(reg.test(email)); // true
回到頂部
開發(fā)及性能優(yōu)化
1、規(guī)避javascript多人開發(fā)函數(shù)重名問題
命名空間
封閉空間
js模塊化mvc(數(shù)據(jù)層、表現(xiàn)層、控制層)
seajs
變量轉(zhuǎn)換成對象的屬性
對象化
2、請說出三種減低頁面加載時間的方法
壓縮css、js文件
合并js、css文件,減少http請求
外部js、css文件放在最底下
減少dom操作,盡可能用變量替代不必要的dom操作
3、你所了解到的Web攻擊技術(shù)
(1)XSS(Cross-Site Scripting,跨站腳本攻擊):指通過存在安全漏洞的Web網(wǎng)站注冊用戶的瀏覽器內(nèi)運行非法的HTML標簽或者JavaScript進行的一種攻擊。
(2)SQL注入攻擊
(3)CSRF(Cross-Site Request Forgeries,跨站點請求偽造):指攻擊者通過設置好的陷阱,強制對已完成的認證用戶進行非預期的個人信息或設定信息等某些狀態(tài)更新。
4、web前端開發(fā),如何提高頁面性能優(yōu)化?
內(nèi)容方面:
1.減少 HTTP 請求 (Make Fewer HTTP Requests)
2.減少 DOM 元素數(shù)量 (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 :
1. 腳本放到 HTML 代碼頁底部 (Put Scripts at the Bottom)
2. 從頁面中剝離 JavaScript 與 CSS (Make JavaScript and CSS External)
3. 精簡 JavaScript 與 CSS (Minify JavaScript and CSS)
4. 移除重復腳本 (Remove Duplicate Scripts)
面向圖片(Image):
1.優(yōu)化圖片
2 不要在 HTML 中使用縮放圖片
3 使用恰當?shù)膱D片格式
4 使用 CSS Sprites 技巧對圖片優(yōu)化
5、前端開發(fā)中,如何優(yōu)化圖像?圖像格式的區(qū)別?
優(yōu)化圖像:
1、不用圖片,盡量用css3代替。 比如說要實現(xiàn)修飾效果,如半透明、邊框、圓角、陰影、漸變等,在當前主流瀏覽器中都可以用CSS達成。
2、 使用矢量圖SVG替代位圖。對于絕大多數(shù)圖案、圖標等,矢量圖更小,且可縮放而無需生成多套圖?,F(xiàn)在主流瀏覽器都支持SVG了,所以可放心使用!
3.、使用恰當?shù)膱D片格式。我們常見的圖片格式有JPEG、GIF、PNG。
基本上,內(nèi)容圖片多為照片之類的,適用于JPEG。
而修飾圖片通常更適合用無損壓縮的PNG。
GIF基本上除了GIF動畫外不要使用。且動畫的話,也更建議用video元素和視頻格式,或用SVG動畫取代。
4、按照HTTP協(xié)議設置合理的緩存。
5、使用字體圖標webfont、CSS Sprites等。
6、用CSS或JavaScript實現(xiàn)預加載。
7、WebP圖片格式能給前端帶來的優(yōu)化。WebP支持無損、有損壓縮,動態(tài)、靜態(tài)圖片,壓縮比率優(yōu)于GIF、JPEG、JPEG2000、PG等格式,非常適合用于網(wǎng)絡等圖片傳輸。
圖像格式的區(qū)別:
矢量圖:圖標字體,如 font-awesome;svg
位圖:gif,jpg(jpeg),png
區(qū)別:
1、gif:是是一種無損,8位圖片格式。具有支持動畫,索引透明,壓縮等特性。適用于做色彩簡單(色調(diào)少)的圖片,如logo,各種小圖標icons等。
2、JPEG格式是一種大小與質(zhì)量相平衡的壓縮圖片格式。適用于允許輕微失真的色彩豐富的照片,不適合做色彩簡單(色調(diào)少)的圖片,如logo,各種小圖標icons等。
3、png:PNG可以細分為三種格式:PNG8,PNG24,PNG32。后面的數(shù)字代表這種PNG格式最多可以索引和存儲的顏色值。
關(guān)于透明:PNG8支持索引透明和alpha透明;PNG24不支持透明;而PNG32在24位的PNG基礎上增加了8位(256階)的alpha通道透明;
優(yōu)缺點:
1、能在保證最不失真的情況下盡可能壓縮圖像文件的大小。
2、對于需要高保真的較復雜的圖像,PNG雖然能無損壓縮,但圖片文件較大,不適合應用在Web頁面上。
6、瀏覽器是如何渲染頁面的?
渲染的流程如下:
1.解析HTML文件,創(chuàng)建DOM樹。
自上而下,遇到任何樣式(link、style)與腳本(script)都會阻塞(外部樣式不阻塞后續(xù)外部腳本的加載)。
2.解析CSS。優(yōu)先級:瀏覽器默認設置<用戶設置<外部樣式<內(nèi)聯(lián)樣式<HTML中的style樣式;
3.將CSS與DOM合并,構(gòu)建渲染樹(Render Tree)
4.布局和繪制,重繪(repaint)和重排(reflow)
---------------------