
1、toString方法简介
除 undefined 和 null 以外的其他所有制都有toString()方法
返回的结果通常与String()函数返回的结果相同(
结果参考上面表格)
//Number类的toString(n) :可选参数
(17).toString(2) ===> "10001"
//Array类的toString() :将每个元素转为字符串,用逗号拼接
["a", "b", "c"].toString() ===> "a,b,c"
//Function类的toString() :返回源代码的字符串
(function () { f(x) }).toString() ===> "function () { f(x) }"
//Date类的toString() :返回js可解析的日期和时间字符串
(new Date()).toString() === > "Mon May 31 2019 16:36:34 GMT+0800 (中国标准时间)"
//RegExp类的toString() :返回一个看起来像RegExp的字面量的字符串
(/\d+/g).toString()  ===> "/\\d+/g"
复制代码2、显示转换
Boolean(val)
只有val为
undefined、unll、0、null、""、false结果为false
其他任何值都为true
String( val )
String( Obj )
- 1、先调用toSring方法( 会查找原型 )
- 如果返回原始值:直接使用Number进行包装返回值
- 如果返回对象:继续调用valueOf方法
 
- 2、调用valueOf方法( 会查找原型 )
- 如果返回原始值:直接使用Number进行包装返回值
- 如果返回对象:报错
 
var obj = {
    toString(){
        return 888;
    },
    valueOf(){
        return 999;
    }
}
//toString返回原始值:888
//直接调用:String(888)
String(obj )//"888"
复制代码var obj = {
    toString(){
        return {};
    },
    valueOf(){
        return 999;
    }
}
//toString返回对象,继续调用valueOf({})方法
//valueOf返回原始值
//最后调用:String(999)
String(obj )//"999"
复制代码var obj = {
    toString(){
        return {};
    },
    valueOf(){
        return {};//返回任意对象,直接报错
    }
}
//toString返回对象,继续调用valueOf({})方法
//valueOf返回对象,返回任意对象,直接报错
String(obj)//报错
复制代码var obj = {
    valueOf(){//不会被调用
        //原型上的toString方法已经返回toString字符串;不会继续调用valueOf方法
        return 999;
    }
}
String(obj)//888
//toString方法,obj不存在
//查找原型上方法toString,返回 "[object Object]"
//最后调用:String("[object Object]")
String(obj)//"[object Object]"
复制代码var obj = {
    toString(){
        return {};
    }
}
//toString方法,返回 {}
//obj上不存在valueOf方法,
//查找原型,返回obj对象,报错
String(obj)//报错
复制代码String( Array )
- “解套、平铺”
- 将数组的每个元素转换为字符串,然后再用逗号拼接
String([])  //""
String([" "])  //" "
String([123])  //"123"
String(["123"])  //"123"
String(["123","456"])  //"123,456"
String(["123","456",["789","111"]])  //"123,456,789,111"
String(["123","456",{}])  //"123,456,[object Object]"
复制代码Numbe( val )
Numbe(Obj):步骤( [valueOf ]==> [ toString] ==> Number )
- 1、先调用valueOf方法( 会查找原型 )
- 如果返回原始值:直接使用Number进行包装返回值
- 如果返回对象:继续调用toString方法
 
- 2、调用toSring方法( 会查找原型 )
- 如果返回原始值:直接使用Number进行包装返回值
- 如果返回对象:报错
 
var obj = {
    toString(){
        return 888;
    },
    valueOf(){
        return 999;
    }
}
//valueOf返回原始值:888
//不用再调toString方法
//最后调用 Number(999)
Number(obj)//999
复制代码var obj = {
    toString(){
        return 888;
    },
    valueOf(){
        return {};
    }
}
//valueOf返回对象:{},继续调用toString方法
//调用obj上的toString({})方法,返回原始值:888
//最后调用 Number(888)
Number(obj)//888
复制代码var obj = {
    toString(){
        return {};//返回任意对象,最终都会报错
    },
    valueOf(){
        return {};
    }
}
//valueOf返回对象:{},继续调用toString方法
//调用obj上的toString({})方法,返回 {} ( 返回任意对象直接报错)
Number(obj)//报错
复制代码var obj = {
    valueOf(){
        return {};
    }
}
//valueOf返回对象:{},会继续调用toString方法
//obj上没有toString方法
//会去原型上找toStirng({})方法,且返回"[object Object]"
//最后调用 Number("[object Object]")
Number(obj)//NaN
复制代码var obj = {
    toString(){
        return {};
    }
}
//obj没有valueOf方法,会去原型上找valueOf方法,返回值为:对象,
//继续调用toString(对象)方法
//valueOf返回:{}  //直接报错
Number(obj)//Cannot convert object to primitive value
复制代码Numbe( Array )
- 在String()的基础上,做了Number()包装
Number([])  //0
Number([" "])  //0
Number([123])  //123
Number(["123"])  //123
Number(["123","456"])  //NaN
Number(["123","456",["789","111"]])  //NaN
Number(["123","456",{}])  //NaN
复制代码与Numbe相关的
console.log(Number("  123"));//123
console.log(Number(".123"));//0.123
console.log(Number("abc"));//NaN
console.log(Number("abc123"));//NaN
console.log(Number("1  2"));//NaN
//parseInt方法就是弥补Number方法的不足
console.log(parseInt("  123"));//123
console.log(parseInt(".123"));//0.123
console.log(parseInt("4.123"));//NaN
console.log(parseInt("abc"));//4
console.log(parseInt("abc123"));//NaN
console.log(parseInt("123abc"));//NaN
console.log(parseInt("1  2"));//1
//parseInt的第二个参数为:转为几进制 (2 - 36)
console.log(parseInt("11",0));//11
console.log(parseInt("11"));//11
console.log(parseInt("11",3));//4
console.log(parseInt("11",8));//9
console.log(parseInt("11",10));//11
console.log(parseInt("11",null));//11
console.log(parseInt("11",undefined));//11
console.log(parseInt("11",1));//1
console.log(parseInt("11",-1));//1
console.log(parseInt("11",37));//1
复制代码3、隐式转换
Boolean类型的隐式转换
– 常见的Boolean隐式转换类型操作:
if、for、while、&& 、 || 、!、!!、?. 、switch
只有val为
undefined、unll、0、null、""、false时,判断条件为false,其他都为true
String类型的隐式转换
- "" + val
Number类型的隐式转换
数学运算符:+ 、- 、 * 、% 、& 、|、 ++ 、 — 、+val
var a = 123;
console.log( a & 1)
console.log( a | 1)
console.log( a ^ 1)
console.log( a & 1)
console.log( a >> 1)
console.log( a << 1)
console.log( a ^ 1)
复制代码比较运算符( 默认使用Number转换 ):==、===、!==、>=、<=、<、>
- 特例:undefined、null这两个值跟其它的任何值都不等( 全为false)
//原始值可以使用number进行转
console.log(undefined == null) //true
console.log(NaN == NaN )  //false
console.log(1 == true) //true
console.log("1" == true)//true
console.log("1" == 1)//true
//对象的对比处理
console.log([1] == 1)//true
console.log([1] == true)//true
console.log([] == false)//true
console.log([] == null)//false  //特例
console.log(Number([1,2]) == NaN)//true
//[]为0   ![]为false即为0
console.log( [] == ![])//true
console.log( [] == !{})//true
//{}为NaN      !{}为0
console.log({} == !{})//false
复制代码© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
    





















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
