Actionscript 3 使用valueOf()函数有什么用?
为什么valueOf()函数出现在AS3中的所有内容中?我想不出一个例子,当这不是多余的。在获取值方面,Actionscript 3 使用valueOf()函数有什么用?,actionscript-3,Actionscript 3,为什么valueOf()函数出现在AS3中的所有内容中?我想不出一个例子,当这不是多余的。在获取值方面,x和x.valueOf()对我来说是完全相同的(除了可能需要更多的CPU周期)。此外,即使它们在设置某些内容方面可能不相同,x.valueOf()=y(即使合法)也完全没有意义 我有信心,虽然这是一个原因,我只是没有看到这里。这是怎么一回事?我确实试过用谷歌搜索一分钟。谢谢 返回指定对象的基元值。如果此对象没有 原语值,则返回对象本身 资料来源:Adobe AS3参考 编辑: 原语值可以是数字
x
和x.valueOf()
对我来说是完全相同的(除了可能需要更多的CPU周期)。此外,即使它们在设置某些内容方面可能不相同,x.valueOf()=y
(即使合法)也完全没有意义
我有信心,虽然这是一个原因,我只是没有看到这里。这是怎么一回事?我确实试过用谷歌搜索一分钟。谢谢
返回指定对象的基元值。如果此对象没有
原语值,则返回对象本身
资料来源:Adobe AS3参考
编辑:
原语值可以是数字、int、bool等。。。它们只是价值。对象可以具有属性、方法等
但在我看来,最大的区别是:
primitive2 = primitive1;
在本例中,原语2包含原语1中数据的副本
obj2 = obj1;
然而,在本例中,ob2指向与obj1相同的对象。修改obj1或obj2,它们都会反映更改,因为它们是参考
简而言之,当您希望查看对象(如果存在)的基本体表示而不是对象本身时,将使用valueOf
返回指定对象的基元值。如果此对象没有
原语值,则返回对象本身
资料来源:Adobe AS3参考
编辑:
原语值可以是数字、int、bool等。。。它们只是价值。对象可以具有属性、方法等
但在我看来,最大的区别是:
primitive2 = primitive1;
在本例中,原语2包含原语1中数据的副本
obj2 = obj1;
然而,在本例中,ob2指向与obj1相同的对象。修改obj1或obj2,它们都会反映更改,因为它们是参考
简而言之,当您希望查看对象的基本表示(如果存在)而不是对象本身时,使用valueOf。正如您所说,它是完全冗余的
方法的valueOf只是为了使ActionScript3符合ECMA语言规范(显然,ECMA语言还有其他要求——我相信toString是另一个例子)。正如您所说,它完全是多余的
方法的valueOf被简单地包括在内,以便ActionScript 3符合ECMA语言规范(显然,ECMA语言还有其他要求——我相信toString是另一个例子)。这里有一个明确的例子
值
与值之比
:
class ArrayIntPointer
{
private var arr:Array;
private var idx:int;
public function ArrayIntPointer(arr:Array,
idx:int)
{
this.arr = arr;
this.idx = idx;
}
public function valueOf():int
{
return arr[idx];
}
public function toString():String { return ""+valueOf(); }
}
Value
=2014年1月2日星期四13:46:51 GMT-0800
(Value
为日期格式)
ValueOf
=1388699211000
(ValueOf
处于原始纪元)这里有一个明确的例子
值
与值之比
:
class ArrayIntPointer
{
private var arr:Array;
private var idx:int;
public function ArrayIntPointer(arr:Array,
idx:int)
{
this.arr = arr;
this.idx = idx;
}
public function valueOf():int
{
return arr[idx];
}
public function toString():String { return ""+valueOf(); }
}
Value
=2014年1月2日星期四13:46:51 GMT-0800
(Value
为日期格式)
ValueOf
=1388699211000
(ValueOf
处于原始纪元)ValueOf
并非无用。它允许对象
为期望。它在和中都可用
如果有人编写了一个接受int的函数,您可以将其传递给对象(更准确地说,它传递对象的valueOf()函数的结果)
1)对象未被传递,因此它只是最外层作用域中的一个对象,2)它是只读操作,无法进行赋值,这削弱了它的实用性
下面是我脑海中几个具体的例子:
示例1:每次读取时自动递增其值的计数器类:
class Counter
{
private var _cnt:int = 0;
public function Counter() { }
public function valueOf():int
{
return _cnt++;
}
public function toString():String { return ""+valueOf(); }
}
用法:
var c:* = new Counter();
trace(c); // 0
trace(c); // 1
trace(2*c+c); // 2*2+3 = 7
trace(c); // 4
var arr:Array = [1, 2, 3, 4, 5];
var int_ptr:* = new ArrayIntPointer(arr, 2);
// int_ptr is a pointer to the third item in the array and
// can be used in place of an int thanks to valueOf()
trace(int_ptr); // 3
var val:int = 2*int_ptr+1;
trace(val); // 7
// but it's still an object with references, so I
// can change the underlying Array, nand now my
// object's primitive (aka, non-Object types) value
// is 50, and it still can be used in place of an int.
arr[2] = 50;
trace(int_ptr); // 50
// you can assign int_ptr, but sadly, this doesn't
// affect the array.
注:
- 我添加了
toString()
传递,因为接受String
的函数更喜欢toString
而不是valueOf
- 您必须将c键入*而不是
计数器
,否则您将得到一个关于将计数器隐式强制为数字的编译器错误
示例2:A(只读)指针类型
假设您有一个int数组,并且希望有一个指向数组中某个元素的引用(也称为指针)。ECMA脚本没有指针,但您可以使用valueOf()模拟指针。
:
用法:
var c:* = new Counter();
trace(c); // 0
trace(c); // 1
trace(2*c+c); // 2*2+3 = 7
trace(c); // 4
var arr:Array = [1, 2, 3, 4, 5];
var int_ptr:* = new ArrayIntPointer(arr, 2);
// int_ptr is a pointer to the third item in the array and
// can be used in place of an int thanks to valueOf()
trace(int_ptr); // 3
var val:int = 2*int_ptr+1;
trace(val); // 7
// but it's still an object with references, so I
// can change the underlying Array, nand now my
// object's primitive (aka, non-Object types) value
// is 50, and it still can be used in place of an int.
arr[2] = 50;
trace(int_ptr); // 50
// you can assign int_ptr, but sadly, this doesn't
// affect the array.
那太圆滑了。如果您可以分配指针并影响数组,这将非常容易,但不幸的是,这是不可能的,因为它会分配int\u ptr
变量。这就是为什么我称之为只读指针。valueOf
并不是无用的。它允许对象
为期望。它在和中都可用
如果有人编写了一个接受int的函数,您可以将其传递给对象(更准确地说,它传递对象的valueOf()函数的结果)
1)对象未被传递,因此它只是最外层作用域中的一个对象,2)它是只读操作,无法进行赋值,这削弱了它的实用性
下面是我脑海中几个具体的例子:
示例1:每次读取时自动递增其值的计数器类:
class Counter
{
private var _cnt:int = 0;
public function Counter() { }
public function valueOf():int
{
return _cnt++;
}
public function toString():String { return ""+valueOf(); }
}
用法:
var c:* = new Counter();
trace(c); // 0
trace(c); // 1
trace(2*c+c); // 2*2+3 = 7
trace(c); // 4
var arr:Array = [1, 2, 3, 4, 5];
var int_ptr:* = new ArrayIntPointer(arr, 2);
// int_ptr is a pointer to the third item in the array and
// can be used in place of an int thanks to valueOf()
trace(int_ptr); // 3
var val:int = 2*int_ptr+1;
trace(val); // 7
// but it's still an object with references, so I
// can change the underlying Array, nand now my
// object's primitive (aka, non-Object types) value
// is 50, and it still can be used in place of an int.
arr[2] = 50;
trace(int_ptr); // 50
// you can assign int_ptr, but sadly, this doesn't
// affect the array.
注:
- 我添加了
toString()
传递,因为接受String
的函数更喜欢toString
而不是valueOf
- 您必须将c键入*而不是
计数器
,否则您将得到一个关于将计数器隐式强制为数字的编译器错误
示例2:A(只读)指针类型
就说你哈