今天发现一个神奇的现象,效果如下:

valueOf()的机制

Date返回的是一串字符串,但是当我们把这个字符串和一个数字相减的时候,结果却变成了一串数字,也就是Date在和数字相减的时候,数据类型发生了转换,转换成了数字,js语言本身在运算符进行加减乘除的时候,也是会做预处理的,会根据运算符的不同,把数据类型转成想要的类型,比如true+1的结果是2,针对如上的现象,我做了深入的研究,发现Date转换成数字是因为它在和数字进行相减之前,默认调用了valueOf函数,我们可以来测试Array,Date,Object,Function各个类型的数据调用valueOf返回值是什么。

1.数组

valueOf()的机制

数组的valueOf返回的是一个对象,也是原对象本身。

2.Date

valueOf()的机制

DatevalueOf的返回值是时间的毫秒数。

3.Number

valueOf()的机制

NumbervalueOf返回的是对应的number类型的值。

4.Boolean

valueOf()的机制

BooleanvalueOf返回的是一个boolean类型的值。

5.Object

valueOf()的机制

ObjectvalueOf返回的是一个Object对象。也是原对象本身。

6.Function

valueOf()的机制

FunctionvalueOf返回的是一个Function对象。也是原对象本身。

我们也可以自定义一个valueOf函数来覆盖之前默认调用的valueOf函数,测试如下:

valueOf()的机制

在未自定义valueOf之前,obj+"--name"。返回的是[object object]--name,自定义以后,obj+"--name"返回’gby–name’,这证明了,我们成功覆盖了原来的valueOf。也同时证明了js语言在进行运算的时候,会对不是原始数据类型的数据,进行一定的处理。此时想到之前有遇到过,js 会在某些时候自动调用 toString 方法,那什么时候调用valueOf,什么时候调用toString,我们可以测试一下,假如当自定义valueOf返回的不是一个原始数据类型时会是什么结果:

valueOf()的机制

我们看到,当自定义valueOf返回一个对象,同时自定义toString方法,返回一个原始数据类型-字符串时,对象obj在进行js运算的时候,是先调用valueOf这个函数,之后又调用了自定义的toString函数。这是一个神奇的发现,通过测试,我们能更懂得js语言设计的巧妙之处。

相关文章:

  • 2021-09-24
  • 2021-06-13
  • 2021-11-30
  • 2022-02-22
  • 2022-12-23
  • 2022-12-23
  • 2021-12-05
猜你喜欢
  • 2022-12-23
  • 2021-11-02
  • 2021-08-31
  • 2022-01-05
  • 2022-12-23
  • 2021-04-18
  • 2021-11-04
相关资源
相似解决方案