更新日志(Change Log)
1.9.1 — May 31, 2018 — Diff — Docs
- 修复了 1.9.0 的边缘情况回归,包括在空数组上调用
_.first
和_.last
的某些形式,并将数组作为键传递给_.countBy
和_.groupBy
。
1.9.0 — April 18, 2018 — Diff — Docs
- 为可变参数函数处理添加
_.restArguments
函数。 - 添加
_.chunk
函数以分块数组。 - 添加
_.isSymbol
,_.isMap
,_.isWeakMap
,_.isSet
和_.isWeakSet
函数。 _.throttle
和_.debounce
返回函数现在具有.cancel()
方法,该方法可用于取消任何计划的调用。_.property
现在接受键和索引的数组作为路径说明符,用于查找值的深层属性。_.range
现在接受负范围以生成降序数组。- 添加对多种环境的支持,包括:WebWorkers,browserify 和 ES6 imports。
- 现在可以通过设置
_.partial.placeholder
来配置用于 partial 的占位符。 _.bindAll
现在接受数组或参数 作为 key 。- 三年的性能改进。
1.8.3 — April 2, 2015 — Diff — Docs
- 新增一个
_.create
方法, 作为Object.create
的一个简化版本。 - 围绕着一个 iOS 错误,可导致
isArrayLike
成为 JIT-ed,还修复一个传递0
给isArrayLike
时的 bug。
1.8.2 — Feb. 22, 2015 — Diff — Docs
- 恢复先前在1.8.1改变的老版本 Internet Explorer 的边界情况。
_.contains
添加了一个fromIndex
参数。
1.8.1 — Feb. 19, 2015 — Diff — Docs
- 修复/改变一些老版本 Internet Explorer 和边界情况的行为。 用老版本 Internet Explorer 和 Underscore 1.8.1 测试一下您的应用,让我们知道发生了什么...
1.8.0 — Feb. 19, 2015 — Diff — Docs
- 新增
_.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.0 — August 26, 2014 — Diff — Docs
- For consistency and speed across browsers, Underscore now ignores native array methods for
forEach
,map
,reduce
,reduceRight
,filter
,every
,some
,indexOf
, andlastIndexOf
. "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 witharguments
objects._.has
now guards against nullish objects._.omit
can now take an iteratee function._.partition
is now called withindex
andobject
._.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 containingNaN
(like strings or other objects) andInfinity
and-Infinity
. - Override base methods like
each
andsome
and 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
acceptsiteratee
andcontext
arguments 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.0 — February 10, 2014 — Diff — Docs
- Underscore 现在将自己注册为 AMD(Require.js),Bower 和 Component, 以及作为一个 CommonJS 的模块和常规(Java)的脚本。 虽然比较丑陋,但也许是必要的。
- 添加了
_.partition
, 一个拆分一个集合为两个结果列表,第一个数组其元素都满足 predicate 迭代函数, 而第二个的所有元素均不能满足 predicate 迭代函数。 - 添加了
_.property
, 创建一个迭代器,轻松从对象中获取特定属性。 与其他 Underscore 集合函数结合使用时很有用。 - 添加了
_.matches
, 一个函数,它会给你一个断言 可以用来辨别 给定的对象是否匹配指定键/值属性的列表。 - 添加了
_.constant
, 作为_.identity
高阶. - 添加了
_.now
, 一个优化的方式来获得一个时间戳 — 在内部用来加快debounce
和throttle
。 _.partial
函数 现在可以用来部分适用的任何参数, 通过传递_
,无论你想要一个占位符变量, 稍后填充。_.each
函数现在 返回一个列表的引用,方便链式调用。- The
_.keys
函数 现在 当空对象传入的时候返回一个空数组。 - … 更多杂项重构.
1.5.2 — Sept. 7, 2013 — Diff
- 增加了
indexBy
函数,他是countBy
andgroupBy
功能相辅相成。 - 增加了
sample
函数,从数组中产生随机元素。 - 一些有关函数的优化,
_.keys
方面的实现(包含大幅提升的对象上each
函数)。另外debounce
中一个紧密的循环。
1.5.1 — Jul. 8, 2013 — Diff
- 删除
unzip
,因为她简单的应用了zip
参数的一个数组。使用_.zip.apply(_, list)
代替。
1.5.0 — Jul. 6, 2013 — Diff
- 添加一个
unzip
新函数,作为_.zip
功能相反的函数。 throttle
函数现在增加一个options
参数,如果你想禁用第一次首先执行的话,传递{leading: false},还有如果你想禁用最后一次执行的话,传递{trailing: false}。- Underscore 现在提供了一个 source map 方便压缩文件的调试。
defaults
函数现在只 重写undefined
值,不再重写null
值。- 删除不带方法名参数调用
_.bindAll
的能力。 - 删除计数为0,调用
_.after
的能力。调用的最小数量现在是1
(自然数)
1.4.4 — Jan. 30, 2013 — Diff
- 添加
_.findWhere
,在列表中找到的第一个元素,一组特定的键和值相匹配。 - 添加
_.partial
,局部应用一个函数填充在任意数值的参数, 不改变其动态this
值。 - 通过去掉了一些的边缘案件涉包括构造函数来简化
bind
。总之:不要_.bind
你的构造器。 - 一个
invoke
的小优化。 - 修改压缩版本中由于不当压缩引起的
isFunction
BUG。
1.4.3 — Dec. 4, 2012 — Diff
- 改进 Underscore 和 与 Adobe 的 JS 引擎的兼容性,可用于 script Illustrator,Photoshop 和相关产品。
- 添加一个默认的
_.identity
迭代到countBy
和groupBy
中。 uniq
函数现在接受array, iterator, context
作为参数列表。times
函数现在放回迭代函数结果的映射数组。- 简化和修复
throttle
BUG。
1.4.2 — 2012年10月1日 — 比较文件
- 为了保证向下兼容, 恢复了 1.4.0 候选版时的一些特性 当传
null
到迭代函数时. 现在又变回非可选参数了.
1.4.1 — Oct. 1, 2012 — 比较文件
- 修复 1.4.0 版本里
lastIndexOf
函数的退化.
1.4.0 — Sept. 27, 2012 — 比较文件
- 增加
pairs
函数, 把一个 JavaScript 对象转换成[key, value]
的组合 ... 同样地, 也有object
函数, 把[key, value]
的数组组合转换成对象. - 增加
countBy
函数, 可以计算数组内符合条件的对象个数. - 增加
invert
函数, 在对象里实现一个简单的键值对调. - 增加
where
函数, 以便于筛选出一个数组里包含指定键值的对象数组. - 增加
omit
函数, 可以过滤掉对象里的对应 key 的属性. - 增加
random
函数, 生成指定范围内的随机数. - 用
_.debounce
创建的函数现在会返回上一次更新后的值, 就像_.throttle
加工过的函数一样. sortBy
函数现在使用了稳定的排序算法.- 增加可选参数
fromIndex
到indexOf
和lastIndexOf
函数里. - Underscore 的迭代函数里不再支持稀疏数组. 请使用
for
循环来代替 (或者会更好). min
和max
函数现在可以用在非常大的数组上.- 模板引擎里插入变量现在可以使用
null
和undefined
作为空字符串. Underscore 的迭代函数不再接受null
作为非可选参数. 否则您将得到一个错误提示.- 一些小幅修复和调整, 可以在此查看与之前版本的比较.1.4.0 可能比较不向下兼容, 这取决于您怎么使用 Underscore — 请在升级后进行测试。
1.3.3 — 2012年4月10日
_.template
的多处改进, 现在为潜在的更有效的服务器端预编译 提供模板的源(source)
作为属性. 您现在也可以在创建模板的时候 设置variable
选项, 之后可以通过这个变量名取到模板传入的数据, 取代了with
语句 — 显著的改进了模板的渲染速度.- 增加了
pick
函数, 它可以过滤不在所提供的白名单之内的其他属性. - 增加
result
函数, 在与 API 工作时很方便, 允许函数属性或原始属性(非函数属性). - 增加
isFinite
函数, 因为有时候仅仅知道某变量是一个 数的时候还不够, 还要知道它是否是有限的数. sortBy
函数现在可以传属性名作为对象的排序标准.- 修复
uniq
函数, 现在可以在稀疏数组上使用了. difference
函数现在在对比数组差异的时候只执行浅度的 flatten, 取代之前的深度 flatten.debounce
函数现在多了一个参数immediate
, 会影响到达时间间隔后执行的是最先的函数调用还是最后的函数调用.
1.3.1 — 2012年1月23日
- 增加
_.has
函数, 作为hasOwnProperty
更安全的版本. - 增加
_.collect
, 作为_.map
的别名. - 恢复一个旧的修改,
_.extend
将再次可以正确复制 拥有 undefined 值的属性. - 修复在
_.template
的嵌入语句里反转义斜杠的 bug.
1.3.0 — 2012年1月11日
- 移除 Underscore 对 AMD(RequireJS)的支持. 如果您想继续在 RequireJS 里使用 Underscore, 可以作为一个普通的 script 加载, 封装或修改您的 Underscore 副本, 或者下载一个 Underscore 别的 fork 版本.
1.2.4 — Jan. 4, 2012
- 您现在可以写 (您应该会这样用, 因为这样更简单)
_.chain(list)
来代替_(list).chain()
. - 修复已反转义的字符在 Underscore 模板里的错误, 并增加了支持自定义支持, 使用
_.templateSettings
, 只需要定义一到两个必备的正则表达式. - 修复以数组作为第一参数传给
_.wrap
函数的错误. - 改进与 ClojureScript 的兼容性, 增加
call
函数到String.prototype
里.
1.2.3 — 2011年12月7日
- 动态范围在已编译的
_.template
函数中保留, 所以您可以使用this
属性, 如果您喜欢的话. _.indexOf
和_.lastIndexOf
增加对稀疏数组的支持._.reduce
和_.reduceRight
现在都可以传一个明确的undefined
值. (您为什么要这样做并没有任何原因)
1.2.2 — 2011年11月14日
- 继续改进
_.isEqual
, 要让它和语义上所说的一样. 现在原生的 JavaScript 会一个对象与它的封装起来的对象视为相等的, 还有, 数组只会对比他们数字元素 (#351). _.escape
不再尝试在非双重转义的转义 HTML 实体上进行转换. 现在不管怎样只会反转义一次 (#350).- 在
_.template
里, 如果愿意的话您可以省略嵌入表达式后面的分号:<% }) %>
(#369). _.after(callback, 0)
现在会立即触发 callback 函数, 把"after"做得更易于使用在异步交互的 API 上 (#366).
1.2.1 — 2011年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.0 — 2011年10月5日
_.isEqual
函数现在支持深度相等性对比, 检测循环结构, 感谢 Kit Cambridge.- Underscore 模版现在支持嵌入 HTML 转义字符了, 使用
<%- ... %>
语句. - Ryan Tenney 提供了
_.shuffle
函数, 它使用 Fisher-Yates 算法的修改版, 返回一个乱序后的数组副本. _.uniq
现在可以传一个可选的迭代器 iterator, 用来确定一个数组以什么样的标准来确定它是否唯一的._.last
现在增加了一个可选参数, 可以设置返回集合里的最后 N 个元素.- 增加了一个新函数
_.initial
, 与_.rest
函数相对, 它会返回一个列表除了最后 N 个元素以外的所有元素.
1.1.7 — 2011年7月13日
增加 _.groupBy
, 它可以将一个集合里的元素进行分组. 增加 _.union
和 _.difference
, 用来补充 (重命名过的) _.intersection
函数. 多方面的改进以支持稀疏数组. _.toArray
现在如果直接传数组时, 将会返回此数组的副本._.functions
现在会返回存在于原型链中的函数名.
1.1.6 — 2011年4月18日
增加 _.after
函数, 被它改造过的函数只有在执行指定次数之后才会生效._.invoke
现在将使用函数的直接引用._.every
现在必须传如迭代器函数, 为了符合 ECMAScript 5标准._.extend
当值为 undefined 的时候不再复制键值._.bind
现在如果试图绑定一个 undefined 值的时候将报错.
1.1.5 — 2011年3月20日
增加 _.defaults
函数, 用来合并 JavaScript 对象, 一般用来做生成默认值使用. 增加 _.once
函数, 用来把函数改造成只能运行一次的函数._.bind
函数现在委托原生的 ECMAScript 5版本(如可用)._.keys
现在传非对象的值时, 将会抛出一个错误, 就和 ECMAScript 5标准里的一样. 修复了 _.keys
函数在传入稀疏数组时的 bug.
1.1.4 — 2011年1月9日
改进所有数组函数当传值 null
时候的行为, 以符合 ECMAScript 5标准. _.wrap
函数现在能正确地 给封装的函数设置 this
关键字了._.indexOf
函数增加了可选参数 isSorted, 寻找索引的时候会将数组作为已排序处理, 将使用更快的二进制搜索. 避免使用 .callee
, 保证 _.isArray
函数 在 ECMAScript 5严格模式下能正常使用.
1.1.3 — 2010年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 Sloan 和Andri 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
添加 compose
和 lastIndexOf
, 重命名 inject
为reduce
, 添加 inject
, filter
,every
, some
, 和 forEach
的别名.
0.1.1
添加 noConflict
, 以便 "Underscore" 对象可以分配给其他变量.
0.1.0
Underscore.js 首次发布.