请教数字序列表达式的表达式问题,例如[1:100]

使用类似while的循环时需要记住两個通用规则: 条件

表达式每一帧都在进行计算,都在返回结果


表达式没有内存,因此上一帧的结果也不会储存

/ *可以创建一个变量,并將新值重新赋值给该变量但


该变量的最终值将取决于最后一次赋值。* /

;//将返回最后一次赋值0

while语句就像循环测试每一个条件,直到条件为假在示例中,假设当前时间为6秒:

第二条语句x++是step语句每步都要进行检查并执行条件后的语句。本节使用的是增量运


算符++因此执行条件后+1,直到条件为假如果将step语句更改为+2,则如下示:

很棒的是 time以固定频率返回一个数字序列表达式,因此每一帧 while都会进行另一个循環

并计算新的结果。time和while组合可以在表达式中模拟高速缓存存储器从而模仿在过去

while执行所有条件直到找到错误条件。在此过程中它会反複执行语句或表达式,直到


条件为false此后返回循环的最终结果。while语句可以总结如下:

step语句也可以放前面只要确保用while关键字时有step语句即可。

DO / while与while工作方式类似区别在于:执行语句写在条件之前。上一节的示例现在可

“红色纯色层”会发生同样的事情 - 不透明度每秒增加10%因此,要为do / while语句


创建一个基本模板看起来应该会是这样:

for语句也可作为循环,可能还更快条件和step语句直接写在括号内,要执行的语句写在


夶括号内红色纯色层的不透明度每秒增加10%,也可以这样写:

要使用for关键字需要在括号内定义三个语句:


一、要比较的变量(第一个参數可选,即使不编写任何内容仍然生效);二、判断条件;
三、step语句。这些都需要用分号分隔因此看起来像三个)不同的语句:

是时候考慮优化了。到目前为止还没有机会考虑主要因为本书示例都比较简单,优化只能


快几毫秒不明显。但有一个包含大量表达式的项目或高级的表达式时确实可以提高计算

您可能还记得,表达式没有内存但是有一些技巧可以使引擎尽可能在后台工作。正如在


var关键字中看箌的那样 变量可以是全局变量,也可以是局部变量取决于语句的位置。
如果在函数中使用var关键字定义变量它就是局部变量,仅存在於函数内部如果在函数
外部语使用var关键字,则是全局变量现在使用新引擎,可以使用let和const关键字创建
变量let和const在可读性方面提供了宝贵嘚信息:

const x = 10; / *创建了变量x,但无法重新分配值它是只读的。可以将其用作常规变量


(常量)但不能重新分配* /

在表达式中看到let 或 const变量时,会提示囿关变量的更多信息不过var变量不提供此类


信息。let和const的第二个重要方面是它们定义了“块作用域”变量,该变量就是仅存在
于语句中類似于函数中语句的局部变量。看个例子:

创建文字层源文本编辑器中:

然后新建合成,创建新文字层源文本属性中: 新的表达引擎:JAVASCRIPT

如您所见,我们重新使用该函数来获取对象的值和方法$ Object存储表达式系统的各种信

Variable1,但没有其他变量表达式中的变量x也在。我们已经證明用let和const创建的


变量不会超出它们在表达式中所处的位置。来确认这一点并重写此表达式

现在使用 let关键字定义变量x ,并将其移至函数內部但未发生任何变化。

delete关键字可以从引擎中删除这些变量:

可以删除let定义的变量x,但不能删除var的Variable 1即使这些变量不可用,仍然存


在於后台对于小表达式来说,影响不大但当表达式很复杂时,这也许是减慢计算速度

的根本原因因此使用let和const定义变量,不仅增加可读性也可以进行优化。

对象构造函数 新的表达引擎:JAVASCRIPT

在本书中知道了如何创建自己的对象,在表达式中使用该对象的值(或属性)还知道叻什


么是对象,比如合成、图层以及使用thisComp或者layer()方法来调用对象。知道了如何
创建函数以及对值进行运算现在来学习如何使用函数创建單个或多个对象:

使用this关键字可以创建可自定义的对象。您还记得吗 this采用对象容器的形式,因此从


函数创建对象可以从函数中继承输叺参数的值。然后使用new关键字可以从同一函数创
建单个或多个对象。如果需要在同一属性中创建多个对象此法非常有用。使用新引擎还

可以使用类构造函数方法创建对象:

新引擎中,对象另一个增强功能是无需使用nameValue:value数据对,可以直接添加


值(或属性/特性)增加了对潒的便捷性。现在可以通过以下方式直接向对象添加值:

箭头函数也简化了编写函数的方式:

构建函数另一个重要的新功能是默认参数對于旧引擎,必须在函数内部使用if语句


以防调用函数时未插入参数:

现在,有两种新方法来定义参数的默认值:

现在我们可以使用||运算符定义函数的默认参数,也可以在语句参数括号中直接定义

rest和spread操作符:”…”,是简化表达式另一种新方法rest运算符特别方便。首先需偠了


解以前未接触的东西:参数项(arguments)该术语返回一个数组,可在函数内部使用用

rest运算符有点类似,区别在于:不必定义函数可容纳多少個参数:

spread运算符与rest相反将数组转换为值:

我们创建了一个函数,可以在其中输入多个值作为参数现在想知道这些数字中的最大值,


可鉯使用 Math.max()方法但它只适用于数值。所以可以通过spread把数组转为数值

解构赋值是一种从现有对象或数组创建变量的简便方法。


首先创建新文芓层并键入TEXT在源文本表达式编辑器中:
speed; //将返回不确定值的速度;
现在看看解构赋值作为第一条语句会发生什么:

这些值现在是从Position对象继承的,而不是从表达式所在的源文本继承的

相同的方法适用于数组:

在新引擎中, for/of语句是一个循环可以划到循环工具列表中。它与for/in语呴非常相


似但for/of对于循环遍历字符串或数组的目的更为明确:

现在使用本章中学到的新工具,看看新引擎如何提高性能我们将做一个高級表达式,不仅


更难执行且在旧引擎中的计算时间会很长。

来利用该示例来使用新的术语Path以便控制蒙版或形状的点。本例将在蒙版上笁作但


它可以在任何类型的路径(例如形状层)上工作。

首先要理解路径在表达式中的工作方式。在新合成中添加纯色层在纯色层中,呮需绘制


或添加任何种类的蒙版使“蒙版”出现在层次结构中。

现在可以看到蒙版路径属性打开表达式编辑器,然后在表达式语言菜單找到createPath()

蒙版路径对象中的creatPath()方法看起来贼简单()。首先要记住一个数组可以包


含其他数组。来看一下详细信息需要哪些参数:

点在圖层空间(4个参数) 点在点空间中(3个参数)

此时有一个由creatPath()方法创建的正方形。假设要创建一个圆(实际想要好几个)。 新的表达引擎:JAVASCRIPT


我们知道每个“蒙版路径”属性只能返回一个路径如果复制带有表达式的蒙版,那么也会

创建同样圆形的副本再通过随机方法,把複制的圆放置在随机位置createPath()方法需


要很多参数,我想控制圆的位置和半径正如之前看到的,对象构造函数可以创建新对象

并在其中输叺参数。因此来使用对象构造函数:

对象构造函数在合成中心创建了一个圆在名为circle的对象构造函数中,x、y和直径作为参


数可以在其中添加函数。使用prototype方法:向对象构造函数添加值或方法也可以像
其他参数那样添加(this.create = function())。但我这种方式更清楚点现在有一个可以创建
圆的对潒构造函数。如果创建圆时随机x和y参数复制“蒙版”时会随机分散。但是我想全
面测试新引擎所以还不够!希望创建的圆在合成中有噺位置,且彼此不重叠

第一、通过for循环创建尽可能多的圆。此循环将为每个圆返回新的xy和直径。最后使用


push()方法把对象构造函数的新圓添加到数组circles中 。push方法可以把新参数添加到
此类推数组可以包含值,也可以包含对象首先要注意的是变量i ,它是执行for语句的循
环数夲例为4000。很多因为圆的位置要随机化,要查找不重叠的位置值需要足够多
的项,然后保留不重叠的位置
的小技巧。循环是表达式中朂耗时的计算本次有4000次迭代,因此现在就需要考虑优化

要添加随机方法,让每个新圆都有不同位置如果使用已知的方法(例如wiggle()或 random()


方法) 即使使用了seedRandom()方法,也会在不同属性上返回不同的值我们需要一个随机
方法,可以在存在的任何位置创建相同的值通过使用变量i创建一個名为random2的随机函
数,每次迭代将获得与4000个蒙版副本相同的新值。但此函数返回0到1之间数字值想要
适合合成,需进行转换可以使用linear()方法,但我自定义了一个函数可以看到将值转换
为新值范围。最后创建对象构造函数中的变量还应注意,这些值要在圆的直径与合成的寬
度和高度之间也就是返回位置始终在合成内部。

然后使用上面的函数如果两圆重叠,返回真否则返回假。不能使用length()方法因为


它呮能提供两点的距离,圆的半径可以增加距离

要添加到表达式中的最后一个函数。这是一个使用刚创建重叠函数的循环每次循环返回┅


个新圆位置,此函数会在已创建的每个圆中测试新位置当新位置与已知圆不重叠时,它将
为total数组添加假如果位置与圆重叠,则会在total數组添加真然后退出循环。如果新位
置与已创建圆位置重叠则该位置要被舍弃的。

最后用if语句将最终变量分配给上一个函数的结果,该函数使用现有的圆测试新的迭代


它也是一个数组,其中包含重叠测试中的假和真如果此数组不包含真(重叠),将创建圆
如果包含嫃,将什么也不做跳入下一个迭代。可以使用新方法include()来执行此操作
该方法检查在参数是否存在于数组中,本例中想知道此数组是否包含真如果存在,它将返

最后正如我所说循环语句是表达式中最耗时的,要尽可能避免多重循环使用if语句时,


如果返回圆的数组索引與层次结构中“蒙版”组的索引相同它将退出循环。
举个例子当在蒙版2上返回圆2时将不会计算。这样可以避免不必要的计算

现在,將蒙版复制大约20次然后查看结果。 新的表达引擎:JAVASCRIPT


运作良好且反应灵敏。不过继续复制更多的圆会产生错误。这是因为想要更多的圓
则必须创建更多的选项,也就是需要更多的迭代为此,循环迭代次数还要再大但我们
对象构造函数的好处在于,一切都取决于一個表达式要更改某些内容,只需删除所有蒙
版副本并在“蒙版1”中编辑表达式,再次复制即可例如,还可以使用相同的随机函数

现茬要进一步探索引擎添加最后一个条件,希望圆仅存在于路径内创建新的蓝色纯色


层并在其中绘制圆形蒙版。

使用此路径作为插入圆嘚形状可以使用任何形状哦。无论使用类似于圆形或其他形状


请确保在路径上有很多点,这样将更加精确现在编辑表达式,添加一個变量该变量存

需要定义一个函数来查看点(x,y)是否在路径内: 新的表达引擎:JAVASCRIPT

插入主循环返回的x和y位置作为第一参数, shape变量为第二参數通过该函数可以得知


点是否在路径内。用简单的if语句当函数返回true,创建一个新圆;为false则什么也不做

最后,希望限制迭代次数只茬形状所在的区域中创建。否则循环可能会返回区域之外的


位置,咱不要区域外的因此这些迭代毫无用处。通过将其添加到表达式中可以确定x和y
上形状的最小值和最大值,限制返回位置的区域
可以注意到,使用spread运算符可以避免多余步骤。最后对变量执行此操作:

所以这就是最终表达式:

把蒙版 1复制20次,运行良好的同时速度还快如果修改形状路径,还能自动更新并且圆

}

23:55 ? for两种循环的区别是,while循环之湔先判断一次,如果满足条件的话再循环,for循环的时候必须有一个可迭代的对象才能循环,比如说得有一个数组python中for循环很简单,循环的是一个可迭代对象中的元素 循环里面还有两个比较重要的关键字continue和break,continue的...

}

我要回帖

更多关于 序列表达式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信