【JavaScript面试问题】2. 判断数据类型、数组判断、值复制clone

2. 判断数据类型typeof、instanceof、Object.prototype.toString.call()、constructor

  • typeof
typeof ''; // string 有效
typeof 1; // number 有效
typeof Symbol(); // symbol 有效
typeof true; //boolean 有效
typeof undefined; //undefined 有效
typeof null; //object 无效
typeof [] ; //object 无效
typeof new Function(); // function 有效
typeof new Date(); //object 无效
typeof new RegExp(); //object 无效

typeof function结果为function,typeof null和数组、日期等引用类均为Object

  • instanceof
instanceof (A,B) = {
    var L = A.__proto__;
    var R = B.prototype;
    if(L === R) {
        // A的内部属性 __proto__ 指向 B 的原型对象
        return true;
    }
    return false;
}

原理是检验A是否为B的实例,instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。

  • constructor
  ''.constructor == String
  Number(1).constructor == Number
  [].constructor == Array
  Symbol.constructor == Symbol
  true.constructor == Boolean

直接通过constructor来判断属于什么类型的数据,但是遇到自定义对象、重写过的prototype则不适用

  • Object.prototype.toString.call()
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 的引用

2.1 判断数组的几种方式

[] instanceof Array
[].constructor == Array
Object.prototype.toString.call([])
Array.isArray([])
Array.prototype.isPrototypeOf([]) //判断Array是否在[]原型链上

2.2 判断NaN的几种方式

function myIsNaN(num) {
  if (num!=num) {
    return true
  } else {
    return false
  }
}

isNaN(NaN)

2.3 实现一个函数clone,可以对js中的5种主要的数据类型(包括number string object array Boolean)进行值复制

function getData(data){
  let dataType = Object.prototype.toString.call(data).slice(8,-1)
  let copyData = null
  switch(dataType) {
    case 'String':
      copyData =  "'" + data +"'"
      break
    case 'Number':
      copyData = 0 + data
      break
    case 'null':
      copyData = null
      break
    case 'Undefined':
      copyData = "Undefined"
      break
    case 'Boolean':
      copyData = data 
      break
    case 'Array':
      copyData = []
      for(var i=0;i<data.length;i++) {
        copyData[i] = data[i]
      }
      break
    case 'Object':
      copyData = {}
      for (var j in data) {
        copyData[j] = data[j]
      }
      break
    case 'Function':
      copyData = data
      break
  }
  return copyData
}
console.log(getData(123));   
console.log(getData("123"));  
console.log(getData(null));  
console.log(getData(undefined));  
console.log(getData(false));  
console.log(getData([1,2,4]));  
console.log(getData({"name":"wc"}));  
console.log(getData(function(){alert(23);}));  

源码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>

<script>
console.log(typeof NaN);
console.log(typeof '');
console.log(typeof 1);
console.log(typeof Symbol());
console.log(typeof true);
console.log(typeof undefined);
console.log(typeof null);
console.log(typeof [] );
console.log(typeof new Function());
console.log(typeof new Date());
console.log(typeof new RegExp());
console.log('----------------------------------');

  let a= [];
  class person {
    constructor(age){
      this.age=age
    }
    name = 'gg'
  }
  let tom = new person()
  function myInstanceof(a,b){
    let l = a.__proto__
    let r = b.prototype
    return l===r? true:false;
  }
  console.log(myInstanceof(a,Array));
  console.log(a instanceof Array);
  console.log(myInstanceof(tom,person));
  console.log(tom instanceof person);


  console.log('----------------------------');
  console.log(''.constructor == String);
  console.log(Number(1).constructor == Number);
  console.log([].constructor == Array);
  console.log(Symbol.constructor == Symbol);
  console.log(true.constructor == Boolean);

console.log(Array.isArray([1,2,3]));
console.log(isNaN(NaN));
function myIsNaN(num) {
  if (num!=num) {
    return true
  } else {
    return false
  }
}
console.log(myIsNaN(NaN));
console.log("-----------------------------");


function getData(data){
  let dataType = Object.prototype.toString.call(data).slice(8,-1)
  let copyData = null
  switch(dataType) {
    case 'String':
      copyData =  "'" + data +"'"
      break
    case 'Number':
      copyData = 0 + data
      break
    case 'null':
      copyData = null
      break
    case 'Undefined':
      copyData = "Undefined"
      break
    case 'Boolean':
      copyData = data 
      break
    case 'Array':
      copyData = []
      for(var i=0;i<data.length;i++) {
        copyData[i] = data[i]
      }
      break
    case 'Object':
      copyData = {}
      for (var j in data) {
        copyData[j] = data[j]
      }
      break
    case 'Function':
      copyData = data
      break
  }
  return copyData
}
console.log(getData(123));  
console.log(getData("123"));  
console.log(getData(null));  
console.log(getData(undefined));  
console.log(getData(false));  
console.log(getData([1,2,4]));  
console.log(getData({"name":"wc"}));  
console.log(getData(function(){alert(23);}));  
</script>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值