舉例子node
function showName() {
console.log(name);
}
let person = {
name: 'mochixuan',
age: 20
}
person.temp = showName;
person.temp(); //調用
複製代碼
實現正則表達式
Function.prototype.call1 = function () {
// 數組解構,獲取參數
let [thisArgs,...args] = [...arguments];
thisArgs = thisArgs || window;
// 使用Symbol能夠防止原有屬性被替換。
const tempArg = Symbol('call1');
thisArgs[tempArg] = this;
let result;
if (args == undefined) {
result = thisArgs[tempArg]()
} else {
result = thisArgs[tempArg](...args)
}
delete thisArgs[tempArg]
return result;
}
複製代碼
Function.prototype.apply1 = function (thisArgs,args) {
thisArgs = thisArgs || window;
const tempArg = Symbol('apply1');
thisArgs[tempArg] = this;
let result;
if (args == undefined) {
result = thisArgs[tempArg]()
} else {
result = thisArgs[tempArg](...args)
}
delete thisArgs[tempArg]
return result;
}
複製代碼
Function.prototype.bind1 = function (thisArg) {
if (typeof this !== 'function') return new TypeError(this+'must be function')
const arg1 = Array.prototype.slice.call(arguments,1);
const self = this;
const bound = function (args) {
const arg2 = Array.prototype.slice.call(arguments);
const allArgs = arg1.concat(arg2);
if (this instanceof bound) {
if (self.prototype) {
function TempFC() {}
TempFC.prototype = self.prototype;
bound.prototype = new TempFC();
}
return self.apply(this,allArgs);
} else {
return self.apply(thisArg,allArgs);
}
}
return bound;
}
複製代碼
死循環例子算法
let a = {x: 1,y: 2};
a.z = a;
複製代碼
// Map: Map對象保存鍵值對,相似於數據結構字典;與傳統上的對象只能用字符串當鍵不一樣,Map對象可使用任意值當鍵
// WeakMap: 對象保存鍵值對,與Map不一樣的是其鍵必須是對象,由於鍵是弱引用,在鍵對象消失後自動釋放內存.
function deepCopy(data,map = new WeakMap()) {
if (!data || typeof data !== 'object') return data; // null也是object
const result = Array.isArray(data) ? [] : {};
// 解決死循環問題
if (map.has(data)) {
return map.get(data);
} else {
map.set(data,result);
}
for (let key in data) {
if (key != null && data.hasOwnProperty(key)) { //原型鏈上的可枚舉屬性,去除原型鏈上的數據
if (typeof data === 'object') {
result[key] = deepCopy(data[key],map);
} else {
result[key] = data[key];
}
}
}
return result;
}
複製代碼
// 該方法會忽略掉那些從原型鏈上繼承到的屬性
const hasOwnProperty = Object.prototype.hasOwnProperty
function is(x, y) {
// === 嚴格判斷適用於對象和原始類型。可是有個例外,就是NaN和正負0。
if (x === y) {
//這個是個例外,爲了針對0的不一樣,譬如 -0 === 0 : true
// (1 / x) === (1 / y)這個就比較有意思,能夠區分正負0, 1 / 0 : Infinity, 1 / -0 : -Infinity
return x !== 0 || y !== 0 || 1 / x === 1 / y
} else {
// 這個就是針對上面的NaN的狀況: parseInt('abc') // NaN
return x !== x && y !== y
}
}
function shallowEqual(objA, objB) {
// Object.is()
if (is(objA, objB)) {
return true;
}
// null 也是對象
//下面這個就是,若是objA和objB其中有個不是對象或者有一個是null, 那就認爲不相等。
//不是對象,或者是null.咱們能夠根據上面的排除來猜測是哪些狀況:
//有個不是對象類型或者有個是null,那麼咱們就直接返回,認爲他不一樣。其主要目的是爲了確保兩個都是對象,而且不是null。
if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
return false
}
var keysA = Object.keys(objA);
var keysB = Object.keys(objB);
if (keysA.length !== keysB.length) {
return false;
}
//這裏只比較了對象A和B第一層是否相等
for (var i = 0; i < keysA.length; i++) {
if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {
return false;
}
}
return true;
}
複製代碼
function bubbleSort(items) {
for (let i = 0 ; i < items.length - 1; i++) {
for (let j = 0 ; j < items.length - 1 - i ; j++) {
if (items[j] > items[j+1]) {
let temp = items[j];
items[j] = items[j+1];
items[j+1] = temp;
}
}
}
return items;
}
複製代碼
function selectSort(items) {
for (let i = 0 ; i < items.length ; i++) {
let tempIndex = i;
for (let j = i+1 ; j < items.length ; j++) {
if (items[j] < items[tempIndex]) {
tempIndex = j;
}
}
if (i != tempIndex) {
let temp = items[i];
items[i] = items[tempIndex];
items[tempIndex] = temp;
}
}
return items;
}
複製代碼
function quick(items,low,high) {
if (low == null && high == null) {
low = 0;
high = items.length - 1;
}
if (low >= high) return items;
let middle = getMiddle(items,low,high);
if (middle > low) quick(items,low,middle-1);
if (middle < high) quick(items,middle+1,high)
return items;
}
function getMiddle(items,start,end) {
let temp = items[start];
while (start < end) {
while (start < end && items[end] >= temp) --end;
items[start] = items[end];
while (start < end && items[start] <= temp) ++start;
items[end] = items[start];
}
items[start] = temp;
return start;
}
複製代碼
function queryMinMaxFix(node,fix,result) {
if (result == null) result = {};
if (node != null) {
if (result.min == null) result.min = node.value;
if (result.max == null) result.max = node.value;
if (result.fix == null) result.fix = [];
if (node.value < result.min) result.min = node.value;
if (node.value > result.max) result.max = node.value;
if (node.value == fix) result.fix.push(node);
if (node.left != null) queryMinMaxFix(node.left, fix, result);
if (node.right != null) queryMinMaxFix(node.right, fix, result);
}
return result;
}
複製代碼
function traversal(node,tempOrderTraversal) {
if (node != null) {
// tempOrderTraversal.push(node.value) 前序遍歷
if (node.left != null) {
preOrderTraversal(node.left,tempOrderTraversal)
}
// tempOrderTraversal.push(node.value) 中序遍歷
if (node.right != null) {
preOrderTraversal(node.right,tempOrderTraversal)
}
// tempOrderTraversal.push(node.value) 後序遍歷
}
}
複製代碼
不能使用遞歸時,則使用棧就是JS的數組push、pop數組
// 非遞歸遍歷
var kthSmallest = function(root, k) {
const tempArr = [];
let result;
tempArr.push(root);
while (tempArr.length > 0) {
result = tempArr.pop();
if (result.value == k) break;
if (result.left != null) tempArr.push(result.left);
if (result.right != null) tempArr.push(result.right);
}
return result;
};
複製代碼
var maxDepth = function(root) {
let nodeArrs = [];
if (root != null) nodeArrs.push(root);
let result = 0;
while(nodeArrs.length > 0) {
result++;
let temp = [];
for(let i = 0 ; i < nodeArrs.length ; i++) {
if (nodeArrs[i].left != null) temp.push(nodeArrs[i].left);
if (nodeArrs[i].right != null) temp.push(nodeArrs[i].right);
}
nodeArrs = temp;
}
return result;
};
複製代碼
var deleteNode = function(node) {
if (node.next != null) {
node.val = node.next.val;
node.next = node.next.next
}
};
複製代碼
function reserveLink(head) {
let result = null;
let temp = null;
while (head) {
temp = head.next;
head.next = result;
result = head;
head = temp;
}
return result;
}
複製代碼
function hasRing(root) {
if(root == null) return false;
let oneNode = root;
let twoNode = root;
while(twoNode) {
if (twoNode.value === oneNode.value) {
return true;
}
oneNode = oneNode.next;
if (twoNode.next != null) {
twoNode = twoNode.next.next;
}
}
return false;
}
複製代碼
let data = [1,3,5,9,11];
let target = 8;
output: 3,5 或者是下標
複製代碼
function(data,target) {
let i = 0;
let j = data.length - 1;
for( ; i < j ;) {
if (data[i] + data[j] === target) {
break;
} else if (data[i] + data[j] > target) {
j--;
} else {
j++;
}
}
return [i,j];
}
複製代碼
function (data) {
let x = data[0];
let total = 0;
for(let i = 0 ; i < data.length ; i++) {
if (x === data[i]) {
total = total + 1;
} else {
total = total - 1;
}
if (total === 0 && i < data.length - 1) {
x = data[i+1];
}
}
return x;
}
複製代碼