详解JS数据类型转换

版权声明:本文为博主原创文章,评论区告知一声,大家随意转载! https://blog.csdn.net/MessageBox_/article/details/82592082

数据类型分类

  1. 基本数据类型
    Number | String | Boolean | Null | Undefined | Symbol

  2. 复合数据类型
    Object

数据类型转换

1. 显示类型转换
Number() | String() | Boolean()
1-1. Number()

  • 基本数据类型
    
Number(123);  //123  
Number('123'); //123  
Number('123a'); //NaN  
Number('abc'); //NaN  
Number(true); //1  
Number(false); //0  
Number(null); //0  
Number(undefined); //NaN  
Number(NaN); //NaN  
Number(''); //0  
Number('  '); //0

Number在进行字符串转数字时,相当于先调用trim,再进行Number的转换。

  • 复合数据类型

复合类型的Number强制转换,会先调用其本身的valueOf方法,这个方法默认会返回其本身,如果改写了这个方法,且其返回值是基本类型,则直接对返回值进行Number强制转换,如果返回值是复合类型,则再调用对象的toString方法,如果toString方法的返回值是基本类型,则对该方法的返回值调用Number方法,否则报错。

var a = {  s: 1, valueOf: ()=>{return 3} };
Number(a); //3 
var b = {};
Number(b); // NaN
var c = {s:1, toString:()=>{ return ' 123'}};
Number(c); //123

2-1. String()

  • 基本数据类型
String(123); //"123"  
String('123a'); //"123a"  
String(true); //"true"  
String(false); //"false"  
String(null);  //"null"  
String(undefined); //"undefined"  
String(NaN); //"NaN"  
  • 复合数据类型

复合类型的String强制转换,会先调用其本身的toString方法,这个方法默认会返回的是一个字符串,如果改写了这个方法,且其返回值是基本类型,则直接对返回值进行String强制转换,如果返回值是复合类型,则再调用对象的valueOf方法,如果valueOf方法的返回值是基本类型,则对该方法的返回值调用String方法,否则报错。

var a = {
	toString:function(){
		return 11;
	},
	valueOf:function(){
		return 22;
	},
	t:3
};
String(a);//11
Number(a);//22

默认的toString的转换如下

Object.prototype.toString.call(2);  //"[object Number]"  
Object.prototype.toString.call('abs');//"[object String]"
Object.prototype.toString.call(true); //"[object Boolean]"  
Object.prototype.toString.call(null); //"[object Null]"  
Object.prototype.toString.call(undefined);//"[object Undefined]"  
Object.prototype.toString.call(NaN);//"[object Number]"  
Object.prototype.toString.call( ()=>{} );//"[object Function]"  
Object.prototype.toString.call( [] );//"[object Array]"  
// HTML DOM 节点
var eles = document.getElementsByTagName("body");
document.writeln( eles.toString() ); // [object HTMLCollection]
document.writeln( eles[0].toString() ); // [object HTMLBodyElement]

所以这个toString方法是不是很强大,但是有一点是需要注意的,ArrayDate对象的toString方法是重写了的。
var a = [1,2,3]; a.toString(); //1,2,3

3-1. Boolean()

  • true
Boolean(1); //除零的任意数字  
Boolean(' ');//除''的任意其他字符  
Boolean([]); //任意对象都为真
Boolean({});
Boolean(-1);//true	          
  • false
Boolean(0);  
Boolean('');  
Boolean(null);  
Boolean(undefined);  
Boolean(NaN);  

2. 隐式类型转换

  1. 数学运算
    "+" 有一个Strings时,将表达式的值转换为String
    "-" 将表达式的值转换为Number

  2. if条件
    被隐式转换为boolean

  3. "=="不严格比较
    任意两种类型比较时,如果不是同一个类型比较的话,则按如下方式进行转换比较
    对象 => 字符串 => 数值 数值 <= 布尔值

猜你喜欢

转载自blog.csdn.net/MessageBox_/article/details/82592082