[TOC] <br/><br/><br/> # <b style="color:#4F4F4F;">简介说明</b> 原文链接: - [javascript的23种设计模式](https://mp.weixin.qq.com/s/hP5YMgJTgaVIlaK-XJ3Bcw) - [用了这个设计模式,我优化了50%表单校验代码](https://mp.weixin.qq.com/s/zGca0S0Xfs_D5ZSBPBXfXg) ``` 版本:JavaScript常见问题 作用:JavaScript常见问题 ``` <br/> # <b style="color:#4F4F4F;">常见问题</b> <br/> # <span style="color:#619BE4">实现类似python getattr动态属性获取?</span> ***** 实现类似python getattr动态属性获取 <br/> ### 示例内容 <span style="color:red">1. 解决代码</span> ``` let x = new Proxy({}, { get(target, name) { return `Value for attribute ${name}` } }); console.log(x.lskdjoau); // produces message: "Value of attribute 'lskdjoau'" ``` <br/> # <span style="color:#619BE4">实现loadsh get方法?</span> ***** 实现loadsh get方法 <br/> ### 示例内容 <span style="color:red">1. 解决代码</span> ``` function deepGet(object, path, defaultValue) { return (!Array.isArray(path) ? path.replace(/\[/g, '.').replace(/\]/g, '').split('.') : path) .reduce((o, k) => (o || {})[k], object) || defaultValue; } ``` <br/> # <span style="color:#619BE4">中文按照字母分隔并排序?</span> ***** 中文按照字母分隔并排序 <br/> ### 示例内容 <span style="color:red;">1. 解决代码</span> ``` function pySegSort(arr, empty) { if (!String.prototype.localeCompare) { return null; } let letters = "*abcdefghjklmnopqrstwxyz".split(''); let zh = "阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀".split(''); let segments = []; let curr; letters.forEach((l, i) => { curr = {letter: l, data: []}; arr.forEach((content) => { // 内容大小在上一个文字和当前文字之间,是的话则上传 if ((!zh[i - 1] || zh[i - 1].localeCompare(content, "zh") <= 0) && content.localeCompare(zh[i], "zh") === -1) { curr.data.push(content); } }) if (empty || curr.data.length) { segments.push(curr); curr.data.sort(function (a, b) { return a.localeCompare(b, "zh"); }); } }); return segments; } ``` <br/> # <span style="color:#619BE4">ArrayBuffer与字符串的互相转换?</span> ***** ArrayBuffer与字符串的互相转换 <br/> ### 示例内容 <span style="color:red;">1. 解决代码</span> ``` // ArrayBuffer转为字符串,参数为ArrayBuffer对象 function ab2str(buf) { return String.fromCharCode.apply(null, new Uint16Array(buf)); } // 字符串转为ArrayBuffer对象,参数为字符串 function str2ab(str) { var buf = new ArrayBuffer(str.length*2); // 每个字符占用2个字节 var bufView = new Uint16Array(buf); for (var i=0, strLen=str.length; i<strLen; i++) { bufView[i] = str.charCodeAt(i); } return buf; } ``` <br/> # <span style="color:#619BE4">实现深拷贝?</span> ***** 如何实现深拷贝? <br/> ### 示例内容 <span style="color:red;">1. 解决代码</span> ``` function cloneDeep(x) { const root = {} // 栈 const loopList = [ { parent: root, key: undefined, data: x } ] while (loopList.length) { // 广度优先 const node = loopList.pop() const parent = node.parent const key = node.key const data = node.data // 初始化赋值目标,key为undefined则拷贝到父元素,否则拷贝到子元素 let res = parent if (typeof key !== 'undefined') { res = parent[key] = {} } for (let k in data) { if (typeof data[k] === 'object') { // 下一次循环 loopList.push({ parent: res, key: k, data: data[k] }) } else { res[k] = data[k] } } } return root } ``` <br/>