较新版本的ColdFusion(我相信CF 8和9)允许您使用类似于JSON的对象文字符号创建结构。
我的问题是,对于基本上是静态的数据,使用对象文字符号对个别作业是否有特定的好处(执行效率可能)?
例如:
通过个人作业,你可以这样做:
var user = {};
user.Fname = "MyFirstnam";
user.Lname = "MyLastName";
user.titles = [];
ArrayAppend(user.titles,'Mr');
ArrayAppend(user.titles,'Dr.');
对于对象文字,你会做类似的事情。
var user = {Fname = "MyFirstnam",
Lname = "MyLastName",
titles = ['Mr','Dr']};
现在这个有限的例子很简单,但如果title是一个结构数组(说一个地址数组),那么文字符号就变得很难处理了。
答案 0 :(得分:4)
文字符号是声明性编程,而不是程序编程。
使用文字符号,您只需一步即可清楚地告诉计算机您想要的内容。如果没有字面符号,你可以一点一点地慢慢地构建你想要的东西,而且没有清晰度。
请注意,CF8中的文字符号充其量是尴尬和缺陷。它应该很少使用,然后只在简单的情况下使用。 CF9中的字面符号很好。
对于CF8,您可以定义助手:
function $A() {
var r = [ ];
var i = 0;
var m = ArrayLen(Arguments);
for(i = 1; i <= m; i += 1)
ArrayAppend(r, Arguments[i]);
return r;
}
function $S() {
return StructCopy(Arguments);
}
并使用它们:
var user = $S(
Fname = "MyFirstnam",
Lname = "MyLastName",
titles = $A('Mr', 'Dr')
);
这些帮助程序一直工作,保留struct key case(struct keys不仅仅是大写的,而是在键入时加入),并且无限制地递归嵌套。
答案 1 :(得分:4)
在我尝试任何事情之前,我立刻想到文字会更快,因为你在运行时创建了所需的一切,并且不需要浪费时间创建变量,然后调用函数来追加所有这些。
然后我写了一个小测试,生成一个包含结果的图表。你让我很好奇: - )
结果证明我是对的,因为图表显示了一个惊人的差异,你可以看到: alt text http://i44.tinypic.com/jiz8lw.jpg
但要记住,虽然有人会跳过字面符号,但我认为重要的是要记住字面符号可能很尴尬,并且大部分时间都会混淆更多。
显然,如果你正在开发一个真正需要速度提升的页面,那么字面符号就是你正在寻找的,但要注意有时在CF8上,它会产生一些奇怪的行为。
只是为了向您展示我运行的那种测试:
<cfset aLiterals = arrayNew(1) />
<cfset aDirect = arrayNew(1) />
<cfsilent>
<cfloop from="1" to="10000" index="mm">
<!--- LITERAL --->
<!--- start timer --->
<cfset start = getTickcount() />
<cfloop from="1" to="1000" index="ii">
<cfset user = {Fname = "MyFirstnam", Lname = "MyLastName", titles = ['Mr','Dr']} />
</cfloop>
<!--- end timer --->
<cfset end = getTickCount()>
<!--- Display total time --->
<cfset total = end-start>
<cfset arrayAppend(aLiterals,total) />
<!--- DIRECT --->
<!--- start timer --->
<cfset start1 = getTickcount() />
<cfloop from="1" to="1000" index="jj">
<cfset user = {} />
<cfset user.Fname = "MyFirstnam" />
<cfset user.Lname = "MyLastName" />
<cfset user.titles = [] />
<cfset ArrayAppend(user.titles,'Mr') />
<cfset ArrayAppend(user.titles,'Dr.') />
</cfloop>
<!--- end timer --->
<cfset end1 = getTickCount()>
<!--- Display total time --->
<cfset total1 = end1-start1>
<cfset arrayAppend(aDirect,total1) />
</cfloop>
</cfsilent>
<!--- The cfchart --->
<cfchart format="png" xaxistitle="function" yaxistitle="Loading Time (in secs.)">
<cfchartseries type="bar" serieslabel="literal">
<cfchartdata item="literal" value="#arrayAvg(aLiterals)#">
</cfchartseries>
<cfchartseries type="bar" serieslabel="direct">
<cfchartdata item="direct" value="#arrayAvg(aDirect)#">
</cfchartseries>
</cfchart>
希望这会对你有所帮助。