Javascript中时间对象隐式转换原始值的规则问题

JavaScript012

Javascript中时间对象隐式转换原始值的规则问题,第1张

var now=new Date()

alert(typeof(now + 1))// 调用now.toString(),然后与1拼接,这时就成字符串了,所以alert是string

这里有个示例:

var now=new Date()

// 改写now对象的toString(),返回一个number类型的

now.toString=function(){

return 2

}

alert(typeof(now + 1))// number类型相加,也是number类型的,所以alert是number

在JavaScript中,加号不仅表示相加还表示字符串连接

当加号两边存在字符串时,加号代表连接,实际上是将两侧都转为了字符串,如

"1" + 1 = "11"

而当加号两侧都是数字的时候,则表示两个数相加,如

1 + 1 = 2

这是JavaScript中的隐式类型转换

显式的类型转换我们都知道,比如to_a、to_s、to_i方法,显示转化一般用于这样的情形: 源类型和目标类型很大程度上不相关或毫无关联

那么,隐式类型转换是什么呢?

隐式类型转换适用于源类型和目标类型很详尽的情形

ruby核心库和标准库大量使用了隐式类型转换,标准类型转换方法如下:

注:隐式、显式方法目标类都已实现

有了这些方法,我们的有些参数检查就不必使用,可以使用隐式方法代替参数检查

eg

一些首字母大写的强制类型转换方法会调用 这些隐式转换方法,如:Array(),Integer(),String()等,但是这些方法处理逻辑并不一致,有的会有限调用隐式方法、无隐式方法时再调用显式方法,有的是直接调用显式方法;具体情况还要看ruby官网文档

eg: