Actionscript 3 使用valueOf()函数有什么用?

Actionscript 3 使用valueOf()函数有什么用?,actionscript-3,Actionscript 3,为什么valueOf()函数出现在AS3中的所有内容中?我想不出一个例子,当这不是多余的。在获取值方面,x和x.valueOf()对我来说是完全相同的(除了可能需要更多的CPU周期)。此外,即使它们在设置某些内容方面可能不相同,x.valueOf()=y(即使合法)也完全没有意义 我有信心,虽然这是一个原因,我只是没有看到这里。这是怎么一回事?我确实试过用谷歌搜索一分钟。谢谢 返回指定对象的基元值。如果此对象没有 原语值,则返回对象本身 资料来源:Adobe AS3参考 编辑: 原语值可以是数字

为什么valueOf()函数出现在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(只读)指针类型

就说你哈