//深度克隆 function deepClone(obj){ var result,oClass=isClass(obj); //肯定result的類型 if(oClass==="Object"){ result={}; }else if(oClass==="Array"){ result=[]; }else{ return obj; } for(key in obj){ var copy=obj[key]; if(isClass(copy)=="Object"){ result[key]=arguments.callee(copy);//遞歸調用 }else if(isClass(copy)=="Array"){ result[key]=arguments.callee(copy); }else{ result[key]=obj[key]; } } return result; } //返回傳遞給他的任意對象的類 function isClass(o){ if(o===null) return "Null"; if(o===undefined) return "Undefined"; return Object.prototype.toString.call(o).slice(8,-1); } var oPerson={ oName:"rookiebob", oAge:"18", oAddress:{ province:"beijing" }, ofavorite:[ "swimming", {reading:"history book"} ], skill:function(){ console.log("bob is coding"); } }; //深度克隆一個對象 var oNew=deepClone(oPerson); oNew.ofavorite[1].reading="picture"; console.log(oNew.ofavorite[1].reading);//picture console.log(oPerson.ofavorite[1].reading);//history book oNew.oAddress.province="shanghai"; console.log(oPerson.oAddress.province);//beijing console.log(oNew.oAddress.province);//shanghai
二、如何控制alert中的換行?javascript
添加 「\n」 便可實現換行,有些瀏覽器則可能添加 「\r\n」php
三、請編寫一個javascript函數parseQueryString,它的用途是把URL參數解析爲一個對象css
var url = "http://www.taobao.com/index.php?key0=0&key1=1&key2=2"; var obj = parseQueryString(url); function parseQueryString(argu){ var str = argu.split('?')[1]; var result = {}; var temp = str.split('&'); for(var i=0; i<temp.length; i++) { var temp2 = temp[i].split('='); result[temp2[0]] = temp2[1]; } return result; }
四、如何控制網頁在網絡傳輸過程當中的數據量?前端
減小http請求次數:css spirit,data urijava
五、如下代碼運行結果 //889數組
function say(){ var num=888; var sayAlert=function(){alert(num)}; num++; return sayAlert; } var sayAlert=say(); sayAlert()
六、請實現ES5中的Object.getPrototypeOf()函數瀏覽器
function Fn(){ } var fn = new Fn(); //經過getPrototypeOf靜態方法,得到對象fn的prototype var proto = Object.getPrototypeOf(fn); //將得到的prototype添加一個name屬性,並賦值 proto.name = 'Monkey'; //輸出對象fn.name console.log(fn.name);//Monkey //判斷proto是不是Fn.prototype console.log( 'proto === Fn.prototype? ' + (proto === Fn.prototype) ); //proto === Fn.prototype? true
七、如何實現Array.prototype.forEach緩存
array.forEach(callback(currentValue,index,array){},this)array.forEach(callback[, thisArg])callback爲數組中每一個元素執行的函數,該函數接收三個參數:
currentValue(當前值)
數組中正在處理的當前元素。
index(索引)
數組中正在處理的當前元素的索引。
array
forEach()方法正在操做的數組。
thisArg可選
可選參數。當執行回調 函數時用做this的值(參考對象)。
function logArrayElements(element, index, array) { console.log("a[" + index + "] = " + element); } // 注意索引2被跳過了,由於在數組的這個位置沒有項 [2, 5, ,9].forEach(logArrayElements); // a[0] = 2 // a[1] = 5 // a[3] = 9 [2, 5,"" ,9].forEach(logArrayElements); // a[0] = 2 // a[1] = 5 // a[2] = // a[3] = 9 [2, 5, undefined ,9].forEach(logArrayElements); // a[0] = 2 // a[1] = 5 // a[2] = undefined // a[3] = 9 let xxx; // undefined [2, 5, xxx ,9].forEach(logArrayElements); // a[0] = 2 // a[1] = 5 // a[2] = undefined // a[3] = 9
七、如何將arguments轉爲數組網絡
- Array.prototype.slice.apply(arguments)這是運行效率比較快的方法(看別人資料說的),爲何不是數組也能夠,由於arguments對象有length屬性,而這個方法會根據length屬性,返回一個具備length長度的數組。若length屬性不爲number,則數組長度返回0;因此其餘對象只要有length屬性也是能夠的喲,如對象中有屬性0,對應的就是arr[0],即屬性爲天然數的number就是對應的數組的下標,若該值大於長度,固然要割捨啦。
- Array.prototype.concat.apply(thisArg,arguments)。,thisArg是新的空數組,apply方法將函數this指向thisArg,arguments作爲類數組傳參給apply。根據apply的方法的做用,即將Array.prototype.slice方法在指定的this爲thisArg內調用,並將參數傳給它。用此方法注意:若數組內有數組,會被拼接成一個數組。緣由是apply傳參的特性。
- 利用Array的構造函數,如Array(1,2,3,4,5,6);能夠返回一個傳入的參數的數組,那Array.apply(thisArg,arguments)也能夠將arguments轉化爲數組,果真實驗是能夠的;有沒有什麼影響呢,就是亂用了構造函數,但這也是js的特性嘛。構造函數也是函數。用此方法注意:若數組內有數組,會被拼接成一個數組。緣由是apply傳參的特性。
- 用循環,由於arguments相似數組可使用arguments[0]來訪問實參,那麼將每項賦值給新的數組每項,直接複製比push要快,若實參有函數或者對象,就要深拷貝。
八、如下程序運行結果app
var ninja=function myNinja(){ alert(ninja==myNinja); }; ninja();//true myNinja(); //myNinja is not defined
九、兼容瀏覽器的獲取指定元素的樣式屬性的方法
function getStyle(elem, name){ //若是屬性存在於style[]中,直接取 if(elem.style[name]){ return elem.style[name]; } //不然 嘗試IE的方法 else if(elem.currentStyle){ return elem.currentStyle[name]; } //嘗試W3C的方式 else if(document.defaultView && document.defaultView.getComputedStyle){ //W3C中爲textAlign樣式,轉爲text-align name = name.replace(/([A-Z])/g, "-$1"); name = name.toLowerCase(); var s = document.defaultView.getComputedStyle(elem, ""); return s && s.getPropertyValue(name); } else { return null; } }