如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别相关的知识,希望对你有一定的参考价值。

Array.prototype.map()
map() 方法创建一个新数组,其结果是该数组中的每个元素调用一个提供的函数。

Array.prototype.forEach()
forEach() 方法对数组的每个元素执行一次提供的函数。

Array.prototype.reduce()
reduce() 方法对累加器和数组的每个值 (从左到右)应用一个函数,以将其减少为单个值。

虽然都是循环遍历一次 但是map跟reduce是可以带返回值的。
map可以在循环中用回调创建一个新的【数组】,
reduce可以在循环中用回调创建一个新的【单个值】,
forEach仅是循环 与基本的的for无异
参考技术A foreach相当于for遍历

浏览器如何读取和解释 CSS?

【中文标题】浏览器如何读取和解释 CSS?【英文标题】:How do browsers read and interpret CSS? 【发布时间】:2011-04-01 11:09:48 【问题描述】:

两部分问题:

    浏览器是否像 JavaScript 一样具有内置的 CSS 解释器? 浏览器究竟何时读取 CSS,何时应用 CSS?

具体来说,我想澄清一下 JavaScript 和 CSS 是如何或为什么不同的,因为你需要专门等到 window.onload 才能让解释器正确地 getElementById。但是,在 CSS 中,您可以巧妙地选择样式并将其应用于类和 id。

(如果这很重要,假设我指的是一个头部带有外部样式表的基本 HTML 页面)

【问题讨论】:

【参考方案1】:

CSS 渲染是一个有趣的话题,所有的竞争对手都在努力加速视图层(HTML 和 CSS)渲染,以便在眨眼之间为最终用户提供最佳效果。

首先,不同的浏览器都有自己的 CSS 解析器/渲染引擎

Google Chrome、Opera(来自版本 15)-使用 Webkit fork 称为 Blink 渲染引擎 Safari - 使用 Webkit(现在分叉为 Webkit2) Internet Explorer - 使用Trident 渲染引擎。 (+ 更新:Windows 10 上的 Edge 在其未来版本中使用 Chromium fork) Mozilla firefox - 使用Gecko

所有这些渲染引擎都包含 CSS 解释器和HTML DOM parser。

所有这些引擎都遵循下面列出的模型,这些是W3C standard的集合

Visual processing Model Box Model CSS 2.1 Addressing Model

注意:所有这些模型都是相互关联和相互依赖的。他们是 不是单独的模型定义标准来呈现 CSS。这些型号 阐明如何根据内联样式等优先级处理 CSS, 特异性等。


解释:


第 1 阶段:


所有浏览器都从服务器下载 HTML 和 CSS 脚本,然后将 HTML 标记解析为名为 content tree 的树中的 DOM 节点。

当 HTML 文档被解析时,浏览器渲染引擎会构建另一棵树,称为 渲染树。这棵树是按显示顺序排列的视觉元素。

Firefox 将其称为框架,而 Webkit 将它们称为 Renderer 或 Renderer 对象。

见下图:(来源:HTML5 Rocks)


第 2 阶段:


在上述过程之后,这两棵树都会经过布局过程,这意味着浏览器会告诉视口每个节点必须放置在屏幕上的哪个位置。

这被W3C定义为定位方案(点击此链接了解详细信息),它指示浏览器如何以及在何处放置元素。以下是 3 种类型。

正常流 花车 绝对位置

第 3 阶段:


现在称为绘画的最后阶段。这是一个渐进的过程,渲染引擎遍历每个渲染树节点并使用 UI 后端层直观地绘制它们。此时所有visual Fx 都已应用,如字体大小、背景颜色、表格绘制等。

注意:如果您尝试打开任何 网页连接速度慢。为更好的用户而设计的大多数现代浏览器 经验尝试尽快显示元素。这给出了 用户的印象是页面正在加载并且必须等待完成。


工作流程框图以便更好地理解

来源HTML5 Rocks

Webkit:

Mozilla 的壁虎:

参考:(请阅读以下链接。它们是网络上与该主题相关的最佳资源)

http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/(最佳解释) http://www.slideshare.net/ariyahidayat/understanding-webkit-rendering https://html.spec.whatwg.org/multipage/syntax.html#parsing http://dbaron.org/talks/2008-11-12-faster-html-and-css/slide-3.xhtml https://css-tricks.com/almanac/properties/t/text-rendering/ https://www.webkit.org/blog/114/webcore-rendering-i-the-basics/ http://www.w3.org/TR/CSS21/intro.html#addressing

【讨论】:

基于这个流程,浏览器渲染一个css会不会很慢,其中颜色、背景颜色等都被提前声明了,定位和大小在选择器的末尾声明?我很想知道属性的定义顺序是否对渲染速度有影响,如果是,那么它是什么? 通常 CSS 是从下往上解释的。一些浏览器采用自上而下的方法。建议使用 LESS 或 SASS 等 CSS 预处理器,因为这些工具可帮助您编写高效的 CSS。顺序和方案不会影响速度,除非您不重复不必要地覆盖样式的代码,而是创建视觉错误,例如在 Jquery mobile 中修复著名的页脚。 这应该是公认的答案。更详细更完整【参考方案2】:

如果您最近使用过慢速连接,您会发现 CSS 将在元素(缓慢)出现时应用到元素,实际上是在 DOM 结构加载时重排页面内容。由于 CSS 不是一种编程语言,它不依赖于在给定时间可用的对象来正确解析 (JavaScript),并且浏览器能够在检索更多 HTML 时简单地重新评估页面的结构将样式应用于新元素。

也许这就是为什么即使在今天,Mobile Safari 的瓶颈始终不是 3G 连接,而是页面渲染。

【讨论】:

所以,澄清一下,浏览器循环遍历每个元素的 CSS 选择器,而不是循环遍历每个选择器的 HTML 元素? 不,浏览器以阻塞的方式下载和解释 CSS,一次消耗整个 CSS 语句或外部文件。因此,如果您的 CSS 位于头部,它会在渲染之前进行处理。然后,当 HTML 元素流入并被解释时,浏览器会在发现这些元素时不断将样式应用于这些元素。【参考方案3】:

是的,浏览器内置了 CSS 解释器。您不“等到 window.onload”的原因是,虽然 Javascript 是图灵完备的命令式编程语言,但 CSS 只是浏览器的一组样式规则适用于它遇到的匹配元素。

【讨论】:

【参考方案4】:

浏览器从右到左读取 CSS 行。这就是 Google 和 Mozilla 所说的。谷歌在http://code.google.com/speed/page-speed/docs/rendering.html 上说“引擎从右到左评估每条规则”。 Mozilla 在https://developer.mozilla.org/en/Writing_Efficient_CSS 上说“样式系统通过从键选择器开始,然后向左移动来匹配规则”

以这条 CSS 行为例:'.item h4'。浏览器首先搜索页面上的所有 'h4' 标签,然后查看 h4 标签是否有一个类名为 'item' 的父级。如果找到,则应用 CSS 规则。

【讨论】:

很好的答案,但它没有解释 when 浏览器这样做。它是否解析 CSS 文件,查看 .item h4,循环遍历所有 HTML 元素,然后应用样式,然后继续下一个 CSS 选择器?还是先解析 HTML,然后循环遍历 CSS 选择器,匹配.item h4,然后移动到下一个元素? (来自我上面的评论)IOW,它是基于每个选择器循环遍历 HTML 元素,还是基于每个元素循环遍历 CSS 选择器?【参考方案5】:

我最近偶然看到这篇关于谷歌页面速度的文章:

当浏览器解析 HTML 时,它会构建一个内部文档树来表示要显示的所有元素。然后,它根据标准 CSS 级联、继承和排序规则将元素与各种样式表中指定的样式进行匹配。在 Mozilla 的实现中(可能还有其他实现),对于每个元素,CSS 引擎都会搜索样式规则以找到匹配项。引擎从右到左评估每个规则,从最右边的选择器(称为“键”)开始,遍历每个选择器,直到找到匹配项或丢弃规则。 (“选择器”是规则应该应用到的文档元素。)

http://code.google.com/speed/page-speed/docs/rendering.html

【讨论】:

【参考方案6】:

这是我找到的关于浏览器如何处理 HTML 和 CSS 的最佳描述:

渲染引擎将开始解析 HTML 文档并将标签转换为名为“内容树”的树中的 DOM 节点。它将解析外部 CSS 文件和样式元素中的样式数据。 HTML 中的样式信息和可视化指令将用于创建另一棵树 - 渲染树。


一般来说,渲染引擎的工作是:

标记规则(将输入分解为标记 AKA Lexer) 根据语言语法规则分析文档结构构建解析树

CSS 解析器

与 HTML 不同,CSS 是 context free grammar(具有确定性语法)。 所以我们将有CSS specification 定义 CSS 词法和语法语法, 解析器通过样式表应用。

词汇语法(词汇)由每个标记的正则表达式定义:

comment     \/\*[^*]*\*+([^/*][^*]*\*+)*\/
num     [0-9]+|[0-9]*"."[0-9]+
nonascii    [\200-\377]
nmstart     [_a-z]|nonascii|escape
nmchar      [_a-z0-9-]|nonascii|escape
name        nmchar+
ident       nmstartnmchar*

"ident" 是标识符的缩写,类似于类名。 "name" 是一个元素 id(由 "#" 引用)

语法语法在BNF中描述。

ruleset
  : selector [ ',' S* selector ]*
    '' S* declaration [ ';' S* declaration ]* '' S*
  ;
selector
  : simple_selector [ combinator selector | S+ [ combinator selector ] ]
  ;
simple_selector
  : element_name [ HASH | class | attrib | pseudo ]*
  | [ HASH | class | attrib | pseudo ]+
  ;
class
  : '.' IDENT
  ;
element_name
  : IDENT | '*'
  ;
attrib
  : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S*
    [ IDENT | STRING ] S* ] ']'
  ;
pseudo
  : ':' [ IDENT | FUNCTION S* [IDENT S*] ')' ]
  ;

有关浏览器工作流程的详细说明,请查看article。

【讨论】:

文章提到 WebKit 使用 Flex 和 Bison 解析器生成器从 CSS 语法文件自动创建解析器。不过,我无法找到那些语法文件。任何想法?我也将此作为正式问题发布@@***.com/questions/31721308/…【参考方案7】:

我相信浏览器会在找到 CSS 时对其进行解释,其效果是正文中的 CSS(内联)优先于头部中的 CSS(也是外部的)

【讨论】:

以上是关于如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别

如何形象地解释 JavaScript 中 map,foreach,reduce 间的区别

如何形象地解释 JavaScript 中 mapforeachreduce 间的区别?

如何通俗地解释 PID 参数整定?

网络七层协议形象解释

JAVA中,类、对象、实体、实体类、实体对象之间存在怎样的联系??请高手做形象的解释。