<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Roger Lin</title>
    <description>The latest articles on Forem by Roger Lin (@itroger).</description>
    <link>https://forem.com/itroger</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F907685%2F496f4aae-cf64-4733-8e5c-3d86a564a4a7.jpeg</url>
      <title>Forem: Roger Lin</title>
      <link>https://forem.com/itroger</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/itroger"/>
    <language>en</language>
    <item>
      <title>JavaScript —— Aysnc</title>
      <dc:creator>Roger Lin</dc:creator>
      <pubDate>Fri, 24 Feb 2023 02:52:47 +0000</pubDate>
      <link>https://forem.com/itroger/javascript-aysnc-74d</link>
      <guid>https://forem.com/itroger/javascript-aysnc-74d</guid>
      <description>&lt;h2&gt;
  
  
  Promise
&lt;/h2&gt;

&lt;h3&gt;
  
  
  状态
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pending: 初始状态&lt;/li&gt;
&lt;li&gt;Fulfilled: 成功&lt;/li&gt;
&lt;li&gt;Rejected: 失败&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  静态方法
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Promise.resolve()&lt;/code&gt;: Fulfilled 的 promise&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Promise.reject()&lt;/code&gt;: Rejected 的 promise&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Promise.all()&lt;/code&gt;: 所有 promise 成功为 Fulfilled, 否则为 Rejected&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Promise.allSettled()&lt;/code&gt;: 所有 promise 的结果数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Promise.race()&lt;/code&gt;: 最快 Fulfilled 或 Rejected 的 promise&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Promise.any()&lt;/code&gt;: 最快 Fulfilled 的 promise&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  实例方法
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;then()&lt;/code&gt;: Fulfilled 或 Rejected 后执行&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;catch()&lt;/code&gt;: 发生错误时执行&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;finally()&lt;/code&gt;: 最后始终执行&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  异步函数
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;异步函数返回一个 Promise.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;func1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{...}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;func2&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;func1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>javascript</category>
    </item>
    <item>
      <title>JavaScript —— Class</title>
      <dc:creator>Roger Lin</dc:creator>
      <pubDate>Fri, 24 Feb 2023 02:34:17 +0000</pubDate>
      <link>https://forem.com/itroger/javascript-class-1h24</link>
      <guid>https://forem.com/itroger/javascript-class-1h24</guid>
      <description>&lt;h2&gt;
  
  
  类定义
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;类声明: &lt;code&gt;class Person {...}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;类表达式: &lt;code&gt;const Person = class {...}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;类声明和函数声明不同的是, 类声明不会提升, 在类声明前使用, 将抛出 ReferenceError.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  类方法
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;构造函数: &lt;code&gt;constructor() {...}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;get 方法: &lt;code&gt;get name() {...}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;set 方法: &lt;code&gt;set name() {...}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;原型方法: &lt;code&gt;func() {...}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;静态方法: &lt;code&gt;static func() {...}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;私有方法: &lt;code&gt;#func() {...}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  类属性
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;静态属性: &lt;code&gt;static name = 'itroger'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;公有属性: &lt;code&gt;name = 'itroger'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;私有属性: &lt;code&gt;#name = 'itroger'&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  继承
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;类继承: &lt;code&gt;class Dog extends Animal {...}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;super&lt;/code&gt; 调用父类&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;this&lt;/code&gt; 引用类本身&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>JavaScript —— Collections</title>
      <dc:creator>Roger Lin</dc:creator>
      <pubDate>Thu, 23 Feb 2023 11:26:32 +0000</pubDate>
      <link>https://forem.com/itroger/javascript-collections-a78</link>
      <guid>https://forem.com/itroger/javascript-collections-a78</guid>
      <description>&lt;h2&gt;
  
  
  Map
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;保证顺序的 key-value 映射集合.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  实例属性
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;size&lt;/code&gt;: 成员数量&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  实例方法
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;get()&lt;/code&gt;: 根据 key 获取 value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;set()&lt;/code&gt;: 根据 key 设置 value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;has()&lt;/code&gt;: 是否存在 key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;delete()&lt;/code&gt;: 根据 key 删除&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;clear()&lt;/code&gt;: 清空&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;forEach()&lt;/code&gt;: 遍历&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;entries()&lt;/code&gt;: 返回 [key, value] 迭代器&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;keys()&lt;/code&gt;: 返回 key 迭代器&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;values()&lt;/code&gt;: 返回 value 迭代器&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Object&lt;/code&gt; 的 key 必须为 &lt;code&gt;String&lt;/code&gt; 类型, &lt;code&gt;Map&lt;/code&gt; 的 key 为任意类型.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object&lt;/code&gt; 的成员数量需要手动计算, &lt;code&gt;Map&lt;/code&gt; 可以通过 &lt;code&gt;size&lt;/code&gt; 属性读取.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object&lt;/code&gt; 遍历不能保证顺序, &lt;code&gt;Map&lt;/code&gt; 遍历和插入顺序一直.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object&lt;/code&gt; 有原型, 存在原型链上的 key.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WeakMap&lt;/code&gt; 的 key 必须为对象类型, 没有遍历和清空方法.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Set
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;存储任意类型的唯一值且保证顺序, 常用于去重.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  实例属性
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;size&lt;/code&gt;: 成员数量&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  实例方法
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;add()&lt;/code&gt;: 新增 value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;has()&lt;/code&gt;: 是否存在 value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;delete()&lt;/code&gt;: 删除 value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;clear()&lt;/code&gt;: 清空&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;forEach()&lt;/code&gt;: 遍历&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;entries()&lt;/code&gt;: 返回 [value, value] 迭代器&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;keys()&lt;/code&gt;: 返回 value 迭代器&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;values()&lt;/code&gt;: 返回 value 迭代器&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;WeakSet&lt;/code&gt; 的 key 必须为对象类型, 没有遍历和清空方法.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>JavaScript —— Function</title>
      <dc:creator>Roger Lin</dc:creator>
      <pubDate>Thu, 23 Feb 2023 11:05:32 +0000</pubDate>
      <link>https://forem.com/itroger/javascript-function-4k1e</link>
      <guid>https://forem.com/itroger/javascript-function-4k1e</guid>
      <description>&lt;h2&gt;
  
  
  实例方法
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;apply(thisArg, argsArray)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;call(thisArg, arg, ...)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bind(thisArg, arg, ...)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  定义函数
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;函数声明: &lt;code&gt;function func(){}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;函数表达式: &lt;code&gt;const func = function(){}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;箭头函数: &lt;code&gt;const func = () =&amp;gt; {}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;函数声明存在提升&lt;/li&gt;
&lt;li&gt;箭头函数没有 &lt;code&gt;this&lt;/code&gt;, 没有原型链, 不能被 &lt;code&gt;new&lt;/code&gt;, 不能使用函数的实例方法.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  内置函数
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;eval()&lt;/code&gt;: 字符串解析成代码执行&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;isfinite()&lt;/code&gt;: 是否为有限的数字&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;parseFloat()&lt;/code&gt;: 字符串转成浮点数&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;parseInt()&lt;/code&gt;: 字符串转成整数&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;encodeURI()&lt;/code&gt;: 编码&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;decodeURI()&lt;/code&gt;: 解码&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;encodeURIComponent()&lt;/code&gt;: 编码&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;decodeURIComponent()&lt;/code&gt;: 解码&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>deployment</category>
      <category>cloud</category>
      <category>cicd</category>
    </item>
    <item>
      <title>JavaScript —— Object</title>
      <dc:creator>Roger Lin</dc:creator>
      <pubDate>Thu, 23 Feb 2023 10:05:57 +0000</pubDate>
      <link>https://forem.com/itroger/javascript-object-2e81</link>
      <guid>https://forem.com/itroger/javascript-object-2e81</guid>
      <description>&lt;h2&gt;
  
  
  静态方法
&lt;/h2&gt;

&lt;h3&gt;
  
  
  对象操作
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Object.assign()&lt;/code&gt;: 从一个或多个源对象复制可枚举的自有属性到目标对象&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.create()&lt;/code&gt;: 使用现有的对象作为新创建对象的原型&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.fromEntries()&lt;/code&gt;: 将 [key, value] 列表转化成对象&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  对象判断
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Object.is()&lt;/code&gt;: 是否为同一对象&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.isExtensible()&lt;/code&gt;: 是否可添加属性&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.isFrozen()&lt;/code&gt;: 是否被冻结属性&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.isSealed()&lt;/code&gt;: 是否被密封&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.freeze()&lt;/code&gt;: 冻结对象属性不能新增或修改&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.preventExtensions()&lt;/code&gt;: 禁止对象新增属性&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.seal()&lt;/code&gt;: 禁止添加新属性并且现有属性不可配置&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  对象原型
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Object.getPrototypeOf()&lt;/code&gt;: 对象原型&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.setPrototypeOf()&lt;/code&gt;: 设置原型&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  属性操作
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Object.defineProperty()&lt;/code&gt;: 新增或修改一个属性&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.defineProperties()&lt;/code&gt;: 新增或修改多个属性&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.getOwnPropertyDescriptor()&lt;/code&gt;: 对象的一个自有属性描述符&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.getOwnPropertyDescriptors()&lt;/code&gt;: 对象的所有自有属性描述符&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.getOwnPropertyNames()&lt;/code&gt;: 对象的所有自有属性名数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.getOwnPropertySymbols()&lt;/code&gt;: 对象自有 &lt;code&gt;Symbol&lt;/code&gt; 属性数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.hasOwn()&lt;/code&gt;: 是否为自有属性&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  对象遍历
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Object.entries()&lt;/code&gt;: 返回可枚举自有属性的 [key, value] 迭代对象&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.keys()&lt;/code&gt;: 返回可枚举自有属性的 key 迭代对象&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.values()&lt;/code&gt;: 返回可枚举自有属性的 value 迭代对象&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  实例方法
&lt;/h2&gt;

&lt;h3&gt;
  
  
  对象原型
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Object.prototype.isPrototypeOf()&lt;/code&gt;: 是否为原型链&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  属性操作
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Object.prototype.hasOwnProperty()&lt;/code&gt;: 是否为自有属性&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Object.prototype.propertyIsEnumerable()&lt;/code&gt;: 属性是否可枚举&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>JavaScript —— Array</title>
      <dc:creator>Roger Lin</dc:creator>
      <pubDate>Thu, 23 Feb 2023 09:39:17 +0000</pubDate>
      <link>https://forem.com/itroger/javascript-array-gc2</link>
      <guid>https://forem.com/itroger/javascript-array-gc2</guid>
      <description>&lt;h2&gt;
  
  
  静态方法
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Array.from()&lt;/code&gt;: 使用迭代对象创建数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Array.isArray()&lt;/code&gt;: 是否为数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Array.of()&lt;/code&gt;: 使用元素创建数组&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  实例属性
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;length&lt;/code&gt;: 数组长度&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  实例方法
&lt;/h2&gt;

&lt;h3&gt;
  
  
  访问元素
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;at()&lt;/code&gt;: 根据索引访问元素&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  填充数组
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fill()&lt;/code&gt;: 填充数组, 改变原数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;concat()&lt;/code&gt;: 合并数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;copyWithin()&lt;/code&gt;: 复制部分数组到另一位置, 改变原数组&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  遍历数组
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;entries()&lt;/code&gt;: 返回一个 [key, value] 的迭代器对象&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;keys()&lt;/code&gt;: 返回一个 key 的迭代器对象&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;values()&lt;/code&gt;: 返回一个 value 的迭代器对象&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;forEach()&lt;/code&gt;: 遍历数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;map()&lt;/code&gt;: 遍历并返回一个新数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;filter()&lt;/code&gt;: 过滤数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;every()&lt;/code&gt;: 是否全部通过&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;some()&lt;/code&gt;: 是否至少一个通过&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reduce()&lt;/code&gt;: 从左到右累计操作&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reduceRight()&lt;/code&gt;: 从右到左累计操作&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  搜索数组
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;includes()&lt;/code&gt;: 是否存在元素&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;indexOf()&lt;/code&gt;: 查找第一个匹配的 key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lastIndexOf()&lt;/code&gt;: 查找最后一个匹配的 key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;findIndex()&lt;/code&gt;: 查找第一个匹配的 key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;findLastIndex()&lt;/code&gt;: 查找最后一个匹配的 key&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;find()&lt;/code&gt;: 查找第一个匹配的 value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;findLast()&lt;/code&gt;: 查找最后一个匹配的 value&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  数组操作
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;push()&lt;/code&gt;: 入栈, 改变原数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pop()&lt;/code&gt;: 出栈, 改变原数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unshift()&lt;/code&gt;: 开头入栈, 改变原数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shift()&lt;/code&gt;: 开头出栈, 改变原数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reverse()&lt;/code&gt;: 倒置数组, 改变原数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sort()&lt;/code&gt;: 排序数组, 改变原数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;splice()&lt;/code&gt;: 删增数组, 改变原数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;join()&lt;/code&gt;: 指定间隔转成字符串&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;slice()&lt;/code&gt;: 切片数组&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  扁平化数组
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;flat()&lt;/code&gt;: 指定深度扁平化数组&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;flatMap()&lt;/code&gt;: 深度为 1 扁平化数组后使用 &lt;code&gt;map()&lt;/code&gt; 方法&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  对象数组转化成对象
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;group()&lt;/code&gt;: 对象数组转化成 &lt;code&gt;Object&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;groupToMap()&lt;/code&gt;: 对象数组转化成 &lt;code&gt;Map&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>JavaScript —— String</title>
      <dc:creator>Roger Lin</dc:creator>
      <pubDate>Thu, 23 Feb 2023 08:50:08 +0000</pubDate>
      <link>https://forem.com/itroger/javascript-string-220</link>
      <guid>https://forem.com/itroger/javascript-string-220</guid>
      <description>&lt;h2&gt;
  
  
  静态方法
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;String.fromCharCode()&lt;/code&gt;: &lt;code&gt;UTF-16&lt;/code&gt; 编码创建字符串&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;String.fromCodePoint()&lt;/code&gt;: &lt;code&gt;Unicode&lt;/code&gt; 编码创建字符串&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;String.raw()&lt;/code&gt;: 模版字符串创建字符串&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  实例属性
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;length&lt;/code&gt;: 字符串长度&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  实例方法
&lt;/h2&gt;

&lt;h3&gt;
  
  
  访问字符
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;at()&lt;/code&gt;: 索引字符, 支持负数索引&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;charAt()&lt;/code&gt;: 索引字符, 不支持负数索引&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;charCodeAt()&lt;/code&gt;: 索引字符对应的 &lt;code&gt;UTF-16&lt;/code&gt; 编码&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;codePointAt()&lt;/code&gt;: 索引字符对应的 &lt;code&gt;Unicode&lt;/code&gt; 编码&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  转换字符串
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;toUpperCase()&lt;/code&gt;: 转成全部大写&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;toLowerCase()&lt;/code&gt;: 转成全部小写&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;toLocaleUpperCase()&lt;/code&gt;: 根据环境转成全部大写&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;toLocaleLowerCase()&lt;/code&gt;: 根据环境转成全部小写&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  判断字符串
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;startsWith()&lt;/code&gt;: 是否以子串开头&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;endsWith()&lt;/code&gt;: 是否以子串结尾&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;includes()&lt;/code&gt;: 是否包含子串&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;localeCompare()&lt;/code&gt;: 判断两个字符串的字典顺序&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  搜索字符串
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;indexOf()&lt;/code&gt;: 从左到右, 子串第一次匹配得到的索引&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lastIndexOf()&lt;/code&gt;: 从右到左, 子串第一次匹配得到的索引&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;search()&lt;/code&gt;: 正则搜索子串得到的索引&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  匹配替换字符串
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;match()&lt;/code&gt;: 匹配正则的结果&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;matchAll()&lt;/code&gt;: 匹配所有正则的结果&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;replace()&lt;/code&gt;: 替换第一个匹配的子串&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;replaceAll()&lt;/code&gt; 替换所有匹配的子串&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  填充字符串
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;padStart()&lt;/code&gt;: 左侧填充指定字符达到指定长度&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;padEnd()&lt;/code&gt;: 右侧填充指定字符达到指定长度&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;repeat()&lt;/code&gt;: 重复指定次数字符串&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;concat()&lt;/code&gt; 合并字符串&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  字符串操作
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;slice()&lt;/code&gt;: 切片字符串, 支持负数参数&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;substring()&lt;/code&gt;: 切片字符串,不支持负数参数&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;split()&lt;/code&gt;: 分隔成数组&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  清除空格
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;trim()&lt;/code&gt;: 清除两端空格&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;trimStart()&lt;/code&gt;: 清除开头空格&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;trimEnd()&lt;/code&gt;: 清除末尾空格&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  序列化
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;normalize()&lt;/code&gt;: 以 &lt;code&gt;Unicode&lt;/code&gt; 形式序列化字符串&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>JavaScript —— Number</title>
      <dc:creator>Roger Lin</dc:creator>
      <pubDate>Thu, 23 Feb 2023 07:50:39 +0000</pubDate>
      <link>https://forem.com/itroger/javascript-number-1bli</link>
      <guid>https://forem.com/itroger/javascript-number-1bli</guid>
      <description>&lt;h2&gt;
  
  
  静态属性
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Number.MAX_VALUE&lt;/code&gt;: 最大值&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number.MIN_VALUE&lt;/code&gt;: 最小值&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number.MAX_SAFE_INTEGER&lt;/code&gt;: 最大安全整数&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number.MIN_SAFE_INTEGER&lt;/code&gt;: 最小安全整数&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number.POSITIVE_INFINITY&lt;/code&gt;: 正无穷&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number.NEGATIVE_INFINITY&lt;/code&gt;: 负无穷&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number.EPSILON&lt;/code&gt;: 最小间隔&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number.NaN&lt;/code&gt;: 非数字&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  静态方法
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Number.parseFloat()&lt;/code&gt;: 字符串转化成浮点数&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number.parseInt()&lt;/code&gt;: 字符串转化成整数&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number.isInteger()&lt;/code&gt;: 是否整数&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number.isSafeInteger()&lt;/code&gt;: 是否安全整数&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number.isFinite()&lt;/code&gt;: 是否有穷数&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Number.isNaN()&lt;/code&gt;: 是否非数字&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  实例方法
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;toFixed()&lt;/code&gt;: 保留几位小数表示&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;toPrecision()&lt;/code&gt;: 保留有效位数表示&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;toExponential()&lt;/code&gt;: 指数表示&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>JavaScript —— Foundations</title>
      <dc:creator>Roger Lin</dc:creator>
      <pubDate>Thu, 23 Feb 2023 07:34:25 +0000</pubDate>
      <link>https://forem.com/itroger/javascript-ji-chu-1180</link>
      <guid>https://forem.com/itroger/javascript-ji-chu-1180</guid>
      <description>&lt;h2&gt;
  
  
  声明
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;let&lt;/code&gt;: 声明块级作用域变量&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;const&lt;/code&gt;: 声明块级作用域常量&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;var&lt;/code&gt;: 声明函数级作用变量（不推荐使用）&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;都存在变量提升，但 &lt;code&gt;let&lt;/code&gt; 和 &lt;code&gt;const&lt;/code&gt; 不会被赋予初始值, 在声明前使用将抛出引用错误(&lt;code&gt;ReferenceError&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  数据类型
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;null&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;undefined&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;number&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bigint&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;string&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;symbol&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;object&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;基本数据类型判断使用 &lt;code&gt;typeof&lt;/code&gt; : &lt;code&gt;boolean&lt;/code&gt;, &lt;code&gt;undefined&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;object&lt;/code&gt;, &lt;code&gt;function&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;引用类型判断使用 &lt;code&gt;instanceof&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;属性判断使用 &lt;code&gt;in&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  流程控制
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;if...else if...else&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;switch...case...default&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;throw&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;try...catch...finally&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  循环与迭代
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;for&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;do...while&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;while&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;continue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;break&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;for...in&lt;/code&gt;: 遍历 &lt;code&gt;key&lt;/code&gt;, 数组慎用&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;for...of&lt;/code&gt;: 遍历 &lt;code&gt;value&lt;/code&gt;, 对象不可用&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;for await...of&lt;/code&gt;: 遍历异步迭代&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  模块
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;导出原则: 导出不可变数据, 例如 const, function, class.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;导出: &lt;code&gt;export const name = 'itroger'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;默认导出 &lt;code&gt;export default function func() {}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;导出重命名: &lt;code&gt;export { func as func1 }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;导入: &lt;code&gt;import { name } from '...'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;导入默认的导出: &lt;code&gt;import func from '...'&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;导入重命名: &lt;code&gt;import { func as func1 } from '...'&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  新运算符
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;nullish 表示值为 null 或 undefined.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;?.&lt;/code&gt;: 可选链运算符, 在引用为 nullish 时短路返回&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;??&lt;/code&gt;: 空值合并表运算符, 左侧为 nullish 时返回右侧&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;??=&lt;/code&gt;: 逻辑空赋值, 左侧为 nullish 时赋值&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;...&lt;/code&gt;: 展开运算符, 直接获取元素&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
    </item>
  </channel>
</rss>
