1、valueOf()、toString()、toNumber()以及toPrimitive()

valueOf:引用类型中除了Date,valueOf()会返回字符串外,其他的都是返回this。

对于常见内置对象:Date, Array, Math, Number, Boolean, String, RegExp, Function的valueOf()

  • 对于Number、Boolean、String,会变成相应的原始值

    var num = new Number('123');
    num.valueOf(); // 123
    var str = new String('12df');
    str.valueOf(); // '12df'
    var bool = new Boolean('fd');
    bool.valueOf(); // true
    
  • Date会转换为日期的毫秒的形式的数值

    var a = new Date();
    a.valueOf(); // 1532234132475
    
  • 其他的都是this,即对象本身

    var a = new Array();
    a.valueOf() === a; 
    // true
    var b = new Object({});
    b.valueOf() === b;
     // true
    

toString:普通对象和Math对象的toString是返回他本身的类型即[object Object/Math],其他都有自己的toString,可返回相对有意义的返回值。

  • Number、Boolean、String、Array、Date、RegExp、Function这几种构造函数生成的对象,通过toString转换后会变成相应的字符串的形式,因为这些构造函数上封装了自己的toString方法。

    Number.prototype.hasOwnProperty('toString'); // true
    Boolean.prototype.hasOwnProperty('toString'); // true
    String.prototype.hasOwnProperty('toString'); // true
    Array.prototype.hasOwnProperty('toString'); // true
    Date.prototype.hasOwnProperty('toString'); // true
    RegExp.prototype.hasOwnProperty('toString'); // true
    Function.prototype.hasOwnProperty('toString'); // true
    var num = new Number('123sd');
    num.toString(); // 'NaN'
    var str = new String('12df');
    str.toString(); // '12df'
    var bool = new Boolean('fd');
    bool.toString(); // 'true'
    var arr = new Array(1,2);
    arr.toString(); // '1,2'
    var d = new Date();
    d.toString(); // "Sun Jul 22 2018 12:38:42 GMT+0800 (中国标准时间)"
    var func = function () {}
    func.toString(); // "function () {}"
    
  • 其他(例如Object,Math)都是返回该对象的类型。

    var obj = new Object({});
    obj.toString(); // "[object Object]"
    Math.toString(); // "[object Math]"
    

toString

类型 转换后结果
undefined "undefined"
null "null"
boolean "true" / "false"
number 数值类型的字符串
Array (本质上也是object) [] 全部去掉,剩下的元素用','隔开的字符串
object 根据 valueOf / toString

只有普通Object和Math对象没有自己的toString,所以返回的是"[object Object]"这样子的。

其他的话,返回的是有意义的结果。

toNumber

类型 转换后结果
undefined NaN
null 0
boolean 0 / 1
number 本身
String 空串和空格=0,数值型字符串=数值,普通字符串=NaN
object 无(貌似)
  • 不同类型进行+ - * / ==会先转化为数字类型,在运算。
  • +不仅是算数运算符,也可以是字符串拼接,当字符串不是纯数字时会进行拼接。
  • 比较特殊的是:null == undefined。要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,并且规定null 和 undefined 是相等的。null 和 undefined都代表着无效的值。
  • ==在比较的时候先转换数据类型,若等式两边数据类型不相同,将会往数值类型方向转换后再进行比较
  • ==两边都是对象时,比较的是他们的地址

当我们进行强转时,发生了什么?

在JavaScript中,如果想要将对象转换成基本类型时,也就是所谓的拆箱时,会调用toPrimitive()。

toPrimitive(input,preferedType?) // 输入值,期望转换的类型
toPrimitive

preferedType为空时,日期会被认为是字符串,而其他的值会被当做Number。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容