Javascript 是否可以在此处删除对null的检查?
这将为可移植对象提供更强的检查,并减少控制结构 我使用了下面的代码并对其进行了修改,以消除对null的初始检查。通过使用键显式地检查某些内容,我们可以提供一个看起来更有力的保证,即某些内容不会滑过(obj==null),并且我们可以消除4条控制语句中的1条。更新在代码段2中 另外,通过添加对Javascript 是否可以在此处删除对null的检查?,javascript,Javascript,这将为可移植对象提供更强的检查,并减少控制结构 我使用了下面的代码并对其进行了修改,以消除对null的初始检查。通过使用键显式地检查某些内容,我们可以提供一个看起来更有力的保证,即某些内容不会滑过(obj==null),并且我们可以消除4条控制语句中的1条。更新在代码段2中 另外,通过添加对&&obj的检查,我们可以避免抛出错误,这似乎是原始检查的目的 obj==null将检测未定义的和null 发件人: Snippet1 var each = _.each = _.forEach = func
&&obj
的检查,我们可以避免抛出错误,这似乎是原始检查的目的
obj==null
将检测未定义的和null
发件人:
Snippet1
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj == null) return;
if (nativeForEach && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
} else if (obj.length === +obj.length) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};
我们可以消除4条控制语句中的1条
…但是您必须在其他检查中添加这些obj&
检查,并且您甚至必须在对象循环周围引入另一个if条件。这种“改进”使代码变得更复杂、更慢
此拆卸是否正常工作
你改变了控制流程。如果传入数组或其他对象,行为不会发生变化,但新代码段不会枚举布尔值和数字(如),也不会尝试迭代空字符串。不确定你认为什么是正确的。第一个片段有什么问题?使用保护条件是一种很好的做法。您所说的“通过使用键显式检查某物”是什么意思?使用for in
枚举数字或布尔值是不可能的@pure_code.mom:不可能将属性分配给原语值,没错。但是你仍然可以在枚举中使用它们,在枚举中它们被隐式地强制转换为对象:-请将你的下一票更改为上一票:-)我并不是说这是相关的,当然,我只是想表明有一点不同。我没有做任何更改,只是添加了演示链接。答案的第一部分(关于“使代码更复杂、更慢”)仍然有效。如果你澄清你关于“正确性”的问题(将其改为对数组和对象是否同样有效?或其他什么),我很乐意修改我的答案。我拿出了额外的If…以防有人传递带有原型属性的数字(这是真的吗?),等等。现在,如果你可以编辑。我现在说的是用两个obj&
替换单个if语句。请注意,for in
忽略null
和undefined
没有问题。另外,请注意,nativForEach比所有其他循环数组的方法都慢,我现在已经看到了两个jsperf……因此这将是下一步,简单地删除if语句。end函数将更快更简单,因为它简化为if和else语句。
var each = _.each = _.forEach = function(obj, iterator, context) {
// modify - obj &&
if (nativeForEach && obj && obj.forEach === nativeForEach) {
obj.forEach(iterator, context);
// modify - obj &&
} else if (obj && (obj.length === +obj.length)) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};
var each = _.each = _.forEach = function(obj, iterator, context) {
if (obj && (obj.length === +obj.length)) {
for (var i = 0, l = obj.length; i < l; i++) {
if (iterator.call(context, obj[i], i, obj) === breaker) return;
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) === breaker) return;
}
}
}
};