JavaScript特性&Promise等
2025/9/29
Js特性学习
Js的链式调用
Js链式调用,核心思想就是方法执行后返回 this,而不是普通值。
class StringFormatter {
constructor(str) {
this.str = str;
}
toLowerCase() {
this.str = this.str.toLowerCase();
return this; // 返回this使链式调用成为可能
}
trim() {
this.str = this.str.trim();
return this;
}
capitalize() {
this.str = this.str.charAt(0).toUpperCase() + this.str.slice(1);
return this;
}
getValue() {
return this.str;
}
}
// 使用链式调用
const result = new StringFormatter(" HELLO world ")
.toLowerCase()
.trim()
.capitalize()
.getValue();
console.log(result); // 输出: "Hello world"
同时要理解一个思想“函数是一等公民”,函数和普通变量是一样的地位。
所以说我们能把数字、字符串存在变量里一样,也能把函数存在变量里、当参数传递、作为返回值返回
具体体现
-
函数可以赋值给变量
const sayHi = function() { console.log("Hello!"); }; sayHi(); // Hello!这里
sayHi就像一个变量,存的不是数字,而是函数。 -
函数可以作为参数传递
function runTwice(fn) { fn(); fn(); } runTwice(() => console.log("Hi"));这里会输出两次这个“hi”
-
函数可以作为返回值
这个很典型的一个闭包
function makeAdder(x) { return function(y) { return x + y; } } const add5 = makeAdder(5); console.log(add5(10)); // 15这里
makeAdder返回了一个函数,这就是闭包的经典用法
主要就是上面这些,这里有一个闭包思想
Js中的Promise
Promise 的设计初衷是解决回调地狱(callback hell)的问题,让异步代码看起来更清晰、更易维护
一个 Promise 对象有三种可能的状态:
- pending(进行中):初始状态,既没有完成也没有失败。
- fulfilled(已完成):操作成功完成,返回结果。
- rejected(已失败):操作失败,返回错误原因。
const promise = new Promise((resolve, reject) => {
let suscess = true;
if (suscess) {
resolve("Promise resolved successfully!");
} else {
reject("Promise rejected!");
}
});
/*
resolve(value):表示成功,传递结果。
reject(error):表示失败,传递错误信息。
*/
promise
.then((message) => {
console.log(message); }
)
.catch((error) => {
console.error(error);
})
.finally(() => {
console.log("Promise has been settled (either resolved or rejected).");
});
相应的可以使用这个.then 和.finally 处理结果
这里还是要强调这个链式调用
new Promise((resolve) => {
resolve(1)
})
.then(value => {
console.log(value) // 1
return value + 1
})
.then(value => {
console.log(value) // 2
return value + 1
})
.then(value => {
console.log(value) // 3
})
Promise 的常用方法
Promise 的常用方
(1) Promise.all()
并行执行多个 Promise,全成功才成功,有一个失败就失败。
Promise.all([p1, p2, p3])
.then(results => console.log(results))
.catch(err => console.error(err))
(2) Promise.race()
多个 Promise,最快返回的那个决定结果。
Promise.race([p1, p2, p3]).then(console.log)
(3) Promise.allSettled()
等待所有 Promise 完成,不管成功或失败,返回每个结果状态。
Promise.allSettled([p1, p2, p3]).then(console.log)
(4) Promise.any()
只要有一个成功就返回成功,全部失败才报错。
Promise.any([p1, p2, p3]).then(console.log).catch(console.error)
Leetcode
处理json数据
/**
* @param {Object|Array} obj
* @return {boolean}
*/
var isEmpty = function(obj) {
const value = JSON.stringify(obj);
return value === '{}' || value === '[]';
};
链式调用理解
可以深入对这个js的理解
2726. 使用方法链的计算器 - 力扣(LeetCode)
class Calculator{
constructor(value) {
this.value = value;
}
add(value) {
this.value += value;
return this;
}
subtract(value) {
this.value = this.value - value;
return this;
}
multiply(value) {
this.value = this.value * value;
return this;
}
divide(value) {
if (value === 0) {
throw new Error("Division by zero is not allowed");
}
this.value /= value;
return this;
}
power(value) {
this.value = Math.pow(this.value, value);
return this;
}
getResult() {
return this.value;
}
}
这里重点是return this
这里解释是这样的,
this指向当前对象实例- 通过返回
this,每个方法调用后都返回计算器对象本身 - 这样就可以直接在返回值上继续调用下一个方法
还有一些实践例子展示
// jQuery 中的链式调用
$("#myDiv")
.addClass("highlight")
.css("color", "red")
.fadeIn(1000)
.text("Hello");
// Promise 中的链式调用
fetch("https://api.example.com/data")
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
原型链
2619. 数组原型对象的最后一个元素 - 力扣(LeetCode)
这个案例很好就展示原型链的一个应用,去丰富原生的一个数组功能
Array.prototype.last = function() {
if (this.length === 0) {
return -1;
}
return this[this.length - 1];
}
promise相加
2723. 两个 Promise 对象相加 - 力扣(LeetCode)
第一种写法的话,采用async,返回值也是promise
/**
* @param {Promise} promise1
* @param {Promise} promise2
* @return {Promise}
*/
var addTwoPromises = async function(promise1, promise2) {
const value1 = await promise1;
const value2 = await promise2;
return value1 + value2;
};
/**
* addTwoPromises(Promise.resolve(2), Promise.resolve(2))
* .then(console.log); // 4
*/
第二种,直接采用all 方法
/**
* @param {Promise} promise1
* @param {Promise} promise2
* @return {Promise}
*/
var addTwoPromises = async function(promise1, promise2) {
const result = Promise.all([promise1,promise2]).then(values => values[0] + values[1]);
return result;
};