javascript对象类型转换

Object类型

除基本数据类型以外的全部类型都为Object类型。

toString方法

toString方法通常返回一个反映这个对象的字符串
//通常对象
  var obj = {name:'jack',age:18};
  console.log(typeof obj.toString(),obj.toString());
  //数组
  var arr = ['zero','one','two'];
  console.log(typeof arr.toString(),arr.toString());
  //函数
  var fun = function(a,b){ return a+b; };
  console.log(typeof fun.toString(),fun.toString());
  //正则表达式
  var reg = /\s+/;
  console.log(typeof reg.toString(),reg.toString());
  //日期
  var d = new Date();
  console.log(typeof d.toString(),d.toString());

测试结果
输入图片说明正则表达式

valueOf方法

通常默认返回对象自己,Date类重写了valueOf方法,其返回1970年1月1日以来的毫秒数
var obj = {name:'jack',age:18};
  console.log(typeof obj.valueOf(),obj.valueOf());
  //数组
  var arr = ['zero','one','two'];
  console.log(typeof arr.valueOf(),arr.valueOf());
  //函数
  var fun = function(a,b){ return a+b; };
  console.log(typeof fun.valueOf(),fun.valueOf());
  //正则表达式
  var reg = /\s+/;
  console.log(typeof reg.valueOf(),reg.valueOf());
  //日期
  var d = new Date();
  console.log(typeof d.valueOf(),d.valueOf());

测试结果
输入图片说明数组

转换为字符串

这里的转换指的是显示类型转换,转换步骤为:函数

  1. 对象转换为字符串时会优先调用toString方法,若是toString方法返回一个原始值,则将该值转换为字符串
  2. 若是toString方法不返会原始值,则调用valueOf方法,若是valueOf方法返回原始值,则将该值转换为字符串
  3. 若是valueOf方法也不返回原始值,则抛出类型错误异常 转换步骤测试:
//test1的toString方法返回字符串'toString',valueOf方法返回字符串'valueof'
  var test1 = {
    toString:function() {
      console.log('调用了toString方法');
      return 'tostring';
    },
      valueOf:function() {
        console.log('调用了valueOf方法');
        return 'valueof';
      }
  };
  console.log(String(test1));

测试结果
输入图片说明
能够看到这里优先调用了toString方法,返回了'tostring'测试

//test2的toString方法返回对象{},valueOf方法返回字符串'valueof'
  var test2 = {
    toString:function() {
      console.log('调用了toString方法');
      return {};
    },
    valueOf:function() {
      console.log('调用了valueOf方法');
      return 'valueof';
    }
  };
  console.log(String(test2));

测试结果:
输入图片说明
能够看到这里先调用了toString方法,因为toString方法返回对象,接着又调用了valueOf方法,返回了'valueof' 。code

//test3的toString方法和valueOf方法均返回对象
  var test3 = {
    toString:function() {
      console.log('调用了toString方法');
      return {};
    },
    valueOf:function() {
      console.log('调用了valueOf方法');
      return {};
    }
  };
  console.log(String(test3));

测试结果:
输入图片说明
这里有与toString方法和valueOf方法均不返回原始值,因而抛出类型错误异常对象

转换为数字

这里的转换一样指的是显示类型转换,转换步骤为:图片

  1. 对象转换为数字时会优先调用valueOf方法,若是valueOf方法返回一个原始值,则将该值转换为数字
  2. 若是valueOf方法不返会原始值,则调用toString方法,若是toString方法返回原始值,则将该值转换为数字
  3. 若是toString方法不返回原始值,则抛出类型错误异常。

转换步骤测试:字符串

//这里test1的valueOf方法返回'123',toString方法返回'456'
  var test1 = {
    toString:function() {
      console.log('调用了toString方法');
      return '456';
    },
    valueOf:function() {
      console.log('调用了valueof方法');
      return '123';
    }
  };
  console.log(Number(test1));

测试结果:
输入图片说明
能够看到test1先调用的valueOf方法,返回'123',并将'123',转换为了数字123string

//这里test2的valueOf方法返回对象{},toString方法返回'456'
  var test2 = {
    toString:function() {
      console.log('调用了toString方法');
      return '456';
    },
    valueOf:function() {
      console.log('调用了valueOf方法');
      return {};
    }
  };
  console.log(Number(test2));

测试结果:
输入图片说明
能够看到test2先调用的valueOf方法,因为其返回的是一个对象,紧接着又调用了toString方法,返回'456',并将'456',转换为了数字456it

//这里test3的valueOf方法返回对象{}和toString方法返回对象{}
  var test3 = {
    toString:function() {
      console.log('调用了toString方法');
      return {};
    },
    valueOf:function() {
      console.log('调用了valueOf方法');
      return {};
    }
  };
  console.log(Number(test3));

测试结果:
输入图片说明
能够看到test3先调用的valueOf方法和toString方法均返回对象,抛出类型错误异常

转换为布尔值

Boolean(obj) => true

几个特殊的转换

- Number([])  => 0  
  这里[]先调用其valueOf方法,因为返回对象[],而后调用toString方法,返回'',再将''转换为数字0。
- Number([9])  => 9
  这里[9]先调用其valueOf方法,因为返回对象[9],而后调用toString方法,返回'9',再将'9'转换为数字0。
- Number(['a']) => NaN
  这里['a']先调用其valueOf方法,因为返回对象['a'],而后调用toString方法,返回'a',再将'a'转换为数字NaN。
相关文章
相关标签/搜索