toString方法

数据的转换

所有JS数据类型都拥有valueOf和toString这两个方法,null除外。它们俩解决javascript值运算与显示的问题。

第一个是toString(),它的作用是返回一个相对这个对象的字符串(js值显示)
第二个是valueOf(),它的作用是返回它相应的原始值(js值运算)

toString详解

toString() 详解请参考

进制转换

num1.toString():可以将十进制的num1转换为其他进制
【用法:】num.toString(radix)其中radix就是目标进制的数据。范围[2, 32]

    var a = 32;
    console.log(a.toString(2));  //返回字符串100000(十进制转2进制)
    console.log(a.toString(4));  //返回字符串200(十进制转4进制)
    console.log(a.toString(16));  //返回字符串20(十进制转16进制)
    console.log(a.toString(30));  //返回字符串12(十进制转30进制)
    console.log(a.toString(32));  //返回字符串10(十进制转32进制)

parseInt(num, radix)将radix进制的 num 转换为十进制

【举个栗子】: 将二进制的10001000转换为十六进制数

// 二进制 转 十进制
var num1 = parseIn('10001000', 2)
// 十进制 转 十六进制
var num2 = num1.toString(16)

num.toString(radix)parseInt(num1, radix) 他们的radix的范围都是[2, 32]

toString 判断基本类型

js中的基本类型包括:String、Boolean、 Number、undefined、 null以及es6的 symbol
在这里插入图片描述

toString 判断引用类型

js中的引用类型包括:Object、Function、Array、Date、RegExp、 Error
在这里插入图片描述

Object.prototype.toString()

使用Object.prototype.toString()来进行类型识别,返回代表该对象的[object 数据类型]字符串表示

Object.prototype.toString()可以识别标准类型内置对象类型,但不能识别自定义类型

console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]

console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
function Person(){};
console.log(Object.prototype.toString.call(new Person));//[object Object]

封装写法:

function type(obj){
    return Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
}
console.log(type("jerry"));//"string"
console.log(type(12));//"number"
console.log(type(true));//"boolean"
console.log(type(undefined));//"undefined"
console.log(type(null));//"null"
console.log(type({name: "jerry"}));//"object"

console.log(type(function(){}));//"function"
console.log(type([]));//"array"
console.log(type(new Date));//"date"
console.log(type(/\d/));//"regexp"
function Person(){};
console.log(type(new Person));//"object"

除了类型识别之外,还可以进行其他识别,如识别arguments或DOM元素

(function(){
    console.log(Object.prototype.toString.call(arguments));//[object Arguments]
})()
console.log(Object.prototype.toString.call(document));//[object HTMLDocument]

toString()和valueOf()调用顺序

toString()可以看做是把一个数据转换成了相应字符串的形式
valueOf()则是获取指定对象的原值
【使用小点】:

  1. 在有操作符的情况下:valueOf的优先级 > toString()
  2. 在使用String(obj)强转字符串时优先使用 toString(),使用Number(obj)强转为数字时,优先使用valueOf()

    如果在强转字符传时,没有重写toString方法,但是重写了valueOf方法,此时会优先调用valueOf方法

  3. 在进行对象转换时,优先调用toString方法(两者都没有重写的情况下)

    如果没有重写toString(),但是重写了valueOf()则优先调用valueOf()方法

在这里插入图片描述

Object中的 valueOf和toString调用顺序

对obj进行自增操作,此时valueOf的优先级要高于toString
【两者都没有重写】:调用默认的valueOf() -> toString() -> Number() -> NaN

var obj = {
    i : 3
}
console.log(++obj)
// NaN

【重写valueOf】:优先调用 valueOf, 默认的toString不被调用 即:valueOf() -> Number()

var obj = {
    i : 3,
    valueOf: function(){
        console.log('重写的valueOf')
        return this.i 
    }
}
console.log(++obj)
// 重写的valueOf
// 4

【重写toString】:优先调用 toString, 默认的valueOf不被调用 即:toString()-> Number()

var obj = {
    i : 3,
    toString: function(){
        console.log('重写的toString')
        return this.i 
    }
}
console.log(++obj)
// 重写的toString
// 4

【两者都重写】:优先调用 valueOf, 默认的toString不被调用 即:valueOf() -> toString()-> Number()

var obj = {
    i : 3,
    valueOf: function(){
        console.log('重写的valueOf')
        return this.i 
    },
    toString: function(){
        console.log('重写的toString')
        return this.i 
    }
}
console.log(++obj)
// 重写的valueOf
// 4
  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值