首页 > 语言 > JavaScript > 正文

JS中令人发指的valueOf方法介绍

2024-05-06 14:19:32
字体:
来源:转载
供稿:网友
彭老湿近期月报里提到了valueOf方法,兴致来了翻了下ECMA5里关于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.
规范里面的对于valueOf的解释很短,大致为:调用ToObject方法(一个抽象方法,后面会讲到),并将this的值作为参数传入。

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

1、this为宿主对象时,返回值取决于浏览器的实现,即不同浏览器的返回可能不同(关于宿主对象,可参考http://www.w3school.com.cn/js/pro_js_object_types.asp)
2、this不是宿主对象,则返回ToObject(this)的值 
参数类型  返回结果
Undefined抛出TypeError异常
Null抛出TypeError异常
Number创建一个Number对象,它内部的初始值为传入的参数值
String创建一个String对象,它内部的初始值为传入的参数值
Boolean创建一个Boolean对象,它内部的初始值为传入的参数值
Object返回传入的参数(无转换)

根据Object.prototype.valueOf的定义,以及抽象方法ToObject的描述,可得下表 
obj类型  Object.prototype.valueOf.call(obj)返回结果
Undefined抛出TypeError异常
Null抛出TypeError异常
NumberNumber类型的对象,值等于obj
StringString类型的对象,值等于obj
BooleanBoolean类型的对象,值等于obj
Objectobj对象本身

举几个具体的例子:
代码如下:
var num = 123;
console.log(num.valueOf()); //输出:123
console.log(num.valueOf()); //输出:'number'

var unde = undefined;
console.log(Object.prototype.valueOf.call(unde)); //输出:'TypeError: Cannot convert null to object'

var obj = {name:'casper'};
var linkObj = obj.valueOf();
linkObj.name = 'change';
console.log(linkObj.name); //输出:'change' ...说明obj.valueOf()返回的是对象自身

实际上,上面没有提到Array、Function对象,根据下面代码可以猜想,当Object.prototype.valueOf调用时,参数为Array、Function类型的对象时,返回的结果也为对象自身:
代码如下:
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选