文章目录
ES5中valueOf的介绍
15.2.4.4 Object.prototype.valueOf ( )
When the valueOf method is called, the following steps are taken:
- Let O be the result of calling ToObject passing the this value as the argument.
- If O is the result of calling the Object constructor with a host object (15.2.2.1), then
a. Return either O or another value such as the host object originally passed to the constructor. The >specific result that is returned is implementation-defined.- Return O.
【大致步骤如下】:
-
调用ToObject()方法,并传入this作为参数。
-
针对调用ToObject时传入的不同参数(this),返回值分别如下:
1、this为宿主对象时,返回值取决于浏览器的实现,即不同浏览器的返回可能不同(关于宿主对象,可参考http://www.w3school.com.cn/js/pro_js_object_types.asp)
-
this不是宿主对象,则返回ToObject(this)的值
【ToObject()的返回值类型如下】:
参数类型 | 返回结果 |
---|---|
String | 创建一个String类型的对象,内部的初始值等于传入的参数值 |
Boolean | 创建一个Boolean类型的对象,内部的初始值等于传入的参数值 |
Number | 创建一个Number类型的对象,内部的初始值等于传入的参数值 |
undefined | 抛出TypeError异常 |
null | 抛出TypeError异常 |
Object | 返回传入的参数(无转换) |
语法和返回值
valueOf()
函数用于返回指定对象的原始值。
该方法属于Object对象,由于所有的对象都"继承"了Object的对象实例,因此几乎每个对象都具有该方法,但是各对象返回的值有一定的区别
【语法】:
object.valueOf()
【返回值】:返回指定对象的原始值。
JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此,不同类型对象的valueOf()方法的返回值和返回值类型均可能不同。
obj类型 | Object.prototype.valueOf.call(obj)返回结果 |
---|---|
String | String类型的对象,值等于obj |
Boolean | Boolean类型的对象,值等于obj |
Number | Number类型的对象,值等于obj |
undefined | 抛出TypeError异常 |
null | 抛出TypeError异常 |
Object | obj对象本身 ------- typeOf 返回结果为"object" |
Array | Array自身 ------- typeOf 返回结果为"object" |
Function | 函数本身------- typeOf 返回结果为"function" |
Date | 以毫秒数存储的时间值,从 UTC 1970 年 1 月 1 日午夜开始计算。 |
例子分析
【要知道的】
var str1 = "http://www.baidu.com"
var str2 = new String("http://www.baidu.com")
console.log(typeof str1) // "string"
console.log(typeof str2) // "object"
var b1 = true
var b2 = new Boolean(true)
console.log(typeof b1) // "boolean"
console.log(typeof b2.) // "object"
var n1 = 2
var n2 = new Number(2)
console.log(typeof n1) // "number"
console.log(typeof n2) // "object"
【String】返回String类型的对象,值等于obj
var str1 = "http://www.365mini.com";
console.log( str1.valueOf() === str1 ); // true
// new一个字符串对象
var str2 = new String("http://www.365mini.com");
console.log( str2.valueOf() === str1 ); // false 值相等,类型不等。前者为"object"后者为"string"
str1
是"String"类型,值为 “http://www.365mini.com”
str2
是"object"类型, 值为"http://www.365mini.com"
【boolean】返回Boolean类型对象,值等于obj
var b1 = true
var b2 = new Boolean(true)
console.log(b1.valueOf() == b1) // true
console.log(b2.valueOf() === b1) // false 值相等但是类型不等。前者为"object"后者为"boolean"
b1
是"boolean"类型, 值为true
b2
是"object"类型,值为true
【number】 返回Number类型的对象,值为obj
var n1 = 2
console.log(n1.valueOf() === n1) // true
var n2 = new Number(2)
console.log(n2.valueOf() === n1) // false 数值相等,但是类型不同
n1
是Number类型,值为2
n2
是Object类型, 值为2
【undefined,null】 Uncaught TypeError: Cannot convert undefined or null to object
var unde = undefined;
console.log(Object.prototype.valueOf.call(unde)); //输出:'TypeError: Cannot convert undefined or null to object
var null = null
console.log(Object.prototype.valueOf.call(null)); //输出:'TypeError: Cannot convert undefined or null to object
【object】返回对象本身 且 使用typeof 判断是 Object类型
// Object:返回对象本身
var obj = {
name: "张三",
age: 18
};
console.log( obj.valueOf() === obj ); // true
console.log(typeof obj.valueOf) // "object"
【function】返回函数本身,且使用typeof判断是Function类型(typeof本来就是可以区分function和object类型的数据)
// Function:返回函数本身
function foo1(x, y){
return x+y
}
console.log( foo1.valueOf() === foo1 ); // true
var foo2 = new Function("x", "y", "return x + y;");
console.log( foo2.valueOf() === foo2 ); // true
console.log(typeof foo1) // function
console.log(typeof foo2) // function
console.log(typeof foo1 == typeof foo2) //false 都是应用类型,他们的地址不一样
foo1
是function类型,值为0x99
foo2
是function类型, 值为0x33
【Array】返回Array自身,用typeof 判断是object类型
// Array:返回数组对象本身
var array = ["CodePlayer", true, 12, -5];
console.log( array.valueOf() === array ); // true
cosole.log(typeof array) // object
【Date】返回当前时间距1970年1月1日午夜的毫秒数
var date = new Date(2013, 7, 18, 23, 11, 59, 230);
document.writeln( date.valueOf() ); // 1376838719230
是否有自己的valueof方法
类型 | 是否有自己的valueof方法 |
---|---|
String | 有,String.prototype.valueOf() |
Boolean | 有,Boolean.prototype.valueOf() |
Number | 有,Number.prototype.valueOf() |
Undefined | 无 |
Null | 无 |
Object | - |
因此String、Boolean、Number类型的数据,经过typeOf获取的指定对象的原始值时,返回的是他们自己的ValueOf,而不是直接从Object.prototype上继承下来。对应的返回值分别是:“string”、“boolean”、“number”
不同对象的valueOf方法
Object.prototype.valueOf()
js调用Object.prototype.valueOf()
方法将对象转换为原始值。一般的很少需要我们自己去调用它
默认情况下,valueOf()方法由Object后面的每个对象继承。每个内置的核心对象都会覆盖此方法以放回适当的值
如果对象没有原始值,则返回对象本身
一般的我们可以使用valueof
方法将内置对象转换为原始值。创建自定义对象时,我们可以覆盖Object.prototype.valueof
来调用我们自己的方法,而不是Object
方法
覆盖自定义对象的valueOf
方法
我们可以自己定义一个valueOf
方法,但是注意此方法不可以传入参数
【案例】:我们想要为对象obj
来创建一个valueof()
方法。下面的代码就是为obj
对象创建一个自己的valueOf
方法
obj.prototype.typeOf = function(){
return customPrimitiveValue
}
有了这样的一个方法,下一次每当MyNumberType要被转换为原始类型值时,JavaScript在此之前会自动调用自定义的valueOf()方法。
valueOf()方法一般都会被JavaScript自动调用,但你也可以像下面代码那样自己调用:
obj.valueOf()
String.prototype.valueOf()
【语法】:strObj.valueOf()
【返回值】:表示给定String对象的原始值。该值等同于String.prototype.toString()。
该方法通常在JavaScript内部被调用,而不是在代码里显示调用。
let x = new String('Hello world')
console.log(x.valueOf()) // Hello world
console.log(typeof x.valueOf()) // "string"
Boolean.prototype.valueOf()
语法:bool.valueOf()
返回值: 返回给定Boolean对象的原始值
说明: Boolean的valueOf()方法返回一个Boolean字面量的原始值作为布尔数据类型。该方法通常在JavaScript内部调用,而不是在代码中显示调用。
Number.prototype.valueOf()
语法: numObj.valueOf()
返回值:表示给定Number对象的原始值。
说明:该方法通常在JavaScript内部调用,而不是在代码中显示调用。覆盖Object.prototype.valueOf()方法
Symbol.prototype.valueOf()
语法: Symbol().valueOf()
返回值:返回给定Symbol对象的原始值
说明:Symbol的valueOf()方法返回Symbol对象的原始值作为Symbol数据类型。JavaScript调用valueOf()方法将对象转换为原始值。你很少需要自己调用valueOf()方法。当遇到期望有原始值的对象时,JavaScript会自动调用它。
Date.prototype.valueOf()
【语法】:dateObj.valueOf()
【返回值】:表示给定Date对象的原始值
【说明】:valueOf()方法返回以数值格式表示的一个Date对象的原始值。该值从1970年1月1日0时0分0秒(UTC,即协调世界时)到该日期对象所代表时间的毫秒数。
该方法的功能和Date.prototype.getTime()方法一样。
该方法通常在JavaScript内部调用,而不是在代码中显示调用。
var x = new Date(2018, 1, 12)
var myVar = x.valueOf()
console.log(myVar) // 1518364800000