前端經常使用代碼片斷(一) 點這裏
前端經常使用代碼片斷(二) 點這裏
前端經常使用代碼片斷(三) 點這裏
前端經常使用代碼片斷(四) 點這裏
前端經常使用代碼片斷(五) 點這裏
前端經常使用代碼片斷(六) 點這裏javascript
語義化是指根據內容的結構化(內容語義化),選擇合適的標籤(代碼語義化),便於開發者閱讀和寫出更優雅的代碼的同時,讓瀏覽器的爬蟲和機器很好的解析。
語義化HTML示例:css
<!-- 這是開放的 --> <header> <h1>header</h1> </header> <section class="main"> main </section> <aside>aside</aside> <footer> footer </footer>
HTML5 是定義 HTML 標準的最新的版本。 該術語表示兩個不一樣的概念:
HTML5新特性:html
移除元素:前端
處理HTML5新標籤的瀏覽器兼容問題:html5
<!--[if lt IE 9]> <script src="html5shiv.js"></script> <![endif]-->
如何區分 HTML 和 HTML5:java
* { margin: 0; padding: 0; }
頁面顯示樣式的優先級取決於其「特殊性」’,特殊性越高,就顯示最高的,當特殊性相等時,顯示後者
特殊性表述爲4個部分:0,0,0,0
一個選擇器的特殊性以下肯定:git
1.absolute + transform:es6
<div class="parent"> <div class="child">Demo</div> </div> <style> .parent { position: relative; } .child { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } </style>
2.inline-block + text-align + table-cell + vertical-aligngithub
<div class="parent"> <div class="child">Demo</div> </div> <style> .parent { text-align: center; display: table-cell; vertical-align: middle; } .child { display: inline-block; } </style>
3.flex + justify-content + align-itemsweb
<div class="parent"> <div class="child">Demo</div> </div> <style> .parent { display: flex; justify-content: center; /* 水平居中 */ align-items: center; /*垂直居中*/ } </style>
漸進加強(Progressive Enhancement):一開始就針對低版本瀏覽器進行構建頁面,完成基本的功能,而後再針對高級瀏覽器進行效果、交互、追加功能達到更好的體驗
優雅降級(Graceful Degradation):一開始就構建站點的完整功能,而後針對瀏覽器測試和修復。好比一開始使用 CSS3 的特性構建了一個應用,而後逐步針對各大瀏覽器進行 hack 使其能夠在低版本瀏覽器上正常瀏覽
// 遍歷數組去重法 function unique(arr){ var _arr = [] //遍歷當前數組 for(var i = 0; i < arr.length; i++){ //若是當前數組的第i已經保存進了臨時數組,那麼跳過, //不然把當前項push到臨時數組裏面 if (_arr.indexOf(arr[i]) == -1) _arr.push(arr[i]) } return _arr }
注意點:indexOf 爲 ES5 的方法,注意瀏覽器兼容,須要本身實現 indexOf
// hash 去重法 function unique(arr){ var _arr = [], hash = {} for (var i = 0; i < arr.length; i++) { var item = arr[i] var key = typeof(item) + item // 對象的鍵值只能是字符串, typeof(item) + item來去分1和'1'的狀況 if(hash[key] !== 1){ _arr.push(item) hash[key] = 1 } } return _arr }
function unique(arr){ return Array.from(new Set(arr)) // Array.from方法用於將兩類對象轉爲真正的數組: // 相似數組的對象(array-like object)和可遍歷(iterable)的對象 }
這是對 ajax與json的考察
ajax的全稱:Asynchronous Javascript And XML,異步傳輸+js+xml 如今差很少都用JSON
建立XMLHttpRequest對象,也就是建立一個異步調用對象
建立一個新的HTTP請求,並指定該HTTP請求的方法、URL及驗證信息
設置響應HTTP請求狀態變化的函數
發送HTTP請求
獲取異步調用返回的數據
數據處理
下面就來貼代碼吧:
var api = 'https://api.github.com/users/torvalds' var xhr = new XMLHttpRequest() // 建立XMLHttpRequest對象 if(window.XMLHttpRequest){ // 兼容處理 xhr = new XMLHttpRequest() }else{ xhr = new ActiveXObject('Microsoft.XMLHTTP')// 兼容ie6如下下 } xhr.open('get',api,true) //設置請求信息 xhr.send() //提交請求 //等待服務器返回內容 xhr.onreadystatechange = function() { if ( xhr.readyState == 4 && xhr.status == 200 ) { console.log(JSON.parse(xhr.responseText)) // 使用JSON.parse解析JSON字符串 } }
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它是基於JavaScript的一個子集。數據格式簡單, 易於讀寫, 佔用帶寬小 如:{"age":"12", "name":"back"}
就是當前項等於前兩項的和
var arr=[]; for(var i=0;i<10;i++ ){ i<=1?arr.push(1):arr.push(arr[i-1]+arr[i-2]); } console.log(arr)
執行num(1,5),返回'123454321'
執行num(2,5),返回'23456765432'
方法1:
var num = function(n,m){ var arr = [] var len=(m-n)*2+1 for(var i=0;i<len;i++){ n<m?(arr.push(n++)):(arr.push(m--)) } return arr.join() } num(2,5)
方法2:
var num = function (n,m) { let arr = [m] for(let i = m - 1; i >= n; i--){ arr.push(i); arr.unshift(i) } return arr.join() } num(2,5)
let a="hello word"; let b=[...str].reverse().join("");//drow olleh
setInterval異步函數,異步執行,js被解析的時候,碰到他,先不解析他,放他在一旁,先去解析同步的,等資源空閒下來的纔去解析他,這樣一來,解析其餘代碼確定須要時間,這不就有延誤嘛。
而後解析setInterval內部函數不也同樣須要耗時,函數簡單些還好寫,你要是寫了一大堆,可能產生的延誤就不是一點點的;
obj={ a:1, b:2 } obj2={ a:1, b:2 } obj3={ a:1, b:2 }
JSON.stringify(obj)==JSON.stringify(obj2);//true JSON.stringify(obj)==JSON.stringify(obj3);//false
ES6提供了默認參數的概念,當函數的參數未傳入或者傳入值爲 undefined 時,會應用參數的默認值。
默認值能夠是個表達式,因此咱們能夠將默認值設置爲一個執行函數,若是該參數沒有傳值,就會執行咱們的默認函數:
const required = () => {throw new Error('Missing parameter')}; //The below function will throw an error if either "a" or "b" is missing. const add = (a = required(), b = required()) => a + b; add(1, 2) //3 add(1) // Error: Missing parameter.
以前只是用過reduce作過數組求和,如今發現一些新的用法,原來 reduce 這麼強大。
reduce()方法接收一個函數callbackfn做爲累加器(accumulator),數組中的每一個值(從左到右)開始合併,最終爲一個值。
語法
array.reduce(callbackfn,[initialValue])
reduce()方法接收callbackfn函數,而這個函數包含四個參數:
function callbackfn(preValue,curValue,index,array){}
而initialValue做爲第一次調用 callbackfn函數的第一個參數。
1.沒有initialValue初始值得狀況
var arr = [0,1,2,3,4]; arr.reduce(function(preValue,curValue,index,array){ return preValue + curValue; }); // 10
示例中的回調函數被執行四次,每次參數和返回的值以下:
2.有initialValue初始值得狀況
var arr = [0,1,2,3,4]; arr.reduce(function (preValue,curValue,index,array) { return preValue + curValue; }, 5); //15
reduce()方法會執行五次回調,每次參數和返回的值以下:
基礎部分截取自 大漠 - JavaScript學習筆記... 所有內容可點擊連接查看
1.使用 reduce 替代 map + filter
設想你有這麼個需求:要把數組中的值進行計算後再濾掉一些值,而後輸出新數組。很顯然咱們通常使用 map 和 filter 方法組合來達到這個目的,但這也意味着你須要迭代這個數組兩次。
來看看咱們如何使用 reduce 只迭代數組一次,來完成一樣的結果。下面這個例子咱們須要把數組中的值乘 2 ,並返回大於 50 的值:
const numbers = [10, 20, 30, 40]; const doubledOver50 = numbers.reduce((finalList, num) => { num = num * 2; //double each number (i.e. map) //filter number > 50 if (num > 50) { finalList.push(num); } return finalList; }, []); doubledOver50; // [60, 80]
2.使用 reduce 檢測括號是否對齊封閉
下面這個例子咱們用 reduce 來檢測一段 string 中的括號是否先後對應封閉。
思路是定義一個名爲 counter 的變量,它的初始值爲 0 ,而後迭代字符串,迭代過程當中碰到(就加 1,碰到)就減 1,若是括號先後對應的話,最終couter的值會是 0。
//Returns 0 if balanced. const isParensBalanced = (str) => { return str.split('').reduce((counter, char) => { if(counter < 0) { //matched ")" before "(" return counter; } else if(char === '(') { return ++counter; } else if(char === ')') { return --counter; } else { //matched some other char return counter; } }, 0); //<-- starting value of the counter } isParensBalanced('(())') // 0 <-- balanced isParensBalanced('(asdfds)') //0 <-- balanced isParensBalanced('(()') // 1 <-- not balanced isParensBalanced(')(') // -1 <-- not balanced
3.使用 reduce 計算數組中的重複項
若是你想計算數組中的每一個值有多少重複值,reduce 也能夠快速幫到你。下面的例子咱們計算數組中每一個值的重複數量,並輸出一個對象來展現:
var carsObj = cars.reduce(function (obj, name) { obj[name] = obj[name] ? ++obj[name] : 1; return obj; }, {}); carsObj; // => { BMW: 2, Benz: 2, Tesla: 1, Toyota: 1 }
實例部分截取自 ES6 的幾個小技巧 所有內容可點擊連接查看
有時你可能但願移除一個對象中的某些屬性,咱們通常會經過迭代這個對象(如 for..in 循環)來移除那些咱們不想要的屬性。實際上咱們能夠經過對象解構的方法將不想要的屬性提取出來,並將想留下來的變量保存在rest 參數中。
在下面的這個例子中,咱們從對象中移除_internal
和tooBig
這兩個屬性:
let {_internal, tooBig, ...cleanObject} = { el1: '1', el2: '2', el3: '3', tooBig:{}, _internal:"secret" }; console.log(cleanObject); // {el1: '1', el2: '2', el3: '3'}
拓展:
1.嵌套對象解構
let {model, engine: {vin,...uuu} } = { model: 'bmw 2018', engine: { v6: true, turbo: true, vin: 12345 } } console.log(uuu); // {v6: true, turbo: true} console.log(vin); // 12345 console.log(model); // 'bmw 2018' console.log(engine); // Uncaught ReferenceError: engine is not defined
2.合併對象
合併兩個對象,新對象中相同的屬性會被放在後面的對象覆蓋:
let object1 = { a:1, b:2,c:3 } let object2 = { b:30, c:40, d:50} let merged = {…object1, …object2} //spread and re-add into merged console.log(merged) // {a:1, b:30, c:40, d:50}
function isInteger(x) { return (x ^ 0) === x; }
function isIntefer(x){ return (typeof x === 'number') && (x % 1 === 0); //返回布爾 }
參考文章:
1.12個常規前端面試題及小結
2.ES6 的幾個小技巧