跳到主要内容

更新日志(Change Log)

1.9.1May 31, 2018DiffDocs

  • 修复了 1.9.0 的边缘情况回归,包括在空数组上调用 _.first_.last 的某些形式,并将数组作为键传递给 _.countBy_.groupBy

1.9.0April 18, 2018DiffDocs

  • 为可变参数函数处理添加 _.restArguments 函数。
  • 添加_.chunk 函数以分块数组。
  • 添加 _.isSymbol, _.isMap, _.isWeakMap,_.isSet_.isWeakSet 函数。
  • _.throttle_.debounce 返回函数现在具有 .cancel() 方法,该方法可用于取消任何计划的调用。
  • _.property 现在接受键和索引的数组作为路径说明符,用于查找值的深层属性。
  • _.range 现在接受负范围以生成降序数组。
  • 添加对多种环境的支持,包括:WebWorkers,browserify 和 ES6 imports。
  • 现在可以通过设置_.partial.placeholder 来配置用于 partial 的占位符。
  • _.bindAll 现在接受数组或参数 作为 key 。
  • 三年的性能改进。

1.8.3April 2, 2015DiffDocs

  • 新增一个_.create 方法, 作为 Object.create 的一个简化版本。
  • 围绕着一个 iOS 错误,可导致 isArrayLike 成为 JIT-ed,还修复一个传递0 isArrayLike 时的 bug。

1.8.2Feb. 22, 2015DiffDocs

  • 恢复先前在1.8.1改变的老版本 Internet Explorer 的边界情况。
  • _.contains 添加了一个 fromIndex 参数。

1.8.1Feb. 19, 2015DiffDocs

  • 修复/改变一些老版本 Internet Explorer 和边界情况的行为。 用老版本 Internet Explorer 和 Underscore 1.8.1 测试一下您的应用,让我们知道发生了什么...

1.8.0Feb. 19, 2015DiffDocs

  • 新增_.mapObject,它类似于_.map,但只是对于在对象中的值。
  • 新增_.allKeys,它返回一个对象上所有枚举属性名称。
  • 恢复一个1.7.0的变更,_.extend 仅复制“自己”的属性(注:不包括继承过来的属性)。 希望没有伤害到你 — 如果它这次伤害到了你,我向你道歉。
  • 添加_.extendOwn_.extend 的一个不太有用的形式,仅复制“自己”的属性,(注:不包括继承过来的属性)。
  • 添加_.findIndex _.findLastIndex 功能,很好地补充了_.indexOf_.lastIndexOf
  • 增加了一个_.isMatch 断言(判断)函数,它会告诉你,如果一个对象匹配的 key-value 属性。和_.isEqual_.matcher 非常接近。
  • 增加了一个_.isError 功能。
  • 恢复_.unzip 功能,做为 zip 相反的功能。回滚。
  • _.result 现在有一个可选的回退值(或函数提供回退值)。
  • 添加_.propertyOf 函数发生器作为_.property 的镜像版本。
  • 弃用_.matches。目前他已经有一个更加和谐的名称 -_.matcher
  • 简化各种多样的代码,以提高跨平台兼容性的变化,修复边界情况的 bug。

1.7.0August 26, 2014DiffDocs

  • For consistency and speed across browsers, Underscore now ignores native array methods for forEach, map, reduce,reduceRight, filter, every, some,indexOf, and lastIndexOf. "Sparse" arrays are officially dead in Underscore.
  • Added _.iteratee to customize the iterators used by collection functions. Many Underscore methods will take a string argument for easier_.property-style lookups, an object for _.where-style filtering, or a function as a custom callback.
  • Added _.before as a counterpart to _.after.
  • Added _.negate to invert the truth value of a passed-in predicate.
  • Added _.noop as a handy empty placeholder function.
  • _.isEmpty now works with arguments objects.
  • _.has now guards against nullish objects.
  • _.omit can now take an iteratee function.
  • _.partition is now called with index and object.
  • _.matches creates a shallow clone of your object and only iterates over own properties.
  • Aligning better with the forthcoming ECMA6 Object.assign,_.extend only iterates over the object's own properties.
  • Falsey guards are no longer needed in _.extend and_.defaults—if the passed in argument isn't a JavaScript object it's just returned.
  • Fixed a few edge cases in _.max and _.min to handle arrays containing NaN (like strings or other objects) and Infinity and -Infinity.
  • Override base methods like each and someand they'll be used internally by other Underscore functions too.
  • The escape functions handle backticks (`), to deal with an IE ≤ 8 bug.
  • For consistency, _.union and _.difference now only work with arrays and not variadic args.
  • _.memoize exposes the cache of memoized values as a property on the returned function.
  • _.pick accepts iteratee and contextarguments for a more advanced callback.
  • Underscore templates no longer accept an initial data object._.template always returns a function now.
  • Optimizations and code cleanup aplenty.

1.6.0February 10, 2014DiffDocs

  • Underscore 现在将自己注册为 AMD(Require.js),Bower 和 Component, 以及作为一个 CommonJS 的模块和常规(Java)的脚本。             虽然比较丑陋,但也许是必要的。
  • 添加了 _.partition, 一个拆分一个集合为两个结果列表,第一个数组其元素都满足 predicate 迭代函数, 而第二个的所有元素均不能满足 predicate 迭代函数。
  • 添加了 _.property, 创建一个迭代器,轻松从对象中获取特定属性。 与其他 Underscore 集合函数结合使用时很有用。
  • 添加了 _.matches, 一个函数,它会给你一个断言             可以用来辨别 给定的对象是否匹配指定键/值属性的列表。
  • 添加了 _.constant, 作为_.identity 高阶.
  • 添加了 _.now, 一个优化的方式来获得一个时间戳 — 在内部用来加快 debouncethrottle
  • _.partial 函数 现在可以用来部分适用的任何参数, 通过传递_,无论你想要一个占位符变量, 稍后填充。
  • _.each 函数现在 返回一个列表的引用,方便链式调用。
  • The _.keys 函数 现在 当空对象传入的时候返回一个空数组。
  • … 更多杂项重构.

1.5.2Sept. 7, 2013Diff

  • 增加了 indexBy 函数,他是 countBy and groupBy 功能相辅相成。
  • 增加了 sample 函数,从数组中产生随机元素。
  • 一些有关函数的优化,_.keys 方面的实现(包含大幅提升的对象上 each 函数)。另外 debounce 中一个紧密的循环。

1.5.1Jul. 8, 2013Diff

  • 删除 unzip,因为她简单的应用了 zip 参数的一个数组。使用_.zip.apply(_, list)代替。

1.5.0Jul. 6, 2013Diff

  • 添加一个 unzip 新函数,作为_.zip 功能相反的函数。
  • throttle 函数现在增加一个 options 参数,如果你想禁用第一次首先执行的话,传递{leading: false},还有如果你想禁用最后一次执行的话,传递{trailing: false}
  • Underscore 现在提供了一个 source map 方便压缩文件的调试。
  • defaults 函数现在只 重写 undefined 值,不再重写 null 值。
  • 删除不带方法名参数调用_.bindAll 的能力。
  • 删除计数为0,调用 _.after 的能力。调用的最小数量现在是1(自然数)

1.4.4Jan. 30, 2013Diff

  • 添加_.findWhere,在列表中找到的第一个元素,一组特定的键和值相匹配。
  • 添加_.partial,局部应用一个函数填充在任意数值的参数, 改变其动态 this 值。
  • 通过去掉了一些的边缘案件涉包括构造函数来简化 bind。总之:不要_.bind 你的构造器。
  • 一个 invoke 的小优化。
  • 修改压缩版本中由于不当压缩引起的 isFunctionBUG。

1.4.3Dec. 4, 2012Diff

  • 改进 Underscore 和 与 Adobe 的 JS 引擎的兼容性,可用于 script Illustrator,Photoshop 和相关产品。
  • 添加一个默认的_.identity 迭代到 countBy groupBy 中。
  • uniq 函数现在接受 array, iterator, context 作为参数列表。
  • times 函数现在放回迭代函数结果的映射数组。
  • 简化和修复 throttleBUG。

1.4.22012年10月1日比较文件

  • 为了保证向下兼容, 恢复了 1.4.0 候选版时的一些特性 当传 null 到迭代函数时. 现在又变回非可选参数了.

1.4.1Oct. 1, 2012比较文件

  • 修复 1.4.0 版本里 lastIndexOf 函数的退化.

1.4.0Sept. 27, 2012比较文件

  • 增加 pairs 函数, 把一个 JavaScript 对象转换成[key, value] 的组合 ... 同样地, 也有 object函数, 把 [key, value] 的数组组合转换成对象.
  • 增加 countBy 函数, 可以计算数组内符合条件的对象个数.
  • 增加 invert 函数, 在对象里实现一个简单的键值对调.
  • 增加 where 函数, 以便于筛选出一个数组里包含指定键值的对象数组.
  • 增加 omit 函数, 可以过滤掉对象里的对应 key 的属性.
  • 增加 random 函数, 生成指定范围内的随机数.
  • _.debounce 创建的函数现在会返回上一次更新后的值, 就像 _.throttle 加工过的函数一样.
  • sortBy 函数现在使用了稳定的排序算法.
  • 增加可选参数 fromIndexindexOflastIndexOf 函数里.
  • Underscore 的迭代函数里不再支持稀疏数组. 请使用 for 循环来代替 (或者会更好).
  • minmax 函数现在可以用在非常大的数组上.
  • 模板引擎里插入变量现在可以使用 nullundefined 作为空字符串.
  • Underscore 的迭代函数不再接受 null作为非可选参数. 否则您将得到一个错误提示.
  • 一些小幅修复和调整, 可以在此查看与之前版本的比较.1.4.0 可能比较不向下兼容, 这取决于您怎么使用 Underscore — 请在升级后进行测试。

1.3.32012年4月10日

  • _.template 的多处改进, 现在为潜在的更有效的服务器端预编译 提供模板的源(source)作为属性. 您现在也可以在创建模板的时候 设置 variable 选项, 之后可以通过这个变量名取到模板传入的数据, 取代了 with 语句 — 显著的改进了模板的渲染速度.
  • 增加了 pick 函数, 它可以过滤不在所提供的白名单之内的其他属性.
  • 增加 result 函数, 在与 API 工作时很方便, 允许函数属性或原始属性(非函数属性).
  • 增加 isFinite 函数, 因为有时候仅仅知道某变量是一个 数的时候还不够, 还要知道它是否是有限的数.
  • sortBy 函数现在可以传属性名作为对象的排序标准.
  • 修复 uniq 函数, 现在可以在稀疏数组上使用了.
  • difference 函数现在在对比数组差异的时候只执行浅度的 flatten, 取代之前的深度 flatten.
  • debounce 函数现在多了一个参数 immediate, 会影响到达时间间隔后执行的是最先的函数调用还是最后的函数调用.

1.3.12012年1月23日

  • 增加 _.has 函数, 作为 hasOwnProperty 更安全的版本.
  • 增加 _.collect , 作为 _.map 的别名.
  • 恢复一个旧的修改, _.extend 将再次可以正确复制 拥有 undefined 值的属性.
  • 修复在 _.template 的嵌入语句里反转义斜杠的 bug.

1.3.02012年1月11日

  • 移除 Underscore 对 AMD(RequireJS)的支持. 如果您想继续在 RequireJS 里使用 Underscore, 可以作为一个普通的 script 加载, 封装或修改您的 Underscore 副本, 或者下载一个 Underscore 别的 fork 版本.

1.2.4Jan. 4, 2012

  • 您现在可以写 (您应该会这样用, 因为这样更简单)_.chain(list)来代替 _(list).chain().
  • 修复已反转义的字符在 Underscore 模板里的错误, 并增加了支持自定义支持, 使用_.templateSettings, 只需要定义一到两个必备的正则表达式.
  • 修复以数组作为第一参数传给_.wrap 函数的错误.
  • 改进与 ClojureScript 的兼容性, 增加 call函数到 String.prototype 里.

1.2.32011年12月7日

  • 动态范围在已编译的 _.template 函数中保留, 所以您可以使用 this 属性, 如果您喜欢的话.
  • _.indexOf_.lastIndexOf 增加对稀疏数组的支持.
  • _.reduce_.reduceRight 现在都可以传一个明确的undefined 值. (您为什么要这样做并没有任何原因)

1.2.22011年11月14日

  • 继续改进 _.isEqual , 要让它和语义上所说的一样. 现在原生的 JavaScript 会一个对象与它的封装起来的对象视为相等的, 还有, 数组只会对比他们数字元素 (#351).
  • _.escape 不再尝试在非双重转义的转义 HTML 实体上进行转换. 现在不管怎样只会反转义一次 (#350).
  • _.template 里, 如果愿意的话您可以省略嵌入表达式后面的分号:<% }) %> (#369).
  • _.after(callback, 0) 现在会立即触发 callback 函数, 把"after"做得更易于使用在异步交互的 API 上 (#366).

1.2.12011年10月24日

  • _.isEqual 函数的几个重要 bug 修复, 现在能更好地用在复杂的数组上, 和拥有 length 属性的非数组对象上了. (#329)
  • jrburke 提供了导出 Underscore 以便 AMD 模块的加载器可以加载, 还有 tonylukasavage 提供了导出 Underscore 给 Appcelerator Titanium 使用.(#335, #338)
  • 您现在可以使用 _.groupBy(list, 'property') 作为 以指定的共同属性来分组的快捷方法.
  • _.throttle 函数现在调用的时候会立即自行一次, 此后才是再每隔指定时间再执行一次 (#170, #266).
  • 大多数 _.is[类型] 函数不再使用 ducktype 写法(详见 Ruby 的 duck type).
  • _.bind 函数现在在构造函数(constructor)也能用了, 兼容 ECMAScript 5标准. 不过您可能永远也用不到 _.bind 来绑定一个构造函数.
  • _.clone 函数不再封装对象里的非对象属性.
  • _.find_.filter 现在作为_.detect_.select 的首选函数名.

1.2.02011年10月5日

  • _.isEqual 函数现在支持深度相等性对比, 检测循环结构, 感谢 Kit Cambridge.
  • Underscore 模版现在支持嵌入 HTML 转义字符了, 使用<%- ... %> 语句.
  • Ryan Tenney 提供了 _.shuffle 函数, 它使用 Fisher-Yates 算法的修改版, 返回一个乱序后的数组副本.
  • _.uniq 现在可以传一个可选的迭代器 iterator, 用来确定一个数组以什么样的标准来确定它是否唯一的.
  • _.last 现在增加了一个可选参数, 可以设置返回集合里的最后 N 个元素.
  • 增加了一个新函数 _.initial, 与 _.rest 函数相对, 它会返回一个列表除了最后 N 个元素以外的所有元素.

1.1.72011年7月13日
增加 _.groupBy, 它可以将一个集合里的元素进行分组. 增加 _.union_.difference, 用来补充 (重命名过的) _.intersection 函数. 多方面的改进以支持稀疏数组. _.toArray 现在如果直接传数组时, 将会返回此数组的副本._.functions 现在会返回存在于原型链中的函数名.

1.1.62011年4月18日
增加 _.after 函数, 被它改造过的函数只有在执行指定次数之后才会生效._.invoke 现在将使用函数的直接引用._.every 现在必须传如迭代器函数, 为了符合 ECMAScript 5标准._.extend 当值为 undefined 的时候不再复制键值._.bind 现在如果试图绑定一个 undefined 值的时候将报错.

1.1.52011年3月20日
增加 _.defaults 函数, 用来合并 JavaScript 对象, 一般用来做生成默认值使用. 增加 _.once 函数, 用来把函数改造成只能运行一次的函数._.bind 函数现在委托原生的 ECMAScript 5版本(如可用)._.keys 现在传非对象的值时, 将会抛出一个错误, 就和 ECMAScript 5标准里的一样. 修复了 _.keys 函数在传入稀疏数组时的 bug.

1.1.42011年1月9日
改进所有数组函数当传值 null 时候的行为, 以符合 ECMAScript 5标准. _.wrap 函数现在能正确地 给封装的函数设置 this 关键字了._.indexOf 函数增加了可选参数 isSorted, 寻找索引的时候会将数组作为已排序处理, 将使用更快的二进制搜索. 避免使用 .callee, 保证 _.isArray 函数 在 ECMAScript 5严格模式下能正常使用.

1.1.32010年12月1日
在 CommonJS 里, Underscore 可以像这样引入:
var _ = require("underscore"). 增加 _.throttle_.debounce 函数. 移除 _.breakLoop 函数, 为了符合 ECMAScript 5标准里所说的每一种实现形式都是不能 break 的 — 这将去掉 try/catch 块, 现在, 您遇到 Underscore 迭代器的抛出的异常时, 将会有更完善的堆栈跟踪来检查错误所在之处. 改进 isType 一类函数, 以便更好地兼容 Internet Explorer 浏览器._.template 函数现在可以正确的反转义模板中的反斜杠了. 改进 _.reduce 函数以兼容 ECMAScript 5标准: 如果您不传初始值, 将使用集合里的第一项作为初始值._.each 不再返回迭代后的集合, 为了与 ECMAScript 5的 forEach 保持一致.

1.1.2
修复 _.contains 指向 _.intersect 函数的错误, 应该是指向 _.include 函数(_.cotains 应该是_.include 的别名), 增加 _.unique, 作为 _.uniq 函数的别名.

1.1.1
改进 _.template 函数的运行速度, 和处理多行插入值的性能. Ryan Tenney 提供了许多 Underscore 函数的优化方案. 增加了带注释版本的源代码.

1.1.0
修改了 _.reduce 函数以符合 ECMAScript 5规范, 取代了之前 Ruby/Prototype.js 版本的 _.reduce. 这是一个不向下兼容的修改. _.template 函数现在可以不传参了, 并保留空格._.contains 是一个 _.include 函数新的别名.

1.0.4
Andri Möll 提供了 _.memoize 函数, 以缓存计算结果, 来优化的耗时较长的函数, 使得运行速度变快.

1.0.3
修复了 _.isEqual 函数在对比包含 NaN 的对象时返回 false 的问题. 技术上改良后理论上是正确的, 但是语义上似乎有矛盾, 所以要注意避免对比含有 NaN 的对象.

1.0.2
修复 _.isArguments 在新版本 Opera 浏览器里的 bug, Opera 里会把 arguments 对象当作数组.

1.0.1
修复了 _.isEqual 函数的 bug: 这个 bug 出现在当对比特定因素两个对象时, 这两个对象有着相同个数的值为 undefined 的 key, 但不同名.

1.0.0
Underscore 在这几个月里算是相对稳定了, 所以现在打算出测试版, 版本号为1.0. 从0.6版本开始进行改进, 包括_.isBoolean 的改进, 和_.extend 允许传多个 source 对象.

0.6.0
主要版本, 整合了一系列的功能函数, 包括Mile Frawley 写的在保留援用功能的基础上, 对集合函数进行重构, 内部代码更加简洁. 新的 _.mixin 函数, 允许您自己的功能函数继承 Underscore 对象. 增加 _.times 函数, 跟 Ruby 或 Prototype.js 里的 times 的功能一样. 对 ECMAScript 5的 Array.isArray 函数提供原生支持, 还有 Object.keys.

0.5.8
修复了 Underscore 的集合函数, 以便可以用于 DOM 的节点列表(NodeList)HTML 集合(HTMLCollection)再一次地感谢Justin Tulloss.

0.5.7
修改 _.isArguments 函数, 使用了更安全的实现方式, 还有 加快了 _.isNumber 的运行速度,
感谢Jed Schmidt.

0.5.6
增加了 _.template 对自定义分隔符的支持, 由Noah Sloan 提供.

0.5.5
修复了一个在移动版 Safari 里关于 arguments 对象的面向对象封装的 bug.

0.5.4
修复了_.template 函数里多个单引号在模板里造成的错误. 了解更多请阅读:Rick Strahl 的博客文章.

0.5.2
几个函数的重写: isArray, isDate, isFunction,isNumber, isRegExp, 和 isString, 感谢 Robert Kieffer 提供的建议. 取代了 Object#toString 的对比方式, 现在以属性来进行对比, 虽然说安全性有所降低, 但是速度比以前快了有一个数量级. 因此其他大多数的 Underscore 函数也有小幅度的速度提升. 增加了 _.tap 函数, 由 Evgeniy Dolzhenko 提供, 与 Ruby 1.9的 tap 方法相似, 对链式语法里嵌入其他功能(如登录)很方便.

0.5.1
增加了 _.isArguments 函数. 许多小的安全检查和优化由Noah SloanAndri Möll 提供.

0.5.0
[API 变更] _.bindAll 现在会将 context 对象作为第一个参数. 如果不传方法名, context 对象的所有方法都会绑定到 context, 支持链式语法和简易绑定._.functions 现在只要一个参数, 然后返回所有的方法名(类型为 Function 的属性). 调用 _.functions(_) 会列出所有的 Underscore 函数. 增加 _.isRegExp 函数, isEqual 现在也可以检测两个 RegExp 对象是否相等了. 所有以"is"开头的函数已经缩减到同一个定义里面, 由 Karl Guertin 提供的解决方案.

0.4.7
增加 isDate, isNaN, 和 isNull. 优化 isEqual 函数对比两个数组或两个时间对象时的性能. 优化了 _.keys 函数, 现在的运行速度比以前加快了25%–2倍 (取决于您所使用的浏览器)会加速其所依赖的函数, 如 _.each.

0.4.6
增加 range 函数, Python 里同名函数 range 的移植版, 用于生成灵活的整型数组. 原始版由 Kirill Ishanov 提供.

0.4.5
增加 rest 函数, 可以对数组和 arguments 对象使用, 增加了两个函数的别名,first 的别名为 head, 还有 rest 的别名为 tail, 感谢 Luke Sutton 的解决方案. 增加测试文件, 以确保所有 Underscore 的数组函数都可以在用在 arguments 对象上.

0.4.4
增加 isString, 和 isNumber 函数. 修复了_.isEqual(NaN, NaN) 会返回 true 的问题.

0.4.3
开始使用原生的 StopIteration 浏览器对象(如果浏览器支持). 修复 Underscore 在 CommonJS 环境上的安装.

0.4.2
把解除封装的函数 unwrapping 改名为 value, 更清晰.

0.4.1
链式语法封装的 Underscore 对象支持函数原型方法的调用, 您可以在封装的数组上连续调用任意函数. 增加 breakLoop 方法, 可以随时在 Underscore 的迭代中中断 并跳出迭代. 增加 isEmpty 函数, 在数组和对象上都有用.

0.4.0
现在所有的 Underscore 函数都可以用面向对象的风格来调用了, 比如: _([1, 2, 3]).map(...);.Marc-André Cournoyer 提供了原始的解决方案. 封装对象可以用链式语法连续调用函数. 添加了 functions 方法, 能以正序方式列出所有的 Underscore 函数.

0.3.3
增加 JavaScript 1.8的函数 reduceRight. 别名为foldr, 另外 reduce 的别名为 foldl.

0.3.2
可以在 Rhino 上运行了. 只要在编译器里输入: load("underscore.js"). 增加功能函数 identity.

0.3.1
所有迭代器在原始集合里现在都作为第三个参数传入, 和 JavaScript 1.6的 forEach 一致. 迭代一个对象现在会以 (value, key, collection) 来调用, 更多详情, 请查看 _.each.

0.3.0
增加 Dmitry Baranovskiy 的 综合优化, 合并Kris Kowal 的解决方案让 Underscore 符合CommonJS 标准,并和Narwhal 兼容.

0.2.0
添加 composelastIndexOf, 重命名 injectreduce, 添加 inject, filter,every, some, 和 forEach 的别名.

0.1.1
添加 noConflict, 以便 "Underscore" 对象可以分配给其他变量.

0.1.0
Underscore.js 首次发布.

A DocumentCloud Project