JavaScript中的默认属性设置(如Lodash源代码中所示)

JavaScript中的默认属性设置(如Lodash源代码中所示),javascript,arguments,underscore.js,lodash,Javascript,Arguments,Underscore.js,Lodash,在查看如何实现its时,我注意到他们为默认参数赋值选择了非典型语法 我习惯于: function doStuff(obj) { obj = obj || {}; } lodash是如何做到的: function doStuff(obj) { obj || (obj = {}); } 这种款式有什么特别的优点吗?我知道第二种方法避免了不必要的赋值操作,但是否有其他理由使用lodash方法,或者这只是一个我不必担心的微观优化。最终的求和-似乎是个人偏好。我更喜欢第一种方法,因为你

在查看如何实现its时,我注意到他们为默认参数赋值选择了非典型语法

我习惯于:

function doStuff(obj) {
    obj = obj || {};
}
lodash是如何做到的:

function doStuff(obj) {
    obj || (obj = {});
}

这种款式有什么特别的优点吗?我知道第二种方法避免了不必要的赋值操作,但是否有其他理由使用lodash方法,或者这只是一个我不必担心的微观优化。

最终的求和-似乎是个人偏好。

我更喜欢第一种方法,因为你的意图更清楚,但这主要是个人偏好。第二种模式可能更快或更安全,因为除非有必要,它不会重新分配
obj
,这也使它更好地适用于不纯净函数,因为简单的重新分配值可能是个问题。在我的情况下,我非常喜欢第二种方式,但这取决于你。但是,如果您使用的是代码质量工具(jslint、jshint),请确保它的配置正确。@dandavis您能解释一下它的安全性吗?我不太明白这种方法是如何更好地替代不纯函数的,毕竟它们对我来说都是同样不纯的。速度明智似乎是一个清洗:在看了一些之后,简单的语法似乎还可以,它是这类操作的一个推广,可能会在不纯函数中出现问题。这个简单示例的可取之处在于对象/可变项不能是falsy(当然,重新分配仅限于本地)。如果你遵守这些限制,那就好了。您肯定不想做的事情是类似于
obj.sub | |(obj.sub={})在上面,或者只使用上面没有
obj
形式参数的代码。我最初担心的是重新分配可能有别名的对象,但我猜这些对象不可能是假的。。。