在《在JScript中使用缓存技术》一文中,在JScript中实现了基于Application.StaticObjects的缓存技术,并且实现一个类用于缓存的操作,但在实际使用过程中仍需要注意一些问题。
在JScript的函数中,如果参数类型是number或者string,那么是按值传递的,但如果是object,那么就是按引用传递了。另外,数组在JScript中也是作为一个特殊的对象对待,因此,数组的类型也是object,同样是按引用传递的。
使用xbsCache类进行保存和获取数据操作即put和get时,不管是按值还是按引用,都没有问题,但是在使用过程中,对数据操作的效果由数据类型不同而不同。
如果数据是number或string类型的,那么在get数据时,返回值是按值的,也就是说,我们得到的数据是缓存数据的一份copy,对变量的操作并不会影响到缓存中的数据,例:
程序代码:[ 复制代码到剪贴板 ]
- // code by xujiwei
- // from www.xujiwei.cn
- var myname="my name is xujiwei";
- xbsCache.put("name",myname);
- // 从缓存中获取name,值为"my name is xujiwei"
- var myname2=xbsCache.get("name");
- // 给myname2赋值"xujiwei"
- myname2="xujiwei";
- // 从缓存中获取name,值仍为"my name is xujiwei"
- var myname3=xbsCache.get("name");
但是在数据类型为object的情况下,我们就需要注意,在从缓存中获取数据之后,我们得到的只是一个指向缓存数据的引用而已,并不是缓存数据的copy,因此,对数据的修改是直接影响到缓存的,例:
程序代码:[ 复制代码到剪贴板 ]
- // code by xujiwei
- // from www.xujiwei.cn
- // 构建一个myname对象,具有属性Name,值为"my name is xujiwei"
- var myname={Name:"my name is xujiwei"};
- xbsCache.put("name",myname);
- // 从缓存中获取name,Name属性值为"my name is xujiwei"
- var myname2=xbsCache.get("name");
- // 给myname2赋值"xujiwei"
- myname2.Name="xujiwei";
- // 从缓存中获取name,Name属性值变为"xujiwei"
- var myname3=xbsCache.get("name");
由于数据类型不同而引起的这两种情况,在使用缓存时需要分别对待,如果需要会对缓存中object类型数据进行修改,应该设置一个标志变量,以免对数据重复进行修改,从而破坏了数据的准确性。
0 条评论。