判断对象是否为空的一个简单方法是检查对象的所有可枚举属性。如果一个对象没有可枚举属性,那么我们可以认为它是空的。你可以使用 Object.keys()
函数来获取对象的所有可枚举属性,然后检查得到的数组的长度。如果长度为0,那么对象是空的。
function isEmpty(obj) {
return Object.keys(obj).length === 0 && obj.constructor === Object;
}
var myObj = {};
if (isEmpty(myObj)) {
console.log("对象是空的");
} else {
console.log("对象不是空的");
}
对于获取URL参数的API,你可以使用JavaScript的URLSearchParams接口
const urlParams = new URLSearchParams(window.location.search);
const myParam = urlParams.get('myParam');
新版本发布后,你可以使用Web Push通知用户刷新页面。
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js')
.then(() => console.log('Service Worker Registered'))
.catch(err => console.log('Service Worker Registration Failed: ', err));
}
强制浏览器在一定时间内直接从本地缓存读取数据,不向服务器发送请求。强缓存可以通过设置响应头信息实现,常见的响应头有 Expires 和 Cache-Control。
在强缓存失效时,浏览器会向服务器发送请求,询问服务器该资源在最后一次访问后是否有修改。如果没有修改,服务器会返回 304 状态码,告诉浏览器可以继续使用本地缓存,否则会返回新的资源内容。协商缓存可以通过设置响应头信息实现,常见的响应头有 Last-Modified 和 ETag。
5.3.1、浏览器收到 HTTP 请求时,会根据 URL 判断该资源是否已经被缓存。如果已经被缓存,则直接从本地缓存读取资源。
5.3.2、如果未被缓存或者缓存已经过期,浏览器会向服务器发送请求,并在请求中带上一些信息,例如上次访问时间、Etag 等。
服务器收到请求后,根据请求中的信息判断资源是否有更新。如果资源没有更新,则返回一个 304 响应码,告诉浏览器可以继续使用本地缓存;如果资源已经更新,则返回新的资源内容和一些缓存相关的头信息。
5.3.3、浏览器收到响应后,会根据响应头信息来更新本地缓存,并将新的资源内容展示给用户
function myNew(ctor, ...args) {
// 创建一个新对象,并将该对象的原型指向构造函数的原型对象
const obj = Object.create(ctor.prototype);
// 调用构造函数,并将新对象作为 this 参数传递进去
const result = ctor.apply(obj, args);
// 如果构造函数返回了一个非空对象,则返回该对象;否则,返回创建的新对象
if (typeof result === 'object' && result !== null) {
return result;
}
return obj;
}
// 测试:
function Person(name, age) {
this.name = name;
this.age = age;
}
const person = myNew(Person, '张三', 18);
console.log(person.name); // 输出:张三
console.log(person.age); // 输出:18
JavaScript中的每个对象都有一个原型,也就是它们继承属性和方法的对象。而这个原型又可以有自己的原型,形成了所谓的“原型链”。
当我们访问一个JavaScript对象的属性或方法时,首先会在该对象本身查找是否存在该属性或方法。如果不存在,它会沿着该对象的原型链向上查找,一直到Object.prototype为止。如果还没有找到,则返回undefined。
因此,通过原型链,我们可以实现继承和代码复用。例如,我们可以创建一个基础对象,并将其作为其他对象的原型,使得后者能够共享基础对象的属性和方法。
// 防抖-多次点击,只执行一次
function debounces(fn, time) {
let timer
return function() {
if(timer) {
clearTimeout(timer)
}
timer = setTimeout(() => {
fn.apply(this, arguments);
}, time)
}
}
// 节流-一定时间内,只执行一次
function throttle(fn, time) {
let timer
return function() {
if (timer) {
timer = setTimeout(() => {
fn.apply(this, arguments)
timer = null
}, time)
}
}
}
今天先到这块,持续更新...