valueOf

ES5中valueOf的介绍

15.2.4.4 Object.prototype.valueOf ( )
When the valueOf method is called, the following steps are taken:

  1. Let O be the result of calling ToObject passing the this value as the argument.
  2. 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.
  3. Return O.

【大致步骤如下】:

  1. 调用ToObject()方法,并传入this作为参数。

  2. 针对调用ToObject时传入的不同参数(this),返回值分别如下:

    1、this为宿主对象时,返回值取决于浏览器的实现,即不同浏览器的返回可能不同(关于宿主对象,可参考http://www.w3school.com.cn/js/pro_js_object_types.asp)

  3. this不是宿主对象,则返回ToObject(this)的值

【ToObject()的返回值类型如下】:

参数类型返回结果
String创建一个String类型的对象,内部的初始值等于传入的参数值
Boolean创建一个Boolean类型的对象,内部的初始值等于传入的参数值
Number创建一个Number类型的对象,内部的初始值等于传入的参数值
undefined抛出TypeError异常
null抛出TypeError异常
Object返回传入的参数(无转换

语法和返回值

valueOf()函数用于返回指定对象的原始值。

该方法属于Object对象,由于所有的对象都"继承"了Object的对象实例,因此几乎每个对象都具有该方法,但是各对象返回的值有一定的区别

在这里插入图片描述

toString的用法请点我

【语法】:

object.valueOf()

【返回值】:返回指定对象的原始值。

JavaScript的许多内置对象都重写了该函数,以实现更适合自身的功能需要。因此,不同类型对象的valueOf()方法的返回值和返回值类型均可能不同。

obj类型Object.prototype.valueOf.call(obj)返回结果
StringString类型的对象,值等于obj
BooleanBoolean类型的对象,值等于obj
NumberNumber类型的对象,值等于obj
undefined抛出TypeError异常
null抛出TypeError异常
Objectobj对象本身 ------- typeOf 返回结果为"object"
ArrayArray自身 ------- 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值