面试题:判断数据类型

110 阅读1分钟

    <script>
        // 判断数据类型  递归算法   深拷贝  

        //1.typeof 
        // 返回数据类型,包含这7种: number、boolean、symbol、string、object、undefined、function。
        // ES6是一种新的原始数据类型Symbol,表示唯一的值,最大的用法是定义对象的唯一属性名。它不支持语法:“ new Symbol()”

        var sym1 = Symbol();
        var sym2 = Symbol('foo');
        var sym3 = Symbol('foo');
        console.log(typeof sym1)//symbol

        console.log(sym1)//Symbol()
        console.log(sym2)//Symbol(foo)
        console.log(sym3)//Symbol(foo)

        console.log(typeof '');//string
        console.log(typeof 123);//number
        console.log(typeof true);//boolean
        console.log(typeof undefined);//undefined
        console.log(typeof null);//object 无效
        console.log(typeof []);//object 无效
        console.log(typeof {});//object 无效
        console.log(typeof new Function());//function
        console.log(typeof new Date());//object 无效
        console.log(typeof new RegExp());//object 无效
        console.log(typeof null);//object 无效

//2.instanceof
// instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。 在这里需要特别注意的是:instanceof 检测的是原型
//instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。

var obj = {name:'lulu',age:'123'}
var arr = ['123','456']
var reg = /upupup/
console.log(obj instanceof Array)//false
console.log(arr instanceof Array)//true
console.log(obj instanceof Object)//true
console.log(reg instanceof RegExp)//true

//property 所有物; 财产; 财物; 不动产

//3.Object.prototype.toString  缺陷就是低版本的ie浏览器  没有办法做到完全兼容

// toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。

// 对于 Object 对象,直接调用 toString()  就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

// 判断类型举例:
console.log(Object.prototype.toString(obj))//[object Object]
Object.prototype.toString.call('') ;   // [object String]
Object.prototype.toString.call(1) ;    // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用

// 4.constructor
//constructor 属性是在原型  __proto__ 中的属性
// 1:null 和 undefined 无constructor,这种方法判断不了。

// 2:还有,如果自定义对象,开发者重写prototype之后,原有的constructor会丢失,因此,为了规范开发,在重写对象原型时一般都需要重新给 constructor 赋值,以保证对象实例的类型不被篡改。
var str1 = '12342asda'
console.dir(str1)
var obj1 = new Object();
console.dir(obj1)

console.dir(new Date());

console.log(str1.constructor == String);//true
console.log(new Number(1).constructor == Number);//true
console.log(true.constructor == Boolean);//true
console.log(new Function().constructor == Function);//true
console.log(new Date().constructor == Date);//true
console.log(new Error().constructor == Error);//true
console.log(new Array().constructor == Array);//true
console.log(document.constructor == HTMLDocument);//true
console.log(window.constructor == Window);//true
    </script>

image.png