Web | JavaScript的引用数据类型强制转换类型

我在这里主要的想提下的是JavaScript中的引用类型进行强制转换类型.因为对于基本数据类型的变换大多都是雷同的,很容易熟知,但是引用数据类型有一点小插曲.

JavaScript的引用类型主要为对象,数组和函数.主要针对的是对对象和数组进行转换.而转换又包括两种方式,即显式和隐式转换.

显式强制类型转换

首先我们需要一些基本的规则.

基本类型的字符串化规则:

  • null ==> 'null'
  • true ==>'true' ,false ==> 'false'
  • undefined ==> 'undefined'
  • 数字也是自身字符串化,1 ==> '1'

基本类型的数字化规则:

  • null ==> 0
  • undefined ==> NaN
  • true ==> 1, false ==> 0
  • 字符串会拆开引号,看它是否是数字,是则输出数字,否则输出NaN.如果是空字符串,则会转成0.

不同类型对象的valueof规则:

对象 ==>对象本身

Boolean ==> 布尔值

Number ==> 数字值

String ==> 字符串值

Array ==> 返回数组对象本身

Date ==> 距离1970的毫秒数

Function ==> 函数本身

Math和Error没有valueof方法

通过构造String()化

首先,会调用引用数据类型的tostring()方法,会看该方法是否会返回基本数据类型,如果是就使用.如果不是就会调用valueof方法,返回基本数据类型就使用,如果不是则会报错.

		//通过复写其系统方法来观察
		// obj,对象
		Object.prototype.toString=function () {
            return  [];
        }
        Object.prototype.valueOf=function () {
            return  456;
        }
       var obj = {
           name:"Jan",
           age:18
       }
        // obj.toString()  ---> obj.valueOf()
       var res = String(obj);
       console.log(typeof res,res);//string '456'

		// 数组
		 Array.prototype.toString=function () {

        }
        Array.prototype.valueOf=function () {
            return  123;
        }
       var arr =[1,2,3,4];
       var res = String(arr);
       console.log(typeof res,res);//string undefined

通过构造Number()化

首先,会调用引用数据类型的valueof()方法,会看该方法是否会返回基本数据类型,如果是就使用.如果不是就会调用tostring()方法,返回基本数据类型就使用,如果不是则会报错.

	//对数组和对象进行number化
	var arr = [1,2,3];
    var res = Number(arr); //tostring==>1,2,3
    console.log(typeof res,res);//number NaN

    Object.prototype.valueOf=function(){
        return "    12345     ";
    }
    var obj ={};
    var res = Number(obj);
    console.log(typeof res,res);//number 12345

    var res = +obj;
    console.log(typeof res,res);//number 12345

只有Number()和'+'正号才能激发显式number化.

另外提下toPrimitive,它是引用数据类型转基本数据类型.都是先回调用valueof方法,然后才调用tostring方法.

隐式强制类型转换

隐式转换一般是'+'符号触发,还有逻辑判断触发

    //如果某个操作数是字符串  + 将进行拼接操作
    //遇到对象 则ToPrimitive()

    Array.prototype.valueOf=function(){
        return "1";
    }
    Array.prototype.toString=function(){
        return false;
    }
    console.log([] + 1); //'11'
(1)  if (..) 语句中的条件判断表达式。
(2)  for ( .. ; .. ; .. ) 语句中的条件判断表达式(第二个)。
(3)  while (..) 和 do..while(..) 循环中的条件判断表达式。
(4)  ? : 中的条件判断表达式。
(5)  逻辑运算符 || (逻辑或)和 && (逻辑与)左边的操作数(作为条件判断表达式)
原文地址:https://www.cnblogs.com/JanChuJun/p/10140933.html