js判断数据类型
2021-07-22 本文已影响0人
小溪流jun
<!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>数据类型判断</title>
</head>
<body>
<script>
/*
+js的数据类型可以分为复杂数据类型和基本数据类型
==>基本数据类型
Undefined---未定义
null---对空
Boolean--布尔
String---字符串
Number---数字
Symbol---Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值,主要是用来定义对象的唯一属性名
==>引用数据类型
对象(Object)
数组(Array)
函数(Function)
+判断数据类型的4种方法
==>type of 检测数据---缺点:不能判断null和object
==>检测数据 instanceof 数据类型---缺点:不能判断基本数据类型(只能判断对象是否存在于目标对象的原型链上)
==>检测数据.constructor.name
==>Object.prototype.toString.call(检测数据)
*/
/*
typeof 可以正确识别:Undefined、Boolean、Number、String、Symbol、Function 等类型的数据,但是对于其他的都会认为是 object,比如 Null、Date 等,所以通过 typeof 来判断数据类型会不准确。但是可以使用 Object.prototype.toString 实现。
*/
// function typeOf(obj){
// let res = Object.prototype.toString.call(obj).split(" ")[1]
// res = res.substring(0,res.length-1).toLowerCase()
// return res
// // 评论区里提到的更好的写法
// // return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase()
// }
// console.log(typeOf([]))
// console.log(typeOf({}) )
// console.log(typeOf(new Date))
// let num1 =0.1
// let num2 = 0.2
// let num3 = 0.3
// console.log(num1+num2 == num3)
//浮点数是使用64位固定长度来表示的,其中的1位表示符号位,11位用来表示指数位,剩下的52位尾数位,由于只有52位表示尾数位。
//在console.log的时候会二进制转换为十进制,十进制再会转为字符串的形式
/*
typeof
缺点:typeof null的值为Object,无法分辨是null还是Object
instanceof
缺点:只能判断对象是否存在于目标对象的原型链上
*/
// -----------------------------------------typeof
typeof undefined // 'undefined' 缺点:typeof null的值为Object,无法分辨是null还是Object
typeof '10' // 'String'
typeof 10 // 'Number'
typeof false // 'Boolean'
typeof Symbol() // 'Symbol'
typeof Function // ‘function'
typeof null // ‘Object’
typeof [] // 'Object'
typeof {} // 'Object'
console.log(typeof undefined)
console.log(typeof '10')
console.log(typeof 10)
console.log(typeof false)
console.log(typeof Symbol())
console.log(typeof Function)
console.log(typeof null)
console.log(typeof [])
console.log(typeof {})
//因为在JavaScript中,不同的对象都是使用二进制存储的,如果二进制前三位都是0的话,系统会判断为是Object类型,而null的二进制全是0,自然也就判断为Object
//这个bug是初版本的JavaScript中留下的,扩展一下其他五种标识位:
//000 对象
//1 整型
//010 双精度类型
//100字符串
//110布尔类型
// -----------------------------------------instanceof
//instanceof原理实际上就是查找目标对象的原型链
function Foo() { }
var f1 = new Foo(); //缺点:只能判断对象是否存在于目标对象的原型链上
var d = new Number(1)
console.log(f1 instanceof Foo);// true
console.log(d instanceof Number); //true
console.log(123 instanceof Number); //false -->不能判断字面量的基本数据类型
function myInstance(L, R) {//L代表instanceof左边,R代表右边
var RP = R.prototype
var LP = L.__proto__
while (true) {
if (LP == null) {
return false
}
if (LP == RP) {
return true
}
LP = LP.__proto__
}
}
console.log(myInstance({}, Object));
// -----------------------------------------constructor
var d = new Number(1)
var e = 1
function fn() {
console.log("ming");
}
var date = new Date();
var arr = [1, 2, 3];
var reg = /[hbc]at/gi;
console.log(e.constructor);//ƒ Number() { [native code] }
console.log(e.constructor.name);//Number
console.log(fn.constructor.name) // Function
console.log(date.constructor.name)// Date
console.log(arr.constructor.name) // Array
console.log(reg.constructor.name) // RegExp
//-----------------------------------------Object.prototype.toString.call()
console.log(Object.prototype.toString.call(undefined)); // "[object Undefined]"
console.log(Object.prototype.toString.call(null)); // "[object Null]"
console.log(Object.prototype.toString.call(123)); // "[object Number]"
console.log(Object.prototype.toString.call("abc")); // "[object String]"
console.log(Object.prototype.toString.call(true)); // "[object Boolean]"
function fn() {
console.log("ming");
}
var date = new Date();
var arr = [1, 2, 3];
var reg = /[hbc]at/gi;
console.log(Object.prototype.toString.call(fn));// "[object Function]"
console.log(Object.prototype.toString.call(date));// "[object Date]"
console.log(Object.prototype.toString.call(arr)); // "[object Array]"
console.log(Object.prototype.toString.call(reg));// "[object RegExp]"
</script>
</body>
</html>