代码:千分位逗号
let num = 1234567.89;
let formattedNum = num.toLocaleString('en-US');
console.log(formattedNum); // 输出 "1,234,567.89"代码:手写深浅拷贝
浅拷贝只会复制对象的顶层属性和值,如果属性值是对象或数组,那么它实际上只是复制了引用,而不是真正的对象。
而深拷贝则会递归地复制对象的所有层级,确保所有的对象或数组都被真正复制,而不是仅复制引用。
浅拷贝
function shallowCopy(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
return Object.assign({}, obj); // Object浅拷贝
}
const original = { a: 1, b: { c: 2 } };
const copied = shallowCopy(original);
console.log(copied);深拷贝
function deepCopy(obj, hash = new WeakMap()) {
// 使用了`WeakMap`来存储已经复制过的对象
if (typeof obj !== 'object' || obj === null) {
return obj;
}
// 日期
if (obj instanceof Date) {
return new Date(obj);
}
// 正则
if (obj instanceof RegExp) {
return new RegExp(obj);
}
let newObj = Array.isArray(obj) ? [] : {};
hash.set(obj, newObj);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepCopy(obj[key], hash); // 递归进行拷贝
}
}
return newObj;
}代码:手写 New 方法
function myNew(constructor, ...args) {
const obj = {};
obj.__proto__ = constructor.prototype;
const result = constructor.apply(obj, args);
// 如果构造函数返回一个对象,则返回,否则返回新创建的对象
return result instanceof Object ? result : obj;
}
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.greet = function () {
console.log(`Hello, I'm ${this.name} and I'm ${this.age} years old.`);
}
const person = myNew(Person, 'Alice', 12);
console.log(person.name);
console.log(person.age);
person.greet();代码:手写函数柯里化
function curry(fn) {
if (typeof fn !== 'function') {
return new Error('Type Error');
}
return function curried(...args) {
if (args.length >= fn.length) { // 如果参数数量足够,则执行
return fn.apply(this, args);
}
return function (...args2) {
return curried.apply(this, args.concat(args2));
}
}
}
function sum(a, b, c) {
return a + b + c;
}
const curriedSum = curry(sum);
console.log(curriedSum(1)(2)(3));
console.log(curriedSum(1, 2)(3));代码:实现 AJAX 请求,使用 Promise 封装 AJAX 请求
function ajaxRequest(url, method = 'GET', data = null) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open(method, url, true);
if (method == 'POST') {
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
}
xhr.onload = function () {
if (this.status === 200) {
resolve(this.responseText);
} else {
reject(new Error(this.statusText));
}
};
xhr.onerror = function () {
reject(new Error('Network Error'));
}
if (data) {
xhr.send(data);
} else {
xhr.send();
}
})
}
ajaxRequest(
'https://api.example.com/data', 'GET').then(response => {
console.log(response);
}).catch(error => {
console.error('Error:', error);
});