青少年心理建设网站,怎样做网站链接,重庆市建设工程造价信息2020,阆中网站建设1、js两个数相加会不会丢精度#xff1f;
可能会遇到精度丢失的问题。JavaScript 使用的是 IEEE 754 浮点数标准#xff0c;即一种二进制表示法#xff0c;有时不能准确地表示十进制小数。如果你需要进行精确的十进制数值计算#xff0c;可以使用一些处理精确数值的库
可能会遇到精度丢失的问题。JavaScript 使用的是 IEEE 754 浮点数标准即一种二进制表示法有时不能准确地表示十进制小数。如果你需要进行精确的十进制数值计算可以使用一些处理精确数值的库比如 BigInt、Decimal.js 或者 big.js。
2、整数溢出
在 JavaScript 中整数溢出是指超出了 JavaScript 数值类型的范围导致无法准确表示这个整数。如果需要处理大整数可以考虑使用 BigInt 类型或者使用第三方库来处理。
3、接口调用超时抛出错误怎么实现
用Promise.race实现其 接受一个包含多个 Promise 的可迭代对象比如数组并返回一个新的 Promise该 Promise 将与最先解决fulfilled或拒绝rejected的 值。
function timeoutPromise(ms) {return new Promise((resolve, reject) {setTimeout(() {reject(new Error(接口调用超时));}, ms);});
}function apiCall() {return new Promise((resolve, reject) {// 模拟异步接口调用setTimeout(() {resolve(接口调用成功);}, 500);});
}// 设置超时时间
const timeoutDuration 300;// 使用 Promise.race 同时执行接口调用和超时 Promise
Promise.race([apiCall(), timeoutPromise(timeoutDuration)]).then((result) {// 如果接口调用在超时前完成result 将是接口调用的结果console.log(result);}).catch((error) {// 如果超时或者接口调用出错error 将是相应的错误对象console.error(error.message);});4、 发布订阅者模式和观察者模式区别
发布-订阅者模式 使用一个消息代理消息通道或者事件总线作为中介发布者和订阅者之间没有直接联系而是通过事件中心进行通信。EventBus.观察者模式 观察者直接订阅被观察者被观察者维护观察者列表当状态发生变化时直接通知观察者。Observer.
4.1 观察者模式
// 被观察者Subject
class Subject {constructor() {this.observers []; // 观察者列表}// 添加观察者addObserver(observer) {this.observers.push(observer);}// 移除观察者removeObserver(observer) {this.observers this.observers.filter(obs obs ! observer);}// 通知观察者状态变化notifyObservers(message) {this.observers.forEach(observer observer.update(message));}
}// 观察者Observer
class Observer {constructor(name) {this.name name;}// 被观察者通知时调用的方法update(message) {console.log(${this.name} 收到通知: ${message});}
}// 创建被观察者和观察者
const newsSubject new Subject();const observer1 new Observer(Observer 1);
const observer2 new Observer(Observer 2);// 观察者订阅被观察者
newsSubject.addObserver(observer1);
newsSubject.addObserver(observer2);// 被观察者通知观察者
newsSubject.notifyObservers(新闻更新: 今天发生了一些重要事件。);4.2 Vue.js 中的响应式原理
Object.defineProperty观察者模式 Observer观察者 Vue.js 会遍历对象的每个属性使用 Object.defineProperty 把属性转换为 getter 和 setter。当数据被访问或者修改时会触发 getter 和 setter 中相应的逻辑。 Dep依赖订阅者 为每个被观察的属性创建一个 Dep 对象用于管理依赖于该属性的 Watcher 对象。Dep 对象有一个数组用于存储 Watcher。 Watcher桥梁 Watcher 对象会订阅一个或多个 Dep 对象。当被观察的数据发生变化时Watcher 对象会收到通知从而执行相应的回调函数。
function defineReactive(obj, key, val) {let dep new Dep();Object.defineProperty(obj, key, {enumerable: true,configurable: true,get() {if (Dep.target) {dep.addSub(Dep.target);}return val;},set(newVal) {if (newVal ! val) {val newVal;dep.notify();}}});
}class Dep {constructor() {this.subs [];}addSub(sub) {this.subs.push(sub);}notify() {this.subs.forEach(sub sub.update());}
}class Watcher {constructor() {Dep.target this;}update() {console.log(数据发生变化执行更新操作);}
}Dep.target null;const data {};
defineReactive(data, message, Hello, Vue!);const watcher new Watcher();// 模拟触发数据变化
data.message Hello, Vue.js!;5、迭代器是什么
迭代器Iterator是 JavaScript 中的一个接口它提供了一种顺序访问数据结构如数组、Map、Set 等元素的方法。迭代器对象可以通过 next() 方法依次访问数据结构中的每一个元素直到数据结构的末尾返回一个包含 value 和 done 属性的对象。
// 创建一个简单的数组
const myArray [apple, banana, cherry];// 获取迭代器对象
const iterator myArray[Symbol.iterator]();// 使用迭代器对象遍历数组元素
let result iterator.next();
while (!result.done) {console.log(result.value);result iterator.next();
}myArray 是一个包含三个元素的数组。通过 [Symbol.iterator]() 获取了该数组的迭代器对象 iterator。使用 iterator.next() 方法来依次访问数组中的每个元素直到 done 属性为 true表示迭代结束。
6、前端可以通过文件切片上传断点传输
前端可以通过文件切片上传File Chunking的方式来实现大文件的上传这有助于避免上传过程中遇到的一些问题例如网络中断导致整个文件上传失败的情况。
!DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titleFile Chunk Upload/title
/head
bodyinput typefile idfileInput /button onclickuploadFile()Upload/buttonscriptfunction uploadFile() {const fileInput document.getElementById(fileInput);const file fileInput.files[0];const chunkSize 1024 * 1024; // 1MBconst totalChunks Math.ceil(file.size / chunkSize);let currentChunk 0;function uploadChunk() {const start currentChunk * chunkSize;const end Math.min((currentChunk 1) * chunkSize, file.size);const chunk file.slice(start, end);const formData new FormData();formData.append(fileChunk, chunk);formData.append(totalChunks, totalChunks);formData.append(currentChunk, currentChunk);// 使用 XMLHttpRequest 或 Fetch API 发送 formData 到服务器// ...currentChunk;if (currentChunk totalChunks) {// 继续上传下一个块uploadChunk();} else {// 所有块上传完成服务器处理合并等操作console.log(File upload complete!);}}// 开始上传第一个块uploadChunk();}/script
/body
/html6、vue的生命周期 data和method什么时候更新的什么时候可以拿到vue实例
vue生命周期
在 created 钩子之后你可以安全地访问和操作 data 和 methods而在 beforeCreate 钩子中它们还未被初始化。如果需要在初始化阶段执行一些逻辑可以使用 beforeCreate 钩子。如果需要在 DOM 元素渲染后进行操作可以使用 mounted 钩子。
7、