有valueOf()函数有什么用?

时间:2013-08-02 14:31:50

标签: actionscript-3

为什么valueOf()函数存在于AS3中的所有内容中?当这不是多余的时候,我想不出一个实例。在获取值方面,xx.valueOf()对我来说完全相同(除了可能需要更多CPU周期)。此外,即使在设置某些内容方面它们可能不一样,x.valueOf() = y(即使是合法的)也完全没有意义。

我有信心,因为这是因为我没有看到的原因。它是什么?我确实尝试了谷歌搜索一分钟。谢谢!

4 个答案:

答案 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)

这是

之间的明显例子

ValueValueOf

Value = Thu Jan 2 13:46:51 GMT-0800 2014value为日期格式化)

ValueOf = 1388699211000valueOf在原始时代)

答案 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
  • 您必须输入c作为*而不是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变量。这就是为什么我把它称为只读指针。