let p = newPerson(); let nicknameIter = p.createNicknameIterator(); console.log(nicknameIter.next().value); // Jack console.log(nicknameIter.next().value); // Jake console.log(nicknameIter.next().value); // J-Dog
functioninsertSortA(arr) { for (let i = 1; i < arr.length; i++) { let value = arr[i]; // 记录当前元素 let position = i; // 记录当前位置 let insertIndex = searchInsert(arr.slice(0, i), value); // 利用二分查找找到要插入的位置 // 找到位置后把后面的元素都往后面移动 while (insertIndex !== position && position > insertIndex) { arr[position] = arr[position-1]; position--; }; arr[insertIndex] = value; } return arr; }
// 利用二分查找找到要插入的位置 functionsearchInsert(nums, target) { let left = 0, right = nums.length - 1;
while (left <= right) { let mid = Math.floor((left + right) / 2);
if (nums[mid] === target) { return mid; } elseif (nums[mid] < target) { left = mid + 1; } else { right = mid -1; }; }; return right + 1; }
functionmergeSort(arr) { if (arr.length === 1) return arr; // 只有一个元素不用比较了 // 找到中点分隔数组 let mid = Math.floor(arr.length / 2); let left = arr.slice(0, mid); let right = arr.slice(mid); returnmerge(mergeSort(left), mergeSort(right)); }
// 合并 functionmerge(left, right) { // 给合并数组分配空间 let res = []; // 判断指针指向元素的大小,把小的放入res数组中 while (left.length && right.length) { if (left[0] < right[0]) { res.push(left.shift()) } else { res.push(right.shift()) } } // 判断是否有元素剩余 res = left.length ? [...res, ...left] : [...res, ...right]; return res; }
var len; functionbuildMaxHeap(array) { len = array.length; for (let i = Math.floor(len / 2); i >= 0; i--) { heapify(array, i); }; return array; }
functionheapify(arr, i) { let left = 2 * i + 1, // 如果存在,左子节点index为2 * i + 1 right = 2 * i + 2, // 如果存在,右子节点index为2 * i + 2 largest = i; if (left < len && arr[left] > arr[largest]) { largest = left; } if (right < len && arr[right] > arr[largest]) { largest = right; } if (largest !== i) { [arr[i], arr[largest]] = [arr[largest], arr[i]]; heapify(arr, largest); } }
每一次调用new Father,就会在实例内部定义一次这个sayHello方法,也就是new Function(console.log(${this.name} say hello!)),其实是更推荐把方法定义在Father.prototype上的,这样每个实例构造出来就自动继承这个方法,不需要在构造函数里面一次次地写