利用原型链顶端toString和typeof方法区分原始值,引用值以及包装类的值

    技术2022-07-11  97

    原始值的类型有

    number,string,boolean,undefined,null

    常用的引用值类型有:

    Arrray ,Object,Function

    typeof能返回的值类型:

    number,string,boolean,undefined,object,function

    从上我们可以知道,用typeof()判断原始值,对应返回的就是唯一的原始值(null除外)

    console.log(typeof(123)); // 'number' console.log(typeof('123')) // 'string' console.log(typeof(true)) // 'boolean' console.log(typeof(undefined)) //'undefined' console.log(typeof(null)) // 'object'

    对于引用值Array,Object和包装类(new Number() ,new String() ,new Boolean)用typeof进行判断,则都返回的object

    console.log(typeof([]) // 'object' console.log(typeof({}) // 'object' console.log(typeof(new Number())) //'object' console.log(typeof(new String())) //'object' console.log(typeof(new Boolean())) //'object'

    如何区分这些返回值都为object的值的类型 此时,需要用到原型链上的toString方法

    首先先介绍一下toString()方法:这是原型链最顶端object默认的一个方法,任何对象都能从自己的原型链上继承该方法。

    Object.prototype.toString()

    包装类的原型链顶端也是object,但包装类自身就有toString()方法,故由构造出来的对象向沿着原型链找toString方法时,找到的是包装类的方法,不会找到原型链的的顶端

    var num = new Number(123); console.log(new num.toString()) //'123'

    当使用原型链顶端的toString方法时,就能区分出不同中值的类型(需用到call来改变this指向)

    var num = new Number(123); var objStr = Object.prototype.toString console.log(objStr.call(num)) //"[object Number]" var str = new String('123'); var objStr = Object.prototype.toString console.log(objStr.call(num)) //"[object String]" var str = new Boolean(); var objStr = Object.prototype.toString console.log(objStr.call(num)) //"[object Boolean]" var arr =[]; var objStr = Object.prototype.toString console.log(objStr.call(arr)) //"[object Array]" var obj ={}; var objStr = Object.prototype.toString console.log(objStr.call(obj)) //"[object Object]"

    所以可以封装一个type函数来区分不同种类型的值

    所以可以封装一个type函数来区分不同种类型的值 function disType(target) { // 一下typeof()返回的都是object var template = { '[object Array]': "array", '[object Object]': "object", '[object Number]': " number - object", '[object String]': "string - object", '[object Boolean]': "boolean - object" } if (target === null) { return null; } if (typeof (target) == 'object') { var str = Object.prototype.toString.call(target); return template[str]; }else{ return typeof(target); } } console.log(disType([1,2.3]));
    Processed: 0.009, SQL: 9