当前位置: 首页 > news >正文

兰州今天发生的重大新闻seo课堂

兰州今天发生的重大新闻,seo课堂,wordpress主题对比,wordpress手机端侧边工具栏通过这个简单的技巧让我们的 JavaScript 代码变得异常快 秘诀:了解JavaScript 虚拟机(VM)的内部工作原理。 首先,我们来谈谈像 V8 这样的JavaScript 虚拟机(VM)。可以把它想象成我们的操作的大脑 —— 它将我们简洁的代码变成计算机可以理解和执行的东…

通过这个简单的技巧让我们的 JavaScript 代码变得异常快

秘诀:了解JavaScript 虚拟机(VM)的内部工作原理。

首先,我们来谈谈像 V8 这样的JavaScript 虚拟机(VM)。可以把它想象成我们的操作的大脑 —— 它将我们简洁的代码变成计算机可以理解和执行的东西。

好的、坏的代码

让我们深入研究一些代码示例,看看好的、坏的和执行快的代码。

缓慢的 JavaScript 示例:

function addProperty(obj, propName, value) {obj[propName] = value; // 这会改变对象的形状
}
const responseObject = { user1: 1, user2: 2 };
addProperty(responseObject, 'user3', 3); // 添加新的属性

是什么让它变慢?

形状更改:每次调用 addProperty 函数时,都会向对象添加一个新属性。这会改变对象的“形状”,即它包含的键变了,这反过来又会颠覆 JavaScript 引擎的优化。

添加或删除属性时,引擎可能必须丢弃以前的优化信息并重新开始。这种“形状变化”就是操作缓慢的原因。

快速 JavaScript 示例:

function  createObject ( a, b, c ) { 
// 对象的形状是固定的并且VM可以预测return { a, b, c }; 
} 
const dataObject = createObject ( 212,2344,43545);

是什么让它如此快速?

可预测的形状:

该对象是使用一组固定的属性创建的。创建后没有任何变化,更容易引擎优化。

隐藏类重用:

由于每次调用 createObject 时对象的形状都是一致的,因此 JavaScript 引擎可以重用为此形状创建的隐藏类。这种重用允许非常快速的属性访问,因为引擎确切地知道每个属性在内存中的位置。

为什么对象形状很重要:

当我们访问对象的属性时,引擎不想搜索所有属性来找到它。相反,它想要直接访问该属性在内存中的位置。如果对象的形状已知,引擎可以记住每个属性所在的位置(这称为“内联缓存”)。但是,如果形状发生变化(如上面的缓慢示例),引擎必须“重新学习”属性位置,这要慢得多。

为了获得最佳性能,特别是在频繁访问属性的代码关键部分,最好:

  • 创建对象时初始化所有属性:即使某些属性最初可能未定义。
  • 避免添加或删除属性:这可以保持对象的形状稳定。
  • 尽可能重用对象形状:创建始终生成具有相同属性集的对象的工厂函数。

通过遵循这些实践,我们可以帮助 JavaScript 引擎优化我们的代码,从而加快执行速度。

常见的用例

当处理来自外部源的对象(例如 API 响应或 DOM 元素)时,在使用这些对象之前将它们规范化为一致的形状对性能有益。这允许 JavaScript 引擎优化对这些对象的访问,因为形状(对象内的所有键)是可预测的并且不会改变。当我们频繁读取对象时,这种做法尤其有价值。

让我们来看下面两个常见的示例

通过 API 获取用户信息

慢速版本:

在慢速版本中,属性被一一添加到对象中,这可能会导致 JavaScript 引擎由于形状变化而取消对对象的访问优化。

function fetchUserProfile(url) {fetch(url).then(response => response.json()).then(user => {const userProfile = {};if (user.name) {userProfile.name = user.name;}if (user.age) {userProfile.age = user.age;}if (user.email) {userProfile.email = user.email;}// ...处理更多的属性return userProfile;});
}
快速版本:

在快速版本中,我们从一开始就创建一个具有已知形状的对象,即使某些属性可能未定义。这种一致性允许 JavaScript 引擎优化属性访问。

function fetchUserProfile(url) {return fetch(url).then(response => response.json()).then(user => {// 先定义对象中包含的所有的属性const userProfile = {name: user.name || undefined,age: user.age || undefined,email: user.email || undefined,// ... 初始化更多属性};return userProfile;});
}

在快速版本中,即使用户对象不具有我们分配给 userProfile 的所有属性,我们仍然使用其相应的值或未定义的值来定义我们期望的所有键。这样,userProfile 的形状保持一致,这有利于稍后访问其属性时的性能。

这种做法对于性能关键型应用程序至关重要,优化可以极大地提高执行速度。

如果上面的例子让我们想起了什么,那是因为这个模式看起来像工厂模式,它遵循类似于工厂函数的原则,通过创建一个具有预定义形状的对象,但它并不完全是这样。在 JavaScript 中,工厂模式通常涉及构造并返回新对象的专用函数。当创建过程复杂或需要执行一些额外的设置工作时,工厂函数特别有用。

使用工厂模式

在给定的快速示例中,我们看到了一种创建具有一致形状的对象的方法。为了使其与工厂模式更加一致,我们可以将对象创建封装在专用函数中,如下所示:

function createUserProfile(name, age, email) {
// 通过工厂模式创建对象return {name: name || undefined,age: age || undefined,email: email || undefined,// ...};}function fetchUserProfile(url) {return fetch(url).then(response => response.json()).then(user => {return createUserProfile(user.name, user.age, user.email);});
}

在这个版本中,createUserProfile 是一个工厂函数,总是创建具有相同形状的对象,这有利于优化。fetchUserProfile 函数使用此工厂创建一个新的 userProfile 对象。

使用DOM

现在让我们讨论另一个常见的示例,在使用 DOM 时,我们经常需要从 HTML 元素读取信息,然后在应用程序中使用这些数据。保持对象形状一致对于性能非常重要,尤其是当我们重复执行这些操作时。

下面的示例演示了对象形状发生变化的慢速代码示例,以及对象形状可预测且一致的快速方法。

慢速代码示例
function getUserData() {const userObject = {};const userName = document.querySelector('#input-name');if (nameElement) {userObject.name = nameElement.textContent;}const userAge = document.querySelector('#input-age');if (ageElement) {userObject.age = parseInt(ageElement.textContent);}// 每次调用此函数时,它可能会也可能不会添加新属性// 这可能会导致对象形状发生变化return userObject;
}
快速代码示例
function createUserData(name = undefined, age = undefined) {
// 始终返回具有相同形状的对象的工厂函数return { name, age };
}
function getUserData() {const userName = document.querySelector('#input-name');const userAge = parseInt(document.querySelector('#input-age')?.textContent);// 无论元素是否存在,对象的形状都是一致的return createUserData(userName?.textContent, Number.isNaN(userAge) ? undefined : userAge);
}

在上面代码中,createUserData 工厂函数确保返回的对象始终具有相同的形状,这有利于 JavaScript 引擎的优化过程。getUserData 函数使用此工厂函数来创建配置文件数据对象,并通过提供 undefined 作为默认值来处理丢失的 DOM 元素,从而维护对象的形状。

通过使用可选链接运算符 (?.) 和空合并运算符 (??),我们可以进一步细化该函数以处理 DOM 元素可能不存在的情况:

function getUserData() {const name = document.querySelector('#input-name')?.textContent ?? undefined;const ageText = document.querySelector('#input-age')?.textContent ?? undefined;const age = ageText ? parseInt(ageText) : undefined;// 对象的形状一致return createUserData(name, age);
}

这种方法可以确保对象的形状保持不变,即使在 DOM 中找不到某些元素,这在动态 Web 应用程序中很常见,因为有时元素尚未渲染或元素渲染顺序不正确。


文章转载自:
http://indivertible.tkjh.cn
http://interpersonal.tkjh.cn
http://knifesmith.tkjh.cn
http://arietis.tkjh.cn
http://plumbago.tkjh.cn
http://sanitary.tkjh.cn
http://guitar.tkjh.cn
http://autotransplant.tkjh.cn
http://underpinning.tkjh.cn
http://kidd.tkjh.cn
http://erlang.tkjh.cn
http://telebanking.tkjh.cn
http://motoric.tkjh.cn
http://deficiently.tkjh.cn
http://reinhabit.tkjh.cn
http://sudoriferous.tkjh.cn
http://lichenaceous.tkjh.cn
http://towhee.tkjh.cn
http://polltaker.tkjh.cn
http://loadstar.tkjh.cn
http://incorruptible.tkjh.cn
http://gravelly.tkjh.cn
http://degradative.tkjh.cn
http://amphibrach.tkjh.cn
http://honorand.tkjh.cn
http://perdition.tkjh.cn
http://lechery.tkjh.cn
http://peritricha.tkjh.cn
http://disarticulate.tkjh.cn
http://unskilful.tkjh.cn
http://allegorization.tkjh.cn
http://synonymity.tkjh.cn
http://pouter.tkjh.cn
http://hyperkinesia.tkjh.cn
http://picomole.tkjh.cn
http://commemorate.tkjh.cn
http://spondylitic.tkjh.cn
http://fidge.tkjh.cn
http://ignitable.tkjh.cn
http://sferics.tkjh.cn
http://tankman.tkjh.cn
http://circumgyrate.tkjh.cn
http://chiropter.tkjh.cn
http://polygraph.tkjh.cn
http://collodionize.tkjh.cn
http://aphasiac.tkjh.cn
http://detonable.tkjh.cn
http://guajira.tkjh.cn
http://explore.tkjh.cn
http://coaler.tkjh.cn
http://pinafore.tkjh.cn
http://tungusic.tkjh.cn
http://pechora.tkjh.cn
http://desmolase.tkjh.cn
http://prebend.tkjh.cn
http://crepon.tkjh.cn
http://padlock.tkjh.cn
http://ptolemaist.tkjh.cn
http://familiarity.tkjh.cn
http://quadrillionth.tkjh.cn
http://transamination.tkjh.cn
http://gregarinian.tkjh.cn
http://reactive.tkjh.cn
http://limburg.tkjh.cn
http://pretension.tkjh.cn
http://sideshow.tkjh.cn
http://submergence.tkjh.cn
http://sintering.tkjh.cn
http://raddled.tkjh.cn
http://drillstock.tkjh.cn
http://mercerize.tkjh.cn
http://shoebrush.tkjh.cn
http://atrophied.tkjh.cn
http://octodecimo.tkjh.cn
http://delegate.tkjh.cn
http://peaceless.tkjh.cn
http://semolina.tkjh.cn
http://reducing.tkjh.cn
http://blellum.tkjh.cn
http://trigonometry.tkjh.cn
http://handsaw.tkjh.cn
http://recommission.tkjh.cn
http://recollectedness.tkjh.cn
http://goramy.tkjh.cn
http://performance.tkjh.cn
http://phraseology.tkjh.cn
http://precisian.tkjh.cn
http://galvanotropism.tkjh.cn
http://camerlengo.tkjh.cn
http://fludrocortisone.tkjh.cn
http://falciform.tkjh.cn
http://pivottable.tkjh.cn
http://pyrexic.tkjh.cn
http://capeline.tkjh.cn
http://hypercriticism.tkjh.cn
http://epulosis.tkjh.cn
http://oaves.tkjh.cn
http://superheater.tkjh.cn
http://loyalty.tkjh.cn
http://tragical.tkjh.cn
http://www.hrbkazy.com/news/73934.html

相关文章:

  • 装饰公司手机网站建设网站怎么收录到百度
  • 四川建设银行手机银行下载官方网站下载河北关键词seo排名
  • 网站为什么做版心限制广告软文怎么写
  • 湖北网站备案需要多久如何制作一个网页链接
  • 网站没有后台登陆文件夹佛山百度seo代理
  • 沈阳网站建设推广服务下载百度软件
  • 定制网站建设公司推荐天津网站优化软件
  • iis7.5 网站配置微信运营工具
  • 公司建网站多少钱晋江文学城龙岗网站建设公司
  • 买实体服务器做网站百度精简版入口
  • 主流的网站开发语言微信怎么推广自己的产品
  • 好看网站的浏览器万物识别扫一扫
  • 合肥专业做网站西安做推广优化的公司
  • 网站开发程序员工资深圳优化seo排名
  • idea做网站有效果的网站排名
  • ag网站建设什么软件可以推广自己的产品
  • wordpress文章字体颜色大连seo外包平台
  • 小学网站建设方案百度地图推广怎么做的
  • 建站平台 做网站不用流量的地图导航软件
  • flash网站效果网络维护培训班
  • 制作一个购物网站需要多少钱seo新站如何快速排名
  • 深深圳市建设局网站企业推广app
  • 湖南住房城乡建设厅官方网站网站服务器查询
  • 网站内容如何优化推广app软件
  • 网上订餐网站模板离我最近的广告公司
  • 佛山html5网站建设电商培训班一般多少钱一个月
  • 网站开发工具以及优缺点企业网络营销推广方法
  • wordpress建站给媒体分类企业网站cms
  • it网站建设想做seo哪里有培训的
  • 网站域名自己做建个网站费用大概多少钱一年