前端经常使用代码片断(一) 点这里
前端经常使用代码片断(二) 点这里
前端经常使用代码片断(三) 点这里
前端经常使用代码片断(四) 点这里
前端经常使用代码片断(五) 点这里
前端经常使用代码片断(六) 点这里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 的几个小技巧