[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-3203":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":17,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":23,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":38,"readmeContent":39,"aiSummary":40,"trendingCount":16,"starSnapshotCount":16,"syncStatus":17,"lastSyncTime":41,"discoverSource":42},3203,"You-Dont-Need-Lodash-Underscore","you-dont-need\u002FYou-Dont-Need-Lodash-Underscore","you-dont-need","List of JavaScript methods which you can use natively + ESLint Plugin","",null,"JavaScript",19159,820,194,49,0,2,7,43.74,"MIT License",false,"master",true,[25,26,27,28,29,30,31,32,33,34,35,36,37],"alternatives","eslint-plugin","findindex","hacktoberfest","isnan","javascript","javascript-methods","lastindexof","lodash","native","reduceright","underscore","utilities","2026-06-12 02:00:47","# [You don't (may not) need Lodash\u002FUnderscore](https:\u002F\u002Fyou-dont-need.github.io\u002FYou-Dont-Need-Lodash-Underscore\u002F#\u002F)\n\n[![Join the community on Spectrum](https:\u002F\u002Fwithspectrum.github.io\u002Fbadge\u002Fbadge.svg)](https:\u002F\u002Fspectrum.chat\u002Fyou-dont-need\u002Flodash-underscore)\n[![Gitter](https:\u002F\u002Fbadges.gitter.im\u002FJoin%20Chat.svg)](https:\u002F\u002Fgitter.im\u002Fcht8687\u002FYou-Dont-Need-Lodash-Underscore)\n\nLodash and Underscore are great modern JavaScript utility libraries, and they are widely used by Front-end developers. However, when you are targeting modern browsers, you may find out that there are many methods which are already supported natively thanks to ECMAScript5 [ES5] and ECMAScript2015 [ES6]. If you want your project to require fewer dependencies, and you know your target browser clearly, then you may not need Lodash\u002FUnderscore.\n\nYou are welcome to contribute with more items provided below.\n\n* If you are targeting legacy JavaScript engine with those ES5 methods, you can use [es5-shim](https:\u002F\u002Fgithub.com\u002Fes-shims\u002Fes5-shim)\n\n* Please note that, the examples used below are just showing you the native alternative of performing certain tasks. For some functions, Lodash provides you more options than native built-ins. This list is not a 1:1 comparison.\n\n* Please send a PR if you want to add or modify the code. No need to open an issue unless it's something big and you want to discuss.\n\n\n## Voice of Developers\n\n> [Make use of native JavaScript object and array utilities before going big.](https:\u002F\u002Ftwitter.com\u002Fcodylindley\u002Fstatus\u002F692356631007342593)\n\n> &mdash;\u003Ccite>Cody Lindley, Author of [jQuery Cookbook](http:\u002F\u002Fshop.oreilly.com\u002Fproduct\u002F9780596159788.do) and [JavaScript Enlightenment](http:\u002F\u002Fshop.oreilly.com\u002Fproduct\u002F0636920027713.do)\u003C\u002Fcite>\n\n\u003C!-- -->\n> [You probably don't need Lodash. Nice List of JavaScript methods which you can use natively.](https:\u002F\u002Ftwitter.com\u002Fdaniellmb\u002Fstatus\u002F692200768556916740)\n\n> &mdash;\u003Ccite>Daniel Lamb, Computer Scientist, Technical Reviewer of [Secrets of the JavaScript Ninja](https:\u002F\u002Fwww.manning.com\u002Fbooks\u002Fsecrets-of-the-javascript-ninja-second-edition) and [Functional Programming in JavaScript](https:\u002F\u002Fwww.manning.com\u002Fbooks\u002Ffunctional-programming-in-javascript)\u003C\u002Fcite>\n\n\u003C!-- -->\n> [I guess not, but I want it.](https:\u002F\u002Ftwitter.com\u002Fteropa\u002Fstatus\u002F692280179666898944)\n\n> &mdash;\u003Ccite>Tero Parviainen, Author of [build-your-own-angular](http:\u002F\u002Fteropa.info\u002Fbuild-your-own-angular)\u003C\u002Fcite>\n\n\u003C!-- -->\n> [I'll admit, I've been guilty of overusing #lodash. Excellent resource.](https:\u002F\u002Ftwitter.com\u002Ftherebelrobot\u002Fstatus\u002F692907269512642561)\n\n> &mdash;\u003Ccite>@therebelrobot, Maker of web things, Facilitator for Node.js\u002Fio.js\u003C\u002Fcite>\n\n\n## ESLint Plugin\n\n\u003Cdiv align=\"center\">\n\n[![NPM Version](https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002Feslint-plugin-you-dont-need-lodash-underscore.svg?style=flat-square)](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Feslint-plugin-you-dont-need-lodash-underscore)\n[![Downloads](http:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdm\u002Feslint-plugin-you-dont-need-lodash-underscore.svg?style=flat-square)](https:\u002F\u002Fwww.npmjs.org\u002Fpackage\u002Feslint-plugin-you-dont-need-lodash-underscore)\n[![Build Status](https:\u002F\u002Fimg.shields.io\u002Ftravis\u002Fyou-dont-need\u002FYou-Dont-Need-Lodash-Underscore\u002Fmaster.svg?style=flat-square)](https:\u002F\u002Ftravis-ci.org\u002Fyou-dont-need\u002FYou-Dont-Need-Lodash-Underscore)\n[![Coverage Status](https:\u002F\u002Fimg.shields.io\u002Fcoveralls\u002Fyou-dont-need\u002FYou-Dont-Need-Lodash-Underscore\u002Fmaster.svg?style=flat-square)](https:\u002F\u002Fcoveralls.io\u002Fgithub\u002Fyou-dont-need\u002FYou-Dont-Need-Lodash-Underscore?branch=master)\n\n\u003C\u002Fdiv>\n\nIf you're using [ESLint](http:\u002F\u002Feslint.org\u002F), you can install a\n[plugin](http:\u002F\u002Feslint.org\u002Fdocs\u002Fuser-guide\u002Fconfiguring#using-the-configuration-from-a-plugin) that\nwill help you identify places in your codebase where you don't (may not) need Lodash\u002FUnderscore.\n\nInstall the plugin ...\n\n```sh\nnpm install --save-dev eslint-plugin-you-dont-need-lodash-underscore\n```\n\n... then update your config\n\n```json\n\"extends\" : [\"plugin:you-dont-need-lodash-underscore\u002Fcompatible\"],\n```\n\nFor more information, see [Configuring the ESLint Plugin](configuring.md)\n\n> [!IMPORTANT]\n> Note that, while many Lodash methods are null safe (e.g. _.keys, _.entries),\n> this is not necessarily the case for their Native equivalent. If null safety is critical for your application, we\n> suggest that you take extra precautions [e.g. consider using the native `Object.keys` as `Object.keys(value || {})`].\n\n## Quick Links\n\n**[Array](#array)**\n\n1. [_.chunk](#_chunk)\n1. [_.compact](#_compact)\n1. [_.concat](#_concat)\n1. [_.difference](#_difference)\n1. [_.drop](#_drop)\n1. [_.dropRight](#_dropRight)\n1. [_.fill](#_fill)\n1. [_.find](#_find)\n1. [_.findIndex](#_findindex)\n1. [_.first](#_first)\n1. [_.flatten](#_flatten)\n1. [_.flattenDeep](#_flattendeep)\n1. [_.fromPairs](#_frompairs)\n1. [_.head and _.tail](#_head-and-_tail)\n1. [_.indexOf](#_indexof)\n1. [_.intersection](#_intersection)\n1. [_.isArray](#_isarray)\n1. [_.isArrayBuffer](#_isarraybuffer)\n1. [_.join](#_join)\n1. [_.last](#_last)\n1. [_.lastIndexOf](#_lastindexof)\n1. [_.reverse](#_reverse)\n1. [_.slice](#_slice)\n1. [_.without](#_without)\n1. [_.initial](#_initial)\n1. [_.pull](#_pull)\n1. [_.unionBy](#_unionBy)\n\n**[Collection*](#collection)**\n\n> [!IMPORTANT]\n> Note that most native equivalents are array methods,\n> and will not work with objects. If this functionality is needed and no object method is provided,\n> then Lodash\u002FUnderscore might be the better option. Bear in mind however, that all iterable\n> objects can easily be converted to an array by use of the\n> [spread operator](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FOperators\u002FSpread_syntax).\n\n1. [_.each](#_each)\n1. [_.every](#_every)\n1. [_.filter](#_filter)\n1. [_.groupBy](#_groupby)\n1. [_.includes](#_includes)\n1. [_.keyBy](#_keyBy)\n1. [_.map](#_map)\n1. [_.minBy and _.maxBy](#_minby-and-_maxby)\n1. [_.orderBy](#_sortby-and-_orderby)\n1. [_.pluck](#_pluck)\n1. [_.range](#_range)\n1. [_.reduce](#_reduce)\n1. [_.reduceRight](#_reduceright)\n1. [_.reject](#_reject)\n1. [_.size](#_size)\n1. [_.some](#_some)\n1. [_.sortBy](#_sortby-and-_orderby)\n1. [_.uniq](#_uniq)\n1. [_.uniqWith](#_uniqWith)\n\n**[Function](#function)**\n\n1. [_.after](#_after)\n1. [_.bind](#_bind)\n1. [_.debounce](#_debounce)\n1. [_.isFunction](#_isFunction)\n1. [_.partial](#_partial)\n1. [_.throttle](#_throttle)\n\n**[Lang](#lang)**\n\n1. [_.castArray](#_castarray)\n1. [.cloneDeep](#_clonedeep)\n1. [_.gt](#_gt)\n1. [_.gte](#_gte)\n1. [_.isDate](#_isdate)\n1. [_.isEmpty](#_isempty)\n1. [_.isFinite](#_isfinite)\n1. [_.isInteger](#_isInteger)\n1. [_.isNaN](#_isnan)\n1. [_.isNil](#_isnil)\n1. [_.isNull](#_isnull)\n1. [_.isUndefined](#_isundefined)\n\n**[Object](#object)**\n\n1. [_.assign](#_assign)\n1. [_.defaults](#_defaults)\n1. [_.extend](#_extend)\n1. [_.has](#_has)\n1. [_.get](#_get)\n1. [_.invert](#_invert)\n1. [_.isPlainObject](#_isplainobject)\n1. [_.keys](#_keys)\n1. [_.mapKeys](#_mapKeys)\n1. [_.omit](#_omit)\n1. [_.pick](#_pick)\n1. [_.pickBy](#_pickby)\n1. [_.toPairs](#_topairs)\n1. [_.values](#_values)\n\n**[String](#string)**\n\n1. [_.capitalize](#_capitalize)\n1. [_.endsWith](#_endsWith)\n1. [_.isString](#_isString)\n1. [_.lowerFirst](#_lowerFirst)\n1. [_.padStart and _.padEnd](#_padstart-and-_padend)\n1. [_.repeat](#_repeat)\n1. [_.replace](#_replace)\n1. [_.split](#_split)\n1. [_.startsWith](#_startsWith)\n1. [_.template](#_template)\n1. [_.toLower](#_tolower)\n1. [_.toUpper](#_toupper)\n1. [_.trim](#_trim)\n1. [_.upperFirst](#_upperFirst)\n\n**[Util](#util)**\n\n1. [_.times](#_times)\n\n**[Number](#number)**\n\n1. [_.clamp](#_clamp)\n2. [_.inRange](#_inRange)\n3. [_.random](#_random)\n\n## Array\n\n### _.chunk\n\nCreates an array of elements split into groups the length of size.\n```js\n\u002F\u002F Underscore\u002FLodash\n_.chunk(['a', 'b', 'c', 'd'], 2);\n\u002F\u002F => [['a', 'b'], ['c', 'd']]\n\n_.chunk(['a', 'b', 'c', 'd'], 3);\n\u002F\u002F => [['a', 'b', 'c'], ['d']]\n\n\n\u002F\u002F Native\n\nconst chunk = (input, size) => {\n  return input.reduce((arr, item, idx) => {\n    return idx % size === 0\n      ? [...arr, [item]]\n      : [...arr.slice(0, -1), [...arr.slice(-1)[0], item]];\n  }, []);\n};\n\nchunk(['a', 'b', 'c', 'd'], 2);\n\u002F\u002F => [['a', 'b'], ['c', 'd']]\n\nchunk(['a', 'b', 'c', 'd'], 3);\n\u002F\u002F => [['a', 'b', 'c'], ['d']]\n```\n\n#### Browser Support for Spread in array literals\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n   46.0 ✔  | 12.0 ✔ | 16.0 ✔ |  ✖ |  37.0 ✔ |  8.0 ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.compact\n\nCreates an array with all falsy values removed.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  _.compact([0, 1, false, 2, '', 3]);\n  \u002F\u002F output: [1, 2, 3]\n\n  \u002F\u002F Native\n  [0, 1, false, 2, '', 3].filter(Boolean)\n  \u002F\u002F output: [1, 2, 3]\n  ```\n\n#### Browser Support for `array.prototype.filter`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n   ✔  |  ✔ |  1.5 ✔ |  9.0 ✔ |  ✔ |  ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.concat\n\nCreates a new array concatenating array with any additional arrays and\u002For values.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var array = [1]\n  var other = _.concat(array, 2, [3], [[4]])\n\n  console.log(other)\n  \u002F\u002F output: [1, 2, 3, [4]]\n\n  \u002F\u002F Native\n  var array = [1]\n  var other = array.concat(2, [3], [[4]])\n\n  console.log(other)\n  \u002F\u002F output: [1, 2, 3, [4]]\n  ```\n\n#### Browser Support for `Array.prototype.concat()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n1.0  ✔  | ✔  |  1.0 ✔ |  5.5 ✔  |  ✔  |  ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.difference\n\nSimilar to [without](#_without), but returns the values from array that are not present in the other arrays.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  console.log(_.difference([1, 2, 3, 4, 5], [5, 2, 10]))\n  \u002F\u002F output: [1, 3, 4]\n\n  \u002F\u002F Native\n  var arrays = [[1, 2, 3, 4, 5], [5, 2, 10]];\n  console.log(arrays.reduce(function(a, b) {\n    return a.filter(function(value) {\n      return !b.includes(value);\n    });\n  }));\n  \u002F\u002F output: [1, 3, 4]\n\n  \u002F\u002F ES6\n  let arrays = [[1, 2, 3, 4, 5], [5, 2, 10]];\n  console.log(arrays.reduce((a, b) => a.filter(c => !b.includes(c))));\n  \u002F\u002F output: [1, 3, 4]\n  ```\n\n#### Browser Support for `Array.prototype.reduce()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n   ✔  |  ✔ | 3.0 ✔ |  9.0 ✔  |  10.5 ✔ |  4.0 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.drop\n\nCreates a slice of array with n elements dropped from the beginning.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  _.drop([1, 2, 3]);\n  \u002F\u002F => [2, 3]\n\n  _.drop([1, 2, 3], 2);\n  \u002F\u002F => [3]\n\n  \u002F\u002F Native\n  [1, 2, 3].slice(1);\n  \u002F\u002F => [2, 3]\n\n  [1, 2, 3].slice(2);\n  \u002F\u002F => [3]\n  ```\n\n#### Browser Support for `Array.prototype.slice()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  1.0 ✔  |  ✔  |  1.0 ✔  |  ✔  |  ✔  | ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.dropRight\n\nCreates a slice of array with n elements dropped at the end.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  _.dropRight([1, 2, 3]);\n  \u002F\u002F => [1, 2]\n\n  _.dropRight([1, 2, 3], 2);\n  \u002F\u002F => [1]\n\n  \u002F\u002F Native\n  [1, 2, 3].slice(0, -1);\n  \u002F\u002F => [1, 2]\n\n  [1, 2, 3].slice(0, -2);\n  \u002F\u002F => [1]\n  ```\n\n#### Browser Support for `Array.prototype.slice()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  1.0 ✔  |  ✔  |  1.0 ✔  |  ✔  |  ✔  | ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.fill\n\nFills elements of array with value from start up to, but not including, end.\n\n> [!NOTE]\n> `fill` is a mutable method in both native and Lodash\u002FUnderscore.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var array = [1, 2, 3]\n\n  _.fill(array, 'a')\n\n  console.log(array)\n  \u002F\u002F output: ['a', 'a', 'a']\n\n  _.fill(Array(3), 2)\n  \u002F\u002F output: [2, 2, 2]\n\n  _.fill([4, 6, 8, 10], '*', 1, 3)\n  \u002F\u002F output: [4, '*', '*', 10]\n\n  \u002F\u002F Native\n  var array = [1, 2, 3]\n\n  array.fill('a')\n\n  console.log(array)\n  \u002F\u002F output: ['a', 'a', 'a']\n\n  Array(3).fill(2)\n  \u002F\u002F output: [2, 2, 2]\n\n  [4, 6, 8, 10].fill('*', 1, 3)\n  \u002F\u002F output: [4, '*', '*', 10]\n  ```\n\n#### Browser Support for `Array.prototype.fill()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  45.0 ✔ | ✔  | 31.0 ✔ |  ✖  |  32.0 ✔ |  8 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.find\n\nReturns the value of the first element in the array that satisfies the provided testing function. Otherwise undefined is returned.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var users = [\n    { 'user': 'barney',  'age': 36, 'active': true },\n    { 'user': 'fred',    'age': 40, 'active': false },\n    { 'user': 'pebbles', 'age': 1,  'active': true }\n  ]\n\n  _.find(users, function (o) { return o.age \u003C 40; })\n  \u002F\u002F output: object for 'barney'\n\n  \u002F\u002F Native\n  var users = [\n    { 'user': 'barney',  'age': 36, 'active': true },\n    { 'user': 'fred',    'age': 40, 'active': false },\n    { 'user': 'pebbles', 'age': 1,  'active': true }\n  ]\n\n  users.find(function (o) { return o.age \u003C 40; })\n  \u002F\u002F output: object for 'barney'\n  ```\n\n#### Browser Support for `Array.prototype.find()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  45.0 ✔ | ✔ | 25.0 ✔ |  ✖  |  32.0 ✔ |  7.1 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.findIndex\n\nReturns the index of the first element in the array that satisfies the provided testing function. Otherwise -1 is returned.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var users = [\n    { 'user': 'barney',  'age': 36, 'active': true },\n    { 'user': 'fred',    'age': 40, 'active': false },\n    { 'user': 'pebbles', 'age': 1,  'active': true }\n  ]\n\n  var index = _.findIndex(users, function (o) { return o.age >= 40; })\n  console.log(index)\n  \u002F\u002F output: 1\n\n  \u002F\u002F Native\n  var users = [\n    { 'user': 'barney',  'age': 36, 'active': true },\n    { 'user': 'fred',    'age': 40, 'active': false },\n    { 'user': 'pebbles', 'age': 1,  'active': true }\n  ]\n\n  var index = users.findIndex(function (o) { return o.age >= 40; })\n  console.log(index)\n  \u002F\u002F output: 1\n  ```\n\n#### Browser Support for `Array.prototype.findIndex()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  45.0 ✔ | ✔ | 25.0 ✔ |  ✖  |  32.0 ✔ |  7.1 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.first\n\nReturns the first element of an array. Passing n will return the first n elements of the array.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  _.first([1, 2, 3, 4, 5]);\n  \u002F\u002F => 1\n\n  \u002F\u002F Underscore\n  _.first([1, 2, 3, 4, 5], 2);\n  \u002F\u002F => [1, 2]\n\n  \u002F\u002F Native\n  [1, 2, 3, 4, 5][0];\n  \u002F\u002F => 1\n  \u002F\u002For\n  [].concat(1, 2, 3, 4, 5).shift()\n  \u002F\u002F => 1\n  \u002F\u002For\n  [].concat([1, 2, 3, 4, 5]).shift()\n  \u002F\u002F => 1\n\n  \u002F\u002F Native (works even with potentially undefined\u002Fnull, like _.first)\n  [].concat(undefined).shift()\n  \u002F\u002F => undefined\n\n  [1, 2, 3, 4, 5].slice(0, 2);\n  \u002F\u002F => [1, 2]\n\n  \u002F\u002F Native with ES13\n  [1, 2, 3, 4, 5].at(0)\n  \u002F\u002F => 1\n  \u002F\u002For\n  [].at(0)\n  \u002F\u002F => undefined\n  ```\n\n#### Browser Support for `Array.prototype.slice()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  1.0 ✔  |  ✔  |  1.0 ✔  |  ✔  |  ✔  | ✔  |\n\n#### Browser Support for `Array.prototype.at()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  92 ✔  |  92 ✔  | 90 ✔  | ✖  | 78 ✔  | 15.4 ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.flatten\n\nFlattens array a single level deep.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  _.flatten([1, [2, [3, [4]], 5]]);\n  \u002F\u002F => [1, 2, [3, [4]], 5]\n\n  \u002F\u002F Native\n  const flatten = [1, [2, [3, [4]], 5]].reduce( (a, b) => a.concat(b), [])\n  \u002F\u002F => [1, 2, [3, [4]], 5]\n\n  const flatten = [].concat(...[1, [2, [3, [4]], 5]])\n  \u002F\u002F => [1, 2, [3, [4]], 5]\n\n  \u002F\u002F Native(ES2019)\n  const flatten = [1, [2, [3, [4]], 5]].flat()\n  \u002F\u002F => [1, 2, [3, [4]], 5]\n\n  const flatten = [1, [2, [3, [4]], 5]].flatMap(number => number)\n  \u002F\u002F => [1, 2, [3, [4]], 5]\n  ```\n\n#### Browser Support for `Array.prototype.reduce()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: |  :-: |\n  46.0 ✔ |  ✔ | 3.0 ✔ |  9.0 ✔  |  10.5 ✔ |  4 ✔ |\n\n#### Browser Support for `Array.prototype.flat()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image] |\n:-: | :-: | :-: | :-: | :-: | :-: |\n69 ✔ | 79 ✔ | 62 ✔ | ✖ | 56 ✔ | 12 ✔ |\n\n#### Browser Support for `Array.prototype.flatMap()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image] |\n:-: | :-: | :-: | :-: | :-: | :-: |\n69 ✔ | 79 ✔ | 62 ✔ | ✖ | 56 ✔ | 12 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.flattenDeep\n\nRecursively flattens array.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  _.flattenDeep([1, [2, [3, [4]], 5]]);\n  \u002F\u002F => [1, 2, 3, 4, 5]\n\n  \u002F\u002F Native\n  const flattenDeep = (arr) => Array.isArray(arr)\n    ? arr.reduce( (a, b) => a.concat(flattenDeep(b)) , [])\n    : [arr]\n\n  flattenDeep([1, [[2], [3, [4]], 5]])\n  \u002F\u002F => [1, 2, 3, 4, 5]\n\n  \u002F\u002F Native(ES2019)\n  [1, [2, [3, [4]], 5]].flat(Infinity)\n  \u002F\u002F => [1, 2, 3, 4, 5]\n\n  const flattenDeep = (arr) => arr.flatMap((subArray, index) => Array.isArray(subArray) ? flattenDeep(subArray) : subArray)\n\n  flattenDeep([1, [[2], [3, [4]], 5]])\n  \u002F\u002F => [1, 2, 3, 4, 5]\n  ```\n\n#### Browser Support\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  46.0 ✔ |  ✔ | 16.0 ✔ |  ✖  |  37.0 ✔ |  7.1 ✔ |\n\n\n#### Browser Support for `Array.prototype.flat()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image] |\n:-: | :-: | :-: | :-: | :-: | :-: |\n69 ✔ | 79 ✔ | 62 ✔ | ✖ | 56 ✔ | 12 ✔ |\n\n\n#### Browser Support for `Array.prototype.flatMap()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image] |\n:-: | :-: | :-: | :-: | :-: | :-: |\n69 ✔ | 79 ✔ | 62 ✔ | ✖ | 56 ✔ | 12 ✔ |\n\n\n**[⬆ back to top](#quick-links)**\n\n### _.fromPairs\n\nReturns an object composed from key-value pairs.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  _.fromPairs([['a', 1], ['b', 2]]);\n  \u002F\u002F => { 'a': 1, 'b': 2 }\n\n  \u002F\u002F Native\n  const fromPairs = function(arr) {\n    return arr.reduce(function(accumulator, value) {\n      accumulator[value[0]] = value[1];\n      return accumulator;\n    }, {})\n  }\n\n  \u002F\u002F Compact form\n  const fromPairs = (arr) => arr.reduce((acc, val) => (acc[val[0]] = val[1], acc), {})\n\n  fromPairs([['a', 1], ['b', 2]]);\n  \u002F\u002F => { 'a': 1, 'b': 2 }\n\n  \u002F\u002F Native(ES2019)\n  Object.fromEntries([['a', 1], ['b', 2]])\n  \u002F\u002F => { 'a': 1, 'b': 2 }\n  ```\n\n#### Browser Support for `Array.prototype.reduce()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  |  ✔ | 3.0 ✔ |  9.0 ✔  |  10.5 ✔ |  4.0 ✔ |\n\n#### Browser Support for `Object.fromEntries()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  73.0 ✔  | 79.0 ✔ | 63.0 ✔ |  ✖  |  60 ✔ |  12.1 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.head and _.tail\n\nGets the first element or all but the first element.\n\n  ```js\n  const array = [1, 2, 3]\n\n  \u002F\u002F Underscore: _.first, _.head, _.take\n  \u002F\u002F Lodash: _.first, _.head\n  _.head(array)\n  \u002F\u002F output: 1\n\n  \u002F\u002F Underscore: _.rest, _.tail, _.drop\n  \u002F\u002F Lodash: _.tail\n  _.tail(array)\n  \u002F\u002F output: [2, 3]\n\n\n  \u002F\u002F Native\n  const [ head, ...tail ] = array\n  console.log(head)\n  \u002F\u002F output: 1\n  console.log(tail)\n  \u002F\u002F output [2, 3]\n\n  \u002F\u002F Native replacement for _.head in ES13\n  array.at(0)\n  \u002F\u002F output: 1\n  ```\n\n#### Browser Support for Spread in array literals\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  46.0 ✔  | 12.0 ✔ |  16.0 ✔ |  ✖ |  37.0 ✔ | 8.0 ✔  |\n\n#### Browser Support for `Array.prototype.at()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  92 ✔  |  92 ✔  | 90 ✔  | ✖  | 78 ✔  | 15.4 ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.indexOf\n\nReturns the first index at which a given element can be found in the array, or -1 if it is not present.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var array = [2, 9, 9]\n  var result = _.indexOf(array, 2)\n  console.log(result)\n  \u002F\u002F output: 0\n\n  \u002F\u002F Native\n  var array = [2, 9, 9]\n  var result = array.indexOf(2)\n  console.log(result)\n  \u002F\u002F output: 0\n  ```\n\n#### Browser Support for `Array.prototype.indexOf()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔  |  1.5 ✔ |  9.0 ✔  |  ✔  |  ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.intersection\n\nReturns an array that is the intersection of all the arrays. Each value in the result is present in each of the arrays.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  console.log(_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]))\n  \u002F\u002F output: [1, 2]\n\n  \u002F\u002F Native\n  var arrays = [[1, 2, 3], [101, 2, 1, 10], [2, 1]];\n  console.log(arrays.reduce(function(a, b) {\n    return a.filter(function(value) {\n      return b.includes(value);\n    });\n  }));\n  \u002F\u002F output: [1, 2]\n\n  \u002F\u002F ES6\n  let arrays = [[1, 2, 3], [101, 2, 1, 10], [2, 1]];\n  console.log(arrays.reduce((a, b) => a.filter(c => b.includes(c))));\n  \u002F\u002F output: [1, 2]\n  ```\n\n#### Browser Support for `Array.prototype.reduce()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  |  ✔ | 3.0 ✔ |  9.0 ✔  |  10.5 ✔ |  4.0 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.takeRight\n\nCreates a slice of array with n elements taken from the end.\n\n> [!IMPORTANT]\n> Native slice does not behave entirely the same as the `Lodash` method. See example below to understand why.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  _.takeRight([1, 2, 3]);\n  \u002F\u002F => [3]\n\n  _.takeRight([1, 2, 3], 2);\n  \u002F\u002F => [2, 3]\n\n  _.takeRight([1, 2, 3], 5);\n  \u002F\u002F => [1, 2, 3]\n\n  \u002F\u002F Native\n  [1, 2, 3].slice(-1);\n  \u002F\u002F => [3]\n\n  [1, 2, 3].slice(-2);\n  \u002F\u002F => [2, 3]\n\n  [1, 2, 3].slice(-5);\n  \u002F\u002F => [1, 2, 3]\n\n  \u002F\u002F Difference in compatibility\n\n  \u002F\u002F Lodash\n  _.takeRight([1, 2, 3], 0);\n  \u002F\u002F => []\n\n  \u002F\u002F Native\n  [1, 2, 3].slice(0);\n  \u002F\u002F => [1, 2, 3]\n  ```\n\n#### Browser Support for `Array.prototype.slice()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  1.0 ✔  |  ✔  |  1.0 ✔  |  ✔  |  ✔  | ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.isArray\n\nReturns true if given value is an array.\n\n  ```js\n  \u002F\u002F Lodash\n  var array = []\n  console.log(_.isArray(array))\n  \u002F\u002F output: true\n\n  \u002F\u002F Native\n  var array = []\n  console.log(Array.isArray(array));\n  \u002F\u002F output: true\n  ```\n\n#### Browser Support for `Array.isArray()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  5.0 ✔  |  ✔  | 4.0 ✔  |  9.0 ✔  |  10.5 ✔  | 5.0 ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.isArrayBuffer\n\nChecks if value is classified as an ArrayBuffer object.\n\n  ```js\n  \u002F\u002F Lodash\n  _.isArrayBuffer(new ArrayBuffer(2));\n  \u002F\u002F output: true\n\n  \u002F\u002F Native\n  console.log(new ArrayBuffer(2) instanceof ArrayBuffer);\n  \u002F\u002F output: true\n  ```\n\n> [!WARNING]\n> You will get the wrong result if you get `ArrayBuffer` from another realm.\n> [See details](https:\u002F\u002Fdeveloper.mozilla.org\u002Fen-US\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FOperators\u002Finstanceof#instanceof_and_multiple_context_e.g._frames_or_windows).\n\n#### Browser Support for `instanceof`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  |  ✔  | 1.0 ✔  | ✔  | ✔  | ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.join\n\n> [!IMPORTANT]\n> Not in Underscore.js\n\nJoins a list of elements in an array with a given separator.\n\n  ```js\n  \u002F\u002F Lodash\n  var result = _.join(['one', 'two', 'three'], '--')\n  console.log(result)\n  \u002F\u002F output: 'one--two--three'\n\n  \u002F\u002F Native\n  var result = ['one', 'two', 'three'].join('--')\n  console.log(result)\n  \u002F\u002F output: 'one--two--three'\n  ```\n\n#### Browser Support for `Array.prototype.join()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  1.0 ✔  |   ✔  | 1.0 ✔ |  5.5 ✔  |  ✔ |  ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.last\n\nReturns the last element of an array. Passing n will return the last n elements of the array.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  const numbers = [1, 2, 3, 4, 5];\n  _.last(numbers);\n  \u002F\u002F => 5\n\n  \u002F\u002F Underscore\n  _.last(numbers, 2);\n  \u002F\u002F => [4, 5]\n\n  \u002F\u002F Native\n  const numbers = [1, 2, 3, 4, 5];\n  numbers[numbers.length - 1];\n  \u002F\u002F => 5\n  \u002F\u002For\n  numbers.slice(-1)[0];\n  \u002F\u002F => 5\n  \u002F\u002For\n  [].concat(numbers).pop()\n  \u002F\u002F => 5\n  \u002F\u002For\n  numbers.at(-1);\n  \u002F\u002F => 5\n\n  \u002F\u002F Native (works even with potentially undefined\u002Fnull)\n  [].concat(undefined).pop()\n  \u002F\u002F => undefined\n\n  numbers.slice(-2);\n  \u002F\u002F => [4, 5]\n  ```\n\n#### Browser Support for `Array.prototype.concat()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  1.0 ✔  |  ✔  | 1.0 ✔  | 5.5 ✔  |  ✔  | ✔  |\n\n#### Browser Support for `Array.prototype.at()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  92 ✔  |  92 ✔  | 90 ✔  | ✖  | 78 ✔  | 15.4 ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.lastIndexOf\n\nReturns the index of the last occurrence of value in the array, or -1 if value is not present.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var array = [2, 9, 9, 4, 3, 6]\n  var result = _.lastIndexOf(array, 9)\n  console.log(result)\n  \u002F\u002F output: 2\n\n  \u002F\u002F Native\n  var array = [2, 9, 9, 4, 3, 6]\n  var result = array.lastIndexOf(9)\n  console.log(result)\n  \u002F\u002F output: 2\n  ```\n\n#### Browser Support for `Array.prototype.lastIndexOf()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  |  ✔ | 1.5 ✔  | 9.0 ✔  |  ✔  |  ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.reverse\n\n> [!IMPORTANT]\n> Not in Underscore.js\n\nReverses array so that the first element becomes the last, the second element becomes the second to last, and so on.\n\n  ```js\n  \u002F\u002F Lodash\n  var array = [1, 2, 3]\n  console.log(_.reverse(array))\n  \u002F\u002F output: [3, 2, 1]\n\n  \u002F\u002F Native\n  var array = [1, 2, 3]\n  console.log(array.reverse())\n  \u002F\u002F output: [3, 2, 1]\n  ```\n\nVoice from the Lodash author:\n\n> Lodash's `_.reverse` just calls `Array#reverse` and enables composition like `_.map(arrays, _.reverse).`\n> It's exposed on _ because previously, like `Underscore`, it was only exposed in the chaining syntax.\n> --- [jdalton](https:\u002F\u002Fgithub.com\u002Fcht8687\u002FYou-Dont-Need-Lodash-Underscore\u002Fcommit\u002F22c4bcf2be48dd415d2b073759805562e520b615#)\n\n#### Browser Support for `Array.prototype.reverse()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | 1.5 ✔ |  9 ✔ |  ✔ |  ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.slice\n\nReturns a shallow copy of a portion of an array into a new array object selected from `begin` to `end` (`end` not included)\n\n  ```js\n  \u002F\u002F Lodash\n  var array = [1, 2, 3, 4]\n  console.log(_.slice(array, 1, 3))\n  \u002F\u002F output: [2, 3]\n\n  \u002F\u002F Native\n  var array = [1, 2, 3, 4]\n  console.log(array.slice(1, 3));\n  \u002F\u002F output: [2, 3]\n  ```\n\n#### Browser Support for `Array.prototype.slice()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  1.0 ✔  |  ✔  |  1.0 ✔  |  ✔  |  ✔  |  ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.without\n\n> [!IMPORTANT]\n> Not in Underscore.js\n\nReturns an array where matching items are filtered.\n\n  ```js\n  \u002F\u002F Lodash\n  var array = [1, 2, 3]\n  console.log(_.without(array, 2))\n  \u002F\u002F output: [1, 3]\n\n  \u002F\u002F Native\n  var array = [1, 2, 3]\n  console.log(array.filter(function(value) {\n    return value !== 2;\n  }));\n  \u002F\u002F output: [1, 3]\n  ```\n\n#### Browser Support for `Array.prototype.filter()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  1.0 ✔  | ✔ | 1.5 ✔ |  9 ✔ |  ✔ |  ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.initial\n\nReturns everything but the last entry of the array. Pass n to exclude the last n elements from the result.\n\n  ```js\n  \u002F\u002F Underscore\n  var array = [5, 4, 3, 2, 1]\n  console.log(_.initial(array, 2))\n  \u002F\u002F output: [5, 4, 3]\n\n  \u002F\u002F Native\n  var array = [5, 4, 3, 2, 1]\n  console.log(array.slice(0, -2));\n  \u002F\u002F output: [5, 4, 3]\n  ```\n\n#### Browser Support for `Array.prototype.slice()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  1.0 ✔  |  ✔  |  1.0 ✔  |  ✔  |  ✔  | ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.pull\n\nRemoves all provided values from the given array using strict equality for comparisons, i.e. ===.\n\n  ```js\n  \u002F\u002F Lodash\n  const array = [1, 2, 3, 1, 2, 3];\n  _.pull(array, 2, 3);\n  console.log(array); \u002F\u002F output: [1, 1]\n  ```\n\n  ```js\n  \u002F\u002F Native JS\n  const array = [1, 2, 3, 1, 2, 3];\n  function pull(arr, ...removeList){\n      var removeSet = new Set(removeList)\n      return arr.filter(function(el){\n          return !removeSet.has(el)\n      })\n  }\n  console.log(pull(array, 2, 3)); \u002F\u002F output: [1, 1]\n  console.log(array); \u002F\u002F still [1, 2, 3, 1, 2, 3]. This is not in place, unlike lodash!\n  ```\n\n  ```ts\n  \u002F\u002F TypeScript\n  const array = [1, 2, 3, 1, 2, 3];\n  const pull = \u003CT extends unknown>(sourceArray: T[], ...removeList: T[]): T[] => {\n    const removeSet = new Set(removeList);\n    return sourceArray.filter(el => !removeSet.has(el));\n  };\n  console.log(pull(array, 2, 3)); \u002F\u002F output: [1, 1]\n  console.log(array); \u002F\u002F still [1, 2, 3, 1, 2, 3]. This is not in place, unlike lodash!\n  ```\n\n#### Browser Support for `Array.prototype.filter()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  1.0 ✔  | ✔ | 1.5 ✔ |  9 ✔ |  ✔ |  ✔  |\n\n#### Browser Support for `Set.prototype.has()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image] |\n:-: | :-: | :-: | :-: | :-: | :-: |\n38 ✔ | 12 ✔ | 13 ✔ | 11 ✔ | 25 ✔ | 8 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.unionBy\n\nCreates an array of unique values, taking an `iteratee` to compute uniqueness with\n(note that to iterate by a key in an object you must use `x => x.key` instead of `key` for the `iteratee`)\n\n  ```js\n  \u002F\u002F Lodash\n  var array1 = [2.1];\n  var array2 = [1.2, 2.3];\n  var result = _.unionBy(array1, array2, Math.floor)\n  console.log(result)\n  \u002F\u002F output: [2.1, 1.2]\n\n  \u002F\u002F Native\n  var array1 = [2.1];\n  var array2 = [1.2, 2.3];\n  function unionBy(...arrays) {\n      const iteratee = (arrays).pop();\n\n      if (Array.isArray(iteratee)) {\n          return []; \u002F\u002F return empty if iteratee is missing\n      }\n\n      return [...arrays].flat().filter(\n          (set => (o) => set.has(iteratee(o)) ? false : set.add(iteratee(o)))(new Set()),\n      );\n  };\n  console.log(unionBy(array1, array2, Math.floor))\n  \u002F\u002F output: [2.1, 1.2]\n  ```\n\n#### Browser Support for `Array.prototype.flat()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image] |\n:-: | :-: | :-: | :-: | :-: | :-: |\n69 ✔ | 79 ✔ | 62 ✔ | ✖ | 56 ✔ | 12 ✔ |\n\n#### Browser Support for `Array.isArray()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n5.0 ✔  |  ✔  | 4.0 ✔  |  9.0 ✔  |  10.5 ✔  | 5.0 ✔  |\n\n#### Browser Support for `Set.prototype.has()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image] |\n:-: | :-: | :-: | :-: | :-: | :-: |\n38 ✔ | 12 ✔ | 13 ✔ | 11 ✔ | 25 ✔ | 8 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n## Collection*\n\n> [!IMPORTANT]\n> Most native equivalents are array methods,\n> and will not work with objects. If this functionality is needed and no object method is provided,\n> then Lodash\u002FUnderscore is the better option.\n\n### _.each\n\nIterates over a list of elements, yielding each in turn to an iteratee function.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  \u002F\u002FFor arrays\n  _.each([1, 2, 3], function (value, index) {\n    console.log(value)\n  })\n  \u002F\u002F output: 1 2 3\n\n  \u002F\u002FFor objects\n  _.each({'one':1, 'two':2, 'three':3}, function(value) {\n    console.log(value)\n  })\n  \u002F\u002F output: 1 2 3\n\n  \u002F\u002F Native\n  \u002F\u002FFor arrays\n  [1, 2, 3].forEach(function (value, index) {\n    console.log(value)\n  })\n  \u002F\u002F output: 1 2 3\n\n  \u002F\u002FFor objects\n  Object.entries({'one':1, 'two':2, 'three':3}).forEach(function([key,value],index) {\n    console.log(value)\n  })\n  \u002F\u002Foutput: 1 2 3\n  ```\n\n#### Browser Support for `Array.prototype.forEach()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | 1.5 ✔ |  9.0 ✔  |  ✔  |  ✔  |\n\n#### Browser Support for `Object.entries().forEach()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  54 ✔  | 14 ✔ | 47 ✔ |  ✖  |  41 ✔  |  10.1✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.every\n\nTests whether all elements in the array pass the test implemented by the provided function.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  function isLargerThanTen (element, index, array) {\n    return element >= 10\n  }\n  var array = [10, 20, 30]\n  var result = _.every(array, isLargerThanTen)\n  console.log(result)\n  \u002F\u002F output: true\n\n  \u002F\u002F Native\n  function isLargerThanTen (element, index, array) {\n    return element >= 10\n  }\n\n  var array = [10, 20, 30]\n  var result = array.every(isLargerThanTen)\n  console.log(result)\n  \u002F\u002F output: true\n  ```\n\n#### Browser Support for `Array.prototype.every()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | 1.5 ✔ |  9.0 ✔  |  ✔  |  ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.filter\n\nCreates a new array with all elements that pass the test implemented by the provided function.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  function isBigEnough (value) {\n    return value >= 10\n  }\n  var array = [12, 5, 8, 130, 44]\n  var filtered = _.filter(array, isBigEnough)\n  console.log(filtered)\n  \u002F\u002F output: [12, 130, 44]\n\n  \u002F\u002F Native\n  function isBigEnough (value) {\n    return value >= 10\n  }\n  var array = [12, 5, 8, 130, 44]\n  var filtered = array.filter(isBigEnough)\n  console.log(filtered)\n  \u002F\u002F output: [12, 130, 44]\n  ```\n\n#### Browser Support for `Array.prototype.filter()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | 1.5 ✔ |  9 ✔  |  ✔  |  ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.groupBy\n\nGroup items by key.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var grouped = _.groupBy(['one', 'two', 'three'], 'length')\n  console.log(grouped)\n  \u002F\u002F output: {3: [\"one\", \"two\"], 5: [\"three\"]}\n\n  \u002F\u002F Native\n  var grouped = ['one', 'two', 'three'].reduce((r, v, i, a, k = v.length) => ((r[k] || (r[k] = [])).push(v), r), {})\n  console.log(grouped)\n  \u002F\u002F output: {3: [\"one\", \"two\"], 5: [\"three\"]}\n\n  \u002F\u002F Native\n  Object.groupBy(['one', 'two', 'three'], ({length}) => length)\n  \u002F\u002F output: {3: [\"one\", \"two\"], 5: [\"three\"]}\n  ```\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var grouped = _.groupBy([1.3, 2.1, 2.4], num => Math.floor(num))\n  console.log(grouped)\n  \u002F\u002F output: {1: [1.3], 2: [2.1, 2.4]}\n\n  \u002F\u002F Native\n  var grouped = [1.3, 2.1, 2.4].reduce((r, v, i, a, k = Math.floor(v)) => ((r[k] || (r[k] = [])).push(v), r), {})\n  console.log(grouped)\n  \u002F\u002F output: {1: [1.3], 2: [2.1, 2.4]}\n\n  \u002F\u002F Native\n  Object.groupBy([1.3, 2.1, 2.4], num => Math.floor(num))\n  \u002F\u002F output: {1: [1.3], 2: [2.1, 2.4]}\n  ```\n\n#### Browser Support for `Array.prototype.reduce()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔  | 3.0 ✔ |  9.0 ✔  |  10.5 ✔ |  4.0 ✔ |\n\n#### Browser Support for `Object.groupBy()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  117.0 ✔  | 117.0 ✔ | 119.0 ✔ |  ✖  |  103.0 ✔ |  16.4 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.includes\n\nChecks if a value is in collection.\n\n  ```js\n  var array = [1, 2, 3]\n  \u002F\u002F Underscore\u002FLodash - also called _.contains\n  _.includes(array, 1)\n  \u002F\u002F output: true\n\n  \u002F\u002F Native\n  var array = [1, 2, 3]\n  array.includes(1)\n  \u002F\u002F output: true\n\n  \u002F\u002F Native (does not use same value zero)\n  var array = [1, 2, 3]\n  array.indexOf(1) > -1\n  \u002F\u002F output: true\n  ```\n\n#### Browser Support for `Array.prototype.includes`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  47.0 ✔  | 14.0 ✔ | 43.0 ✔ |  ✖  |  34.0 ✔ |  9.0 ✔ |\n\n#### Browser Support for `Array.prototype.indexOf`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔ | ✔ | 1.5 ✔ | 9.0 ✔ | ✔ | ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.keyBy\n\n> [!WARNING]\n> Not in Underscore.js\n\nCreates an object composed of keys generated from the results of running each element of collection through iteratee.\n\n  ```js\n  \u002F\u002F Lodash\n  console.log(_.keyBy(['a', 'b', 'c']))\n  \u002F\u002F output: { a: 'a', b: 'b', c: 'c' }\n  console.log(_.keyBy([{ id: 'a1', title: 'abc' }, { id: 'b2', title: 'def' }], 'id'))\n  \u002F\u002F output: { a1: { id: 'a1', title: 'abc' }, b2: { id: 'b2', title: 'def' } }\n  console.log(_.keyBy({ data: { id: 'a1', title: 'abc' }}, 'id'))\n  \u002F\u002F output: { a1: { id: 'a1', title: 'abc' }}\n\n  \u002F\u002F keyBy for array only\n  const keyBy = (array, key) => (array || []).reduce((r, x) => ({ ...r, [key ? x[key] : x]: x }), {});\n\n  \u002F\u002F Native\n  console.log(keyBy(['a', 'b', 'c']))\n  \u002F\u002F output: { a: 'a', b: 'b', c: 'c' }\n  console.log(keyBy([{ id: 'a1', title: 'abc' }, { id: 'b2', title: 'def' }], 'id'))\n  \u002F\u002F output: { a1: { id: 'a1', title: 'abc' }, b2: { id: 'b2', title: 'def' } }\n  console.log(keyBy(Object.values({ data: { id: 'a1', title: 'abc' }}), 'id'))\n  \u002F\u002F output: { a1: { id: 'a1', title: 'abc' }}\n\n  \u002F\u002F keyBy for array and object\n  const collectionKeyBy = (collection, key) => {\n    const c = collection || {};\n    return Array.isArray(c) ? keyBy(c, key) : keyBy(Object.values(c), key);\n  }\n  ```\n\n#### Browser Support for `Array.prototype.reduce()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | 12.0 ✔ | 3.0 ✔ |  9.0 ✔  |  10.5 ✔ |  4.0 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.map\n\nTranslates all items in an array or object to new array of items.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var array1 = [1, 2, 3]\n  var array2 = _.map(array1, function (value, index) {\n    return value * 2\n  })\n  console.log(array2)\n  \u002F\u002F output: [2, 4, 6]\n\n  \u002F\u002F Native\n  var array1 = [1, 2, 3]\n  var array2 = array1.map(function (value, index) {\n    return value * 2\n  })\n  console.log(array2)\n  \u002F\u002F output: [2, 4, 6]\n  ```\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var object1 = { 'a': 1, 'b': 2, 'c': 3 }\n  var object2 = _.map(object1, function (value, index) {\n    return value * 2\n  })\n  console.log(object2)\n  \u002F\u002F output: [2, 4, 6]\n\n  \u002F\u002F Native\n  var object1 = { 'a': 1, 'b': 2, 'c': 3 }\n  var object2 = Object.entries(object1).map(function ([key, value], index) {\n    return value * 2\n  })\n  console.log(object2)\n  \u002F\u002F output: [2, 4, 6]\n  ```\n\n#### Browser Support for `Object.entries()` and destructuring\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | 1.5 ✔ |  ✖ |  ✔ |  ✔ |\n\n#### Browser Support for `Array.prototype.map()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | 1.5 ✔ |  9.0 ✔  |  ✔ |  ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.minBy and _.maxBy\n\nUse `Array.prototype.reduce()` for find the maximum or minimum collection item\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var data = [{ value: 6 }, { value: 2 }, { value: 4 }]\n  var minItem = _.minBy(data, 'value')\n  var maxItem = _.maxBy(data, 'value')\n  console.log(minItem, maxItem)\n  \u002F\u002F output: { value: 2 } { value: 6 }\n\n  \u002F\u002F Native\n  var data = [{ value: 6 }, { value: 2 }, { value: 4 }]\n  var minItem = data.reduce(function(a, b) { return a.value \u003C= b.value ? a : b }, {})\n  var maxItem = data.reduce(function(a, b) { return a.value >= b.value ? a : b }, {})\n  console.log(minItem, maxItem)\n  \u002F\u002F output: { value: 2 }, { value: 6 }\n  ```\n\nExtract a functor and use es2015 for better code\n\n  ```js\n  \u002F\u002F utils\n  const makeSelect = (comparator) => (a, b) => comparator(a, b) ? a : b\n  const minByValue = makeSelect((a, b) => a.value \u003C= b.value)\n  const maxByValue = makeSelect((a, b) => a.value >= b.value)\n\n  \u002F\u002F main logic\n  const data = [{ value: 6 }, { value: 2 }, { value: 4 }]\n  const minItem = data.reduce(minByValue, {})\n  const maxItem = data.reduce(maxByValue, {})\n\n  console.log(minItem, maxItem)\n  \u002F\u002F output: { value: 2 }, { value: 6 }\n\n  \u002F\u002F or also more universal and little slower variant of minBy\n  const minBy = (collection, key) => {\n    \u002F\u002F slower because need to create a lambda function for each call...\n    const select = (a, b) => a[key] \u003C= b[key] ? a : b\n    return collection.reduce(select, {})\n  }\n\n  console.log(minBy(data, 'value'))\n  \u002F\u002F output: { value: 2 }\n  ```\n\n#### Browser Support for `Array.prototype.reduce()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | 3.0 ✔ |  9.0 ✔  |  10.5 ✔ |  4.0 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.pluck\n\n`array.map` or `_.map` can also be used to replace `_.pluck`.\nLodash v4.0 removed `_.pluck` in favor of `_.map` with iteratee shorthand.\nDetails can be found in [Changelog](https:\u002F\u002Fgithub.com\u002Flodash\u002Flodash\u002Fwiki\u002FChangelog)\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var array1 = [{name: \"Alice\"}, {name: \"Bob\"}, {name: \"Jeremy\"}]\n  var names = _.pluck(array1, \"name\")\n  console.log(names)\n  \u002F\u002F output: [\"Alice\", \"Bob\", \"Jeremy\"]\n\n  \u002F\u002F Native\n  var array1 = [{name: \"Alice\"}, {name: \"Bob\"}, {name: \"Jeremy\"}]\n  var names = array1.map(function(x){\n    return x.name\n  })\n  console.log(names)\n  \u002F\u002F output: [\"Alice\", \"Bob\", \"Jeremy\"]\n  ```\n\n#### Browser Support for `Array.prototype.map()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  |  ✔ | 1.5 ✔ |  9.0 ✔  |  ✔  |  ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.reduce\n\nApplies a function against an accumulator and each value of the array (from left-to-right) to reduce it to a single value.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var array = [0, 1, 2, 3, 4]\n  var result = _.reduce(array, function (previousValue, currentValue, currentIndex, array) {\n    return previousValue + currentValue\n  })\n  console.log(result)\n  \u002F\u002F output: 10\n\n  \u002F\u002F Native\n  var array = [0, 1, 2, 3, 4]\n  var result = array.reduce(function (previousValue, currentValue, currentIndex, array) {\n    return previousValue + currentValue\n  })\n  console.log(result)\n  \u002F\u002F output: 10\n  ```\n\n#### Browser Support for `Array.prototype.reduce()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] |  ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | 3.0 ✔ |  9.0 ✔  |  10.5 ✔ |  4.0 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.range\n\nCreates an array of numbers progressing from start up to.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  _.range(4)  \u002F\u002F output: [0, 1, 2, 3]\n  _.range(-4) \u002F\u002F output: [0, -1, -2, -3]\n  _.range(1, 5)     \u002F\u002F output: [1, 2, 3, 4]\n  _.range(0, 20, 5) \u002F\u002F output: [0, 5, 10, 15]\n\n  \u002F\u002F Native ( solution with Array.from )\n  Array.from({length: 4}, (_, i) => i)  \u002F\u002F output: [0, 1, 2, 3]\n  Array.from({length: 4}, (_, i) => -i) \u002F\u002F output: [-0, -1, -2, -3]\n  Array.from({length: 4}, (_, i) => i + 1) \u002F\u002F output: [1, 2, 3, 4]\n  Array.from({length: 4}, (_, i) => i * 5) \u002F\u002F output: [0, 5, 10, 15]\n\n  \u002F\u002F Native ( solution with keys() and spread )\n  [...Array(4).keys()]  \u002F\u002F output: [0, 1, 2, 3]\n  [...Array(4).keys()].map(k => -k) \u002F\u002F output: [-0, -1, -2, -3]\n  [...Array(4).keys()].map(k => k + 1)  \u002F\u002F output: [1, 2, 3, 4]\n  [...Array(4).keys()].map(k => k * 5)  \u002F\u002F output: [0, 5, 10, 15]\n  ```\n\n\n#### Browser Support for `Array.from()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n 45.0 ✔  |  ✔ |  32.0 ✔ |  ✖   |  ✔ |  9.0 ✔ |\n\n#### Browser Support for keys and spread in Array literals\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n 46.0 ✔  |  12.0 ✔ |  16.0 ✔ |  ✖ | 37.0 ✔ |  7.1 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.reduceRight\n\nThis method is like _.reduce except that it iterates over elements of collection from right to left.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var array = [0, 1, 2, 3, 4]\n  var result = _.reduceRight(array, function (previousValue, currentValue, currentIndex, array) {\n    return previousValue - currentValue\n  })\n  console.log(result)\n  \u002F\u002F output: -2\n\n  \u002F\u002F Native\n  var array = [0, 1, 2, 3, 4]\n  var result = array.reduceRight(function (previousValue, currentValue, currentIndex, array) {\n    return previousValue - currentValue\n  })\n  console.log(result)\n  \u002F\u002F output: -2\n  ```\n\n#### Browser Support for `Array.prototype.reduceRight()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | 3.0 ✔ |  9.0 ✔  |  10.5 ✔ |  4.0 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.reject\n\nThe opposite of _.filter; this method returns the elements of collection that predicate does not return truthy for.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var array = [1, 2, 3, 4, 5];\n  var result = _.reject(array, function (x) {\n    return x % 2 === 0;\n  });\n  \u002F\u002F output: [1, 3, 5]\n\n  \u002F\u002F Native\n  var array = [1, 2, 3, 4, 5];\n\n  var reject = function (arr, predicate) {\n    var complement = function (f) {\n      return function (x) {\n        return !f(x);\n      }\n    };\n\n    return arr.filter(complement(predicate));\n  };\n  \u002F\u002F output: [1, 3, 5]\n  ```\n\n#### Browser Support for `Array.prototype.filter()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | 12 ✔ | 1.5 ✔ |  9.0 ✔  |  9.5 ✔ |  3.0 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.sample\n\nGets a random element from `array`.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  const array = [0, 1, 2, 3, 4]\n  const result = _.sample(array)\n  console.log(result)\n  \u002F\u002F output: 2\n\n  \u002F\u002F Native\n  const array = [0, 1, 2, 3, 4]\n  const sample = arr => {\n    const len = arr == null ? 0 : arr.length\n    return len ? arr[Math.floor(Math.random() * len)] : undefined\n  }\n\n  const result = sample(array)\n  console.log(result)\n  \u002F\u002F output: 2\n  ```\n\n#### Browser Support for `Array.prototype.length()` and `Math.random()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | 1.0 ✔ |  ✔  |  ✔ |  ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.size\n\nReturns the number of values in the collection.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var result = _.size({one: 1, two: 2, three: 3})\n  console.log(result)\n  \u002F\u002F output: 3\n\n  \u002F\u002F Native\n  var result2 = Object.keys({one: 1, two: 2, three: 3}).length\n  console.log(result2)\n  \u002F\u002F output: 3\n  ```\n\n#### Browser Support for `Object.keys()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  5.0 ✔  | ✔ | 4.0 ✔ |  9.0 ✔ |  12.0 ✔ |  5.0 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.some\n\nTests whether any of the elements in the array pass the test implemented by the provided function.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  function isLargerThanTen (element, index, array) {\n    return element >= 10\n  }\n  var array = [10, 9, 8]\n  var result = _.some(array, isLargerThanTen)\n  console.log(result)\n  \u002F\u002F output: true\n\n  \u002F\u002F Native\n  function isLargerThanTen (element, index, array) {\n    return element >= 10\n  }\n\n  var array = [10, 9, 8]\n  var result = array.some(isLargerThanTen)\n  console.log(result)\n  \u002F\u002F output: true\n  ```\n\n#### Browser Support for `Array.prototype.some()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | 1.5 ✔ |  ✔ 9.0  |  ✔  | ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.sortBy and _.orderBy\n\nSorts an array of object based on an object key provided by a parameter (note this is more limited than Underscore\u002FLodash).\n\n  ```js\n  const fruits = [\n    {name:\"banana\", amount: 2},\n    {name:\"apple\", amount: 4},\n    {name:\"pineapple\", amount: 2},\n    {name:\"mango\", amount: 1}\n  ];\n\n  \u002F\u002F Underscore\n  _.sortBy(fruits, 'name');\n  \u002F\u002F => [{name:\"apple\", amount: 4}, {name:\"banana\", amount: 2}, {name:\"mango\", amount: 1}, {name:\"pineapple\", amount: 2}]\n\n  \u002F\u002F Lodash\n  _.orderBy(fruits, ['name'],['asc']);\n  \u002F\u002F => [{name:\"apple\", amount: 4}, {name:\"banana\", amount: 2}, {name:\"mango\", amount: 1}, {name:\"pineapple\", amount: 2}]\n\n  \u002F\u002F Native\n  const sortBy = (key) => {\n    return (a, b) => (a[key] > b[key]) ? 1 : ((b[key] > a[key]) ? -1 : 0);\n  };\n\n  \u002F\u002F The native sort modifies the array in place. `_.orderBy` and `_.sortBy` do not, so we use `.concat()` to\n  \u002F\u002F copy the array, then sort.\n  fruits.concat().sort(sortBy(\"name\"));\n  \u002F\u002F => [{name:\"apple\", amount: 4}, {name:\"banana\", amount: 2}, {name:\"mango\", amount: 1}, {name:\"pineapple\", amount: 2}]\n  ```\n\n#### Browser Support for `Array.prototype.concat()` and `Array.prototype.sort()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  1.0 ✔  | ✔ | 1.0 ✔ |  5.5 ✔  |  ✔  |  ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.uniq\n\nProduces a duplicate-free version of the array, using === to test object equality.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  var array = [1, 2, 1, 4, 1, 3]\n  var result = _.uniq(array)\n  console.log(result)\n  \u002F\u002F output: [1, 2, 4, 3]\n\n  \u002F\u002F Native\n  var array = [1, 2, 1, 4, 1, 3];\n  var result = [...new Set(array)];\n  console.log(result)\n  \u002F\u002F output: [1, 2, 4, 3]\n  ```\n\n#### Browser Support for Spread in array literals\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n 46.0  ✔  | 12.0 ✔ | 16.0 ✔ |  ✖  |  37.0 ✔  |  8.0 ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n## Function\n\n### _.after\n\n> [!WARNING]\n> This is an alternative implementation\n\nCreates a version of the function that will only be run after first being called count times. Useful for grouping asynchronous responses, where you want to be sure that all the async calls have finished, before proceeding.\n\n  ```js\n  var notes = ['profile', 'settings']\n  \u002F\u002F Underscore\u002FLodash\n  var renderNotes = _.after(notes.length, render)\n  notes.forEach(function (note) {\n    console.log(note)\n    renderNotes()\n  })\n\n  \u002F\u002F Native\n  notes.forEach(function (note, index) {\n    console.log(note)\n    if (notes.length === (index + 1)) {\n      render()\n    }\n  })\n  ```\n\n#### Browser Support for `Array.prototype.forEach()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n :-: | :-: | :-: | :-: | :-: | :-: |\n   ✔  |  ✔ |  1.5 ✔ |  9.0 ✔ |  ✔  | ✔  |\n\n **[⬆ back to top](#quick-links)**\n\n### _.bind\n\nCreate a new function that calls _func_ with _thisArg_ and _args_.\n\n  ```js\n  var objA = {\n    x: 66,\n    offsetX: function(offset) {\n      return this.x + offset;\n    }\n  }\n\n  var objB = {\n    x: 67\n  };\n\n  \u002F\u002F Underscore\u002FLodash\n  var boundOffsetX = _.bind(objA.offsetX, objB, 0);\n\n  \u002F\u002F Native\n  var boundOffsetX = objA.offsetX.bind(objB, 0);\n  ```\n\n#### Browser Support for `Function.prototype.bind()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  7.0 ✔  |  ✔ | 4.0 ✔ |  9.0 ✔ |  11.6 ✔ |  5.1 ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.isFunction\n\nChecks if value is classified as a _Function_ object.\n\n```js\n\u002F\u002F Lodash\n_.isFunction(console.log);\n\u002F\u002F => true\n\n_.isFunction(\u002Fabc\u002F);\n\u002F\u002F => false\n\n\u002F\u002F Native\nfunction isFunction(func) {\n  return typeof func === \"function\";\n}\n\nisFunction(setTimeout);\n\u002F\u002F => true\n\nisFunction(123);\n\u002F\u002F => false\n```\n\n#### Browser Support\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.debounce\n\nCreate a new function that calls `func` with `thisArg` and `args`.\n\n  ```js\n  function debounce(func, wait, immediate) {\n\tvar timeout;\n\treturn function() {\n\t\tvar context = this, args = arguments;\n\t\tclearTimeout(timeout);\n\t\tif (immediate && !timeout) func.apply(context, args);\n\t\ttimeout = setTimeout(function() {\n\t\t\ttimeout = null;\n\t\t\tif (!immediate) func.apply(context, args);\n\t\t}, wait);\n\t};\n  }\n\n  \u002F\u002F Avoid costly calculations while the window size is in flux.\n  jQuery(window).on('resize', debounce(calculateLayout, 150));\n  ```\n\n#### Browser Support for `debounce`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  7.0 ✔  |  ✔ | 4.0 ✔ |  9.0 ✔ |  11.6 ✔ |  5.1 ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n\n### _.partial\n\nCreate a new function that calls `func` with `args`.\n\n  ```js\n  \u002F\u002F Lodash\n  function greet(greeting, name) {\n    return greeting + ' ' + name;\n  }\n  var sayHelloTo = _.partial(greet, 'Hello');\n  var result = sayHelloTo('Jose')\n  console.log(result)\n  \u002F\u002F output: 'Hello Jose'\n\n  \u002F\u002F Native\n  function greet(greeting, name) {\n    return greeting + ' ' + name;\n  }\n  var sayHelloTo = (...args) => greet('Hello', ...args)\n  var result = sayHelloTo('Jose')\n  console.log(result)\n  \u002F\u002F output: 'Hello Jose'\n\n  \u002F\u002F Native\n  const partial = (func, ...boundArgs) => (...remainingArgs) => func(...boundArgs, ...remainingArgs)\n  var sayHelloTo = partial(greet, 'Hello');\n  var result = sayHelloTo('Jose')\n  console.log(result)\n  \u002F\u002F output: 'Hello Jose'\n  ```\n\n#### Browser Support for Spread\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  46.0 ✔ | 12.0 ✔ | 16.0 ✔ |  ✖  |  37.0 ✔ |  8.0 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.throttle\n\nCreate a new function that limits calls to `func` to once every given timeframe.\n\n  ```js\n  function throttle(func, timeFrame) {\n    var lastTime = 0;\n    return function (...args) {\n        var now = new Date();\n        if (now - lastTime >= timeFrame) {\n            func(...args);\n            lastTime = now;\n        }\n    };\n  }\n\n  \u002F\u002F Avoid running the same function twice within the specified timeframe.\n  jQuery(window).on('resize', throttle(calculateLayout, 150));\n  ```\n\n#### Browser Support for `throttle`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  5.0 ✔  |  12.0 ✔ | 3.0 ✔ |  9.0 ✔ |  10.5 ✔ |  4.0 ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n\n## Lang\n\n### _.castArray\n\nPuts the value into an array of length one if it is not already an array.\n\n```js\n\u002F\u002F Underscore\nconsole.log(_.castArray(5))\n\u002F\u002F output: [5]\nconsole.log(_.castArray([2]))\n\u002F\u002F output: [2]\n\n\u002F\u002F Native\nfunction castArray(arr) {\n  return Array.isArray(arr) ? arr : [arr]\n}\n\u002F\u002F output: true\nconsole.log(castArray(5));\n\u002F\u002F output: [5]\nconsole.log(castArray([2]));\n\u002F\u002F output: [2]\n```\n\n#### Browser Support for `Array.isArray()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n5.0 ✔  |  ✔  | 4.0 ✔  |  9.0 ✔  |  10.5 ✔  | 5.0 ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.cloneDeep\nCreates a deep copy by recursively cloning the value.\n\n```js\n\u002F\u002F Lodash\nvar objects = [{ 'a': 1 }, { 'b': 2 }];\n\nvar clone = _.cloneDeep(objects);\nconsole.log(clone[0] === objects[0]);\n\u002F\u002F output: false\n\n\u002F\u002F Native\nvar objects = [{ 'a': 1 }, { 'b': 2 }];\n\nvar clone = structuredClone(objects);\nconsole.log(clone[0] === objects[0]);\n\u002F\u002F output: false\n```\n\n#### Browser Support for `structuredClone()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  98.0 ✔  | 98.0 ✔ | 94.0 ✔ |  ✖  |  84.0 ✔ |  15.4 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.isDate\n\nChecks if value is classified as a Date object.\n\n```js\n\u002F\u002F Lodash\nconsole.log(_.isDate(new Date));\n\u002F\u002F output: true\n\n\u002F\u002F Native\nconsole.log(Object.prototype.toString.call(new Date) === \"[object Date]\");\n\u002F\u002F output: true\n```\n\n#### Browser Support for `String.prototype.toString.call()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | ✔ |  ✔  | ✔ | ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.gt\n\nChecks if value is greater than other.\n\n```js\n\u002F\u002F Lodash\nconsole.log(_.gt(3, 1))\n\u002F\u002F output: true\n\n\u002F\u002F Native\nconsole.log(3 > 1);\n\u002F\u002F output: true\n```\n\n#### Browser Support\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | ✔ |  ✔  | ✔ | ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.gte\n\nChecks if value is greater than or equal to other.\n\n```js\n\u002F\u002F Lodash\nconsole.log(_.gte(3, 1))\n\u002F\u002F output: true\n\n\u002F\u002F Native\nconsole.log(3 >= 1);\n\u002F\u002F output: true\n```\n\n#### Browser Support\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  | ✔ | ✔ |  ✔  | ✔ | ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.isEmpty\n\nChecks if value is an empty object or collection.\n\n> [!WARNING]\n> The Native version does not support evaluating a Set or a Map\n\n  ```js\n  \u002F\u002F Lodash\n  console.log(_.isEmpty(null))\n  \u002F\u002F output: true\n  console.log(_.isEmpty(''))\n  \u002F\u002F output: true\n  console.log(_.isEmpty({}))\n  \u002F\u002F output: true\n  console.log(_.isEmpty([]))\n  \u002F\u002F output: true\n  console.log(_.isEmpty({a: '1'}))\n  \u002F\u002F output: false\n\n  \u002F\u002F Native\n  const isEmpty = obj => [Object, Array].includes((obj || {}).constructor) && !Object.entries((obj || {})).length;\n\n  console.log(isEmpty(null))\n  \u002F\u002F output: true\n  console.log(isEmpty(''))\n  \u002F\u002F output: true\n  console.log(isEmpty({}))\n  \u002F\u002F output: true\n  console.log(isEmpty([]))\n  \u002F\u002F output: true\n  console.log(isEmpty({a: '1'}))\n  \u002F\u002F output: false\n  ```\n\n#### Browser Support for `Array.prototype.includes()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n   47.0 ✔  | 14.0 ✔ | 43.0 ✔ |  ✖ |  34.0 ✔ |  9.0 ✔  |\n\n**[⬆ back to top](#quick-links)**\n\n### _.isFinite\n\nChecks if value is a finite primitive number.\n\n  ```js\n  \u002F\u002F Lodash\n  console.log(_.isFinite('3'))\n  \u002F\u002F output: false\n  console.log(_.isFinite(3))\n  \u002F\u002F output: true\n\n  \u002F\u002F Native\n  console.log(Number.isFinite('3'))\n  \u002F\u002F output: false\n  console.log(Number.isFinite(3))\n  \u002F\u002F output: true\n  ```\n\n#### Browser Support for `Number.isFinite()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  19.0 ✔  |  ✔ | 16.0 ✔ |  ✖  |  15.0 ✔ |  9.0 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.isInteger\n\nChecks if value is an integer.\n\n  ```js\n  \u002F\u002F Lodash\n  console.log(_.isInteger(3))\n  \u002F\u002F output: true\n  console.log(_.isInteger('3'))\n  \u002F\u002F output: false\n\n  \u002F\u002F Native\n  console.log(Number.isInteger(3))\n  \u002F\u002F output: true\n  console.log(Number.isInteger('3'))\n  \u002F\u002F output: false\n  ```\n\n#### Browser Support for `Number.isInteger()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  ✔  |  12 ✔ | 16.0 ✔ |  ✖  |  ✔ |  ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.isPlainObject\n\nChecks if value is a plain object, that is, an object created by the Object constructor or one with a [[Prototype]] of null.\n\n  ```js\n  var object = { 'a': 1, 'b': 2, 'c': 1 };\n\n  \u002F\u002F Underscore\u002FLodash\n  var result = _.isPlainObject(object);\n  console.log(result)\n  \u002F\u002F output: true\n\n  function isPlainObject(value) {\n    if (typeof value !== 'object' || value === null) return false\n\n    if (Object.prototype.toString.call(value) !== '[object Object]') return false\n\n    const proto = Object.getPrototypeOf(value);\n    if (proto === null) return true\n\n    const Ctor = Object.prototype.hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n    return (\n        typeof Ctor === 'function' &&\n        Ctor instanceof Ctor && Function.prototype.call(Ctor) === Function.prototype.call(value)\n    );\n  }\n  ```\n\n#### Browser Support for `Object.getPrototypeOf()`\n\n![Chrome][chrome-image] | ![Edge][edge-image] | ![Firefox][firefox-image] | ![IE][ie-image] | ![Opera][opera-image] | ![Safari][safari-image]\n:-: | :-: | :-: | :-: | :-: | :-: |\n  5.0 ✔  | 12.0 ✔  | 3.5 ✔ |  ✖  |  12.1 ✔ |  5.0 ✔ |\n\n**[⬆ back to top](#quick-links)**\n\n### _.isNaN\n\nChecks if a value is NaN.\n\n  ```js\n  \u002F\u002F Underscore\u002FLodash\n  console.log(_.isNaN(NaN))\n  \u002F\u002F output: true\n\n  \u002F\u002F Native\n  console.log(isNaN(NaN))\n  \u002F\u002F output: true\n\n  \u002F\u002F ES6\n  console.log(Number.isNaN(NaN))\n  \u002F\u002F output: true\n  ```\n\nMDN:\n> In c","该项目提供了一份可以直接使用的原生JavaScript方法列表以及一个ESLint插件，旨在帮助开发者减少对Lodash或Underscore这类库的依赖。其核心功能包括列出多种常用的JavaScript数组和对象操作方法，这些方法在现代浏览器中已得到广泛支持，并且附带了一个ESLint插件来帮助识别可以被原生替代的方法调用。特别适合于那些希望减少项目依赖、提高性能或者目标环境为较新版本浏览器的应用场景。通过采用这些原生方法，不仅能够简化代码库，还能让应用更加轻量级。","2026-06-11 02:52:50","top_language"]