在他的书" 更快的网站"中, Steve Sounders写道,提高循环性能的一种简单方法是将迭代器递减到0而不是递增到总长度(实际上这一章是由Nicholas C. Zakas编写的).根据每次迭代的复杂性,此更改可以比原始执行时间节省高达50%的成本.例如:
var values = [1,2,3,4,5];
var length = values.length;
for (var i=length; i--;) {
process(values[i]);
}
Run Code Online (Sandbox Code Playgroud)
这对于for循环,do-while循环和while循环几乎相同.
我想知道,这是什么原因?为什么要这么快地递减迭代器呢?(我对此技术背景感兴趣,而不是在证明此声明的基准测试中感兴趣.)
编辑:乍一看这里使用的循环语法看起来不对.没有length-1或者i>=0,让我们澄清(我很困惑太).
这是循环语法的一般:
for ([initial-expression]; [condition]; [final-expression])
statement
Run Code Online (Sandbox Code Playgroud)
初始表达 -var i=length
首先评估此变量声明.
条件 -i--
在每次循环迭代之前计算此表达式.它将在第一次通过循环之前递减变量.如果此表达式求值为false循环结束.在JavaScript中是0 == false这样的,如果i最终等于0它被解释为false并且循环结束.
最终表达
在每次循环迭代结束时(在下一次条件评估之前)评估该表达式.这里不需要它是空的.所有三个表达式在for循环中都是可选的.
for循环语法不是问题的一部分,但因为它有点不常见,我认为澄清它是有趣的.也许有一个原因是它更快,因为它使用较少的表达式(0 == false"技巧").
我正在使用Gson读取JSON响应,它返回somtimes a NumberFormatException因为预期int值设置为空字符串.现在我想知道处理这种异常的最佳方法是什么.如果值为空字符串,则反序列化应为0.
预期的JSON响应:
{
"name" : "Test1",
"runtime" : 90
}
Run Code Online (Sandbox Code Playgroud)
但有时运行时是一个空字符串:
{
"name" : "Test2",
"runtime" : ""
}
Run Code Online (Sandbox Code Playgroud)
java类看起来像这样:
public class Foo
{
private String name;
private int runtime;
}
Run Code Online (Sandbox Code Playgroud)
反序列化是这样的:
String input = "{\n" +
" \"name\" : \"Test\",\n" +
" \"runtime\" : \"\"\n" +
"}";
Gson gson = new Gson();
Foo foo = gson.fromJson(input, Foo.class);
Run Code Online (Sandbox Code Playgroud)
抛出一个com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: empty String因为返回一个空String而不是一个int值.
有没有办法告诉Gson," 如果你反序列化runtimeType 的字段Foo并且有一个NumberFormatException,只返回默认值0 "?
我的解决方法是使用a …
例如,它可以用作静态变量吗?
public static Ordering<String> BY_LENGTH_ORDERING = new Ordering<String>() {
public int compare(String left, String right) {
return Ints.compare(left.length(), right.length());
}
};
Run Code Online (Sandbox Code Playgroud) 功能: 我想在用户看到某个div(向下滚动到它)时更改某个项目的类.
我现在是怎么做的:我正在使用这个很好的脚本(http://code.google.com/p/jquery-appear/),当一个div对用户可见时,它只能触发一个jquery事件.然而它只发射一次.因此,如果向下滚动页面,jquery就可以正常执行了.但是,如果我向上滚动然后再向下滚动它就会发生火灾.这是我的jquery:
$('#myDiv').appear(function() {
$("#aDiv").addClass("active");
});
Run Code Online (Sandbox Code Playgroud)
我想做的事情:每当"myDiv"出现时让脚本执行,而不仅仅是第一个.
有没有人知道如何做到这一点?