为什么valueOf()函数存在于AS3中的所有内容中?当这不是多余的时候,我想不出一个实例。在获取值方面,x
和x.valueOf()
对我来说完全相同(除了可能需要更多CPU周期)。此外,即使在设置某些内容方面它们可能不一样,x.valueOf() = y
(即使是合法的)也完全没有意义。
我有信心,因为这是因为我没有看到的原因。它是什么?我确实尝试了谷歌搜索一分钟。谢谢!
答案 0 :(得分:2)
正如你所说,它完全是多余的。
简单地包含了valueOf方法,以便ActionScript 3符合ECMA语言规范(显然还有其他要求是ECMA语言 - 我相信toString是另一个例子)。
答案 1 :(得分:1)
返回指定对象的原始值。如果这个对象没有 原始值,返回对象本身。
来源:Adobe AS3参考http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Object.html#valueOf()
编辑:
原始值可以是Number,int,bool等......它们只是值。对象可以具有属性,方法等。
在我看来最大的区别是:
primitive2 = primitive1;
在此示例中,基元2包含基元1中的数据副本。
obj2 = obj1;
然而,在这一个中,ob2指向与obj1相同的对象。修改obj1或obj2,它们都反映了变化,因为它们是引用。
简而言之,当您想要查看对象的原始表示(如果存在)而不是对象本身时,将使用valueOf。
答案 2 :(得分:1)
这是
之间的明显例子 Value
与ValueOf
:
Value
= Thu Jan 2 13:46:51 GMT-0800 2014
(value
为日期格式化)
ValueOf
= 1388699211000
(valueOf
在原始时代)
答案 3 :(得分:1)
valueOf
没用。它允许Object
为期望primitive type的表达式提供值。它可以在AS3以及JavaScript中找到。
如果有人编写了一个带有int的函数,你可以将它传递给你的对象(更准确地说,它会传递你对象的valueOf()
函数的结果。)
有用性受到以下因素的影响:1)对象未被传递,因此它只是最外层范围内的对象,以及2)它是只读的这一事实操作,不能进行任务。
这里有几个具体的例子:
示例1 一个Counter
类,每次读取时自动递增其值:
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
注意:
toString()
传递,因为String
的功能比toString
更喜欢valueOf
。Counter
,否则您将收到有关Counter对数字的隐式强制的编译错误。示例2: A(只读)指针类型
假设您有一个int数组,并且您希望对数组中的元素有一个引用(也就是指针)。 ECMA脚本没有指针,但您可以使用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(); }
}
用法:
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_ptr
变量。这就是为什么我把它称为只读指针。