描述:如選出id爲target的全部含有類名爲father的上級元素html
思路:使用遞歸實現,可是儘可能不要建立額外的全局變量vue
代碼:react
var a=document.getElementById("this"); function getParent(dom){ var d=dom.parentNode; var arr=[]; if(d){ if(d.className=="target"){ arr.push(d); } if(d.parentNode){ return arr.concat(getParent(d)); }else{ return arr; } }else{ return arr; } } console.log(getParent(a));
描述:其實就是採用遞歸去遍歷一個json串,如代碼中結構的數據所示webpack
輸出:web
var tree={ leaf1:{ leaf2:"value2" }, leaf4:{ leaf6:{ leaf7:{ leaf8:"value8", leaf10:"value10" }, leaf9:"value9" } }, leaf3:"value3" }; function ergodicTree(tree,arr){ arr=arr||[]; for(var item in tree){ var i=tree[item]; var brr=[]; brr.push(item); if(typeof i=="object"){ ergodicTree(i,arr.concat(brr)); }else{ brr.push(i); console.log(arr.concat(brr)); } } }
function quick(arr){ var left=[]; var right=[]; if(arr.length<=1){return arr;} var index=Math.floor(arr.length/2); var mid=arr.splice(index,1)[0]; for(var i=0;i<arr.length;i++){ if(arr[i]>mid){ right.push(arr[i]); }else{ left.push(arr[i]); } } return quick(left).concat([mid],quick(right)); }
getOwnPrppertyNames 可以列舉出當前object的所有非原型屬性,包括可枚舉的和不可枚舉的。算法
keys 只能列舉出object的非原型可枚舉屬性json
for...in 能遍歷object的所有可枚舉屬性數組
相同點:兩者都是有遍歷、迭代的功能安全
不一樣點: 1.當兩者遍歷相同類型的數據時,for...in 遍歷時的參數是數據的key,而for...of是數據的valuebabel
2.for...in 能夠遍歷object、map、set、array等, 而 for...of 只能遍歷map set array等可迭代變量
在子組件中調用父組件中定義的函數,這個函數經過props傳到子組件中
很簡單,使用vue的render createElement 函數
Vue.component('component-b',{ props:{ foo:{ type:String, required:true } }, render(h){ return h('div',['組件B',this.$props.foo]) } }); Vue.component('component-a',{ render(h){ return h('div',['組件A',h('component-b',{ props:{ foo:'bar' } })]); } }) export default { name:'tcm', render(h){ return h('div',[h('component-a')]); } }
分別以vue和react +webpack 爲例:
vue: 在vue的單文件中不須要額外的plugin或loader配置,直接使用以下方式便可動態加載模塊及組件
// 加載js模塊 import('./asyncMod').then(res=>{ console.log(res.default); res.default(); }); // 加載組件 const Layout = () => import('./page/layout');
react: react中的配置比較複雜,babel7 環境下須要 安裝 @babel/plugin-syntax-dynamic-import 插件
其中加載異步模塊與vue是同樣的
而異步加載組件則須要進一步封裝一個高階組件
import React, { Component } from "react"; export default function asyncComponent(importComponent) { class AsyncComponent extends Component { constructor(props) { super(props); this.state = { component: null }; } componentDidMount() { // const { default: component } = await importComponent(); let _this=this; importComponent().then(res=>{ _this.setState({ component: res.default }); }) } render() { const C = this.state.component; return C ? <C {...this.props} /> : null; } } return AsyncComponent; }
使用時調用高階組件便可:
const Layout = asyncComponent(()=>import('./page/layout'));
content-type: 體頭部用於指示資源的MIME類型 。 常見的值爲 text/html; charset=utf-8 等等
transfer-encoding: 消息首部指明瞭將http請求實體安全傳遞給用戶所採用的編碼形式。 值爲: chunked gzip deflate identity compress
詳細參考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Transfer-Encoding
content-encoding: 是一個實體消息首部,用於對特定媒體類型的數據進行壓縮。當這個首部出現的時候,它的值表示消息主體進行了何種方式的內容編碼轉換。這個消息首部用來告知客戶端應該怎樣解碼才能獲取在 Content-Type
中標示的媒體類型內容
值爲: gzip br deflate identity compress
詳細參考: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Encoding
function sum(num,total){ if(!total){ total = 0; } total += num; if(num<=0){ return total; } else { return sum(num-1,total); } }
注: 這個問題提的有點傻逼,不循環數組下標還要深拷貝,對象數組怎麼辦?這他孃的怎麼深拷貝?(這裏默認不採用 JSON.parse 和 JSON.stringify)
function judgeType(s){ if(s==null){ return 'null'; } let str = Object.prototype.toString.call(s); let reg = /\[\w+\s(\w+)\]/; var ss = str.match(reg)[1]; return ss.toLowerCase(); } function copyArray(arr){ let aa = []; arr.forEach(e=>{ switch(judgeType(e)){ case 'array': aa.push(copyArray(e)); break; case 'object': aa.push(copyObject(e)); break; default: aa.push(e); } }); return aa; } function copyObject(obj){ let keys = Object.getOwnPropertyNames(obj); let oo = {}; keys.forEach(e=>{ let val = obj[e]; switch(judgeType(val)){ case 'array': oo[e] = copyArray(val); break; case 'object': oo[e] = copyObject(val); break; default: oo[e] = val; } }); return oo; }