3、flat函数设计
算法题
输入:['a', ['b', 'c'], 2, ['d', 'e', 'f'], 'g', 3, 4]
输出:a,b,c,2,d,e,f,g,3,4
const arr = ['a', ['b', 'c'], 2, ['d', 'e', 'f'], 'g', 3, 4] // 方式一:递归(代码太多已省略) // 方式二:toString(格式转换) 隐式类型转换 [1,2,3].toString() = 1,2,3 // 方式三:valueOf(格式转化),和toString差不多,把toString换成valueOf /*const flag = (arr) => { let toString = Array.prototype.toString Array.prototype.toString = function() { // 改变 return this.join(',') } Array.prototype.toString = toString // 还原 return arr + '' // 隐式类型转换,这里arr会先调用valueOf结果返回不是基本数据类型则继续调用toString然后结束,否则会报错 } console.log(flag(arr))*/ // 方式四:Iterator 对新型的数据结构进行遍历 Array.prototype[Symbol.iterator] = function() { let arr = [].concat(this) // arr = ['a', ['b', 'c'], 2, ['d', 'e', 'f'], 'g', 3, 4] let getFirst = function(array) { let first = array.shift() return first } return { // 遍历器必须返回对象,并且有next()方法 next() { let item = getFirst(arr) if (item) { return { value: item, // 返回的值,如果item是数组则调toString done: false // 是否遍历结束 } } else { return { done: true } } } } } const flag = function (arr){ let r = [] for (let i of arr) { r.push(i) } return r.join(',') } console.log(flag(arr))