一)JS数据类型种类
- 基本数据类型:string、number、null、Boolean、undefined共五大类,数据大小确定,储存在计算机栈内存中。
- 引用类型:Function、Object、Array三大类,存储在堆内存中(保存的是指针,指向内存地址)。
二)JS数据类型检测方式
主要有typeof、instanceof、constructor、Object.prototype.toString()四种。
- typeof检测8大数据类型,null和Array都被检测成了object,其它都正常。
console.log(typeof 1) //number
console.log(typeof 'a') //string
console.log(typeof true) //boolean
console.log(typeof undefined) //undefined
console.log(typeof null) //object
console.log(typeof []) //object
console.log(typeof function () { }) //function
console.log(typeof {}) //object
- instanceof(实例),只能检测引用类型(数组,对象,函数),检测引用类型A是否是B的实例,通过原型链检测引用实例的构造函数。
console.log(1 instanceof Number) //false
console.log('a' instanceof String) //false
console.log(true instanceof Boolean) //false
// console.log( undefined instanceof undefined) // 异常
// console.log( null instanceof null) // 异常
console.log([] instanceof Array) //true
console.log(function () { } instanceof Function) //true
console.log({} instanceof Object) //true
// 这就是instanceof实现原理,通过原型链检测引用实例的构造函数
// a引用实例,b构造函数
function instance(a,b){
let p1 = a.__proto__
let p2 = b.prototype
while(true){
if(p1 === null) return false
if(p1 === p2 ) return true
p1 = p1.__proto__
}
}
- constructor(构造函数)检测数据的构造函数,对象的constructor指向创建该对象的函数,也就是构造函数
这里首先讲下constructor的用法:
console.log(''.constructor === String) // true
console.log((1).constructor === Number) // true
// console.log((null).constructor === null) // 异常
// console.log(undefinde.constructor === undefined) // 异常
console.log([].constructor === Array) // true
console.log({}.constructor === Object) // true
console.log((function () { }).constructor === Function) // true
- 除null、undefined不能检测其构造函数外,其它都能检测到数据的构造函数。
function Cat() {
this.name = 'coco'
this.say = function (age, sex) {
console.log('my name is ' + this.name)
}
}
const cat = new Cat()
// 对象的constructor指向创建该对象的函数,也就是构造函数
console.log(cat.constructor === Cat) // true
console.log(cat.__proto__ === Cat.prototype)
console.log(cat.__proto__.constructor === Cat) // true
// 函数的原型对象的constructor指向函数本身
console.log(Cat.prototype.constructor === Cat) // true
-
对象的constructor指向创建该对象的函数,也就是构造函数。
-
函数的原型对象的constructor指向函数本身。
constructor的其它用法
比喻我们在引用一个构造函数的实例时,我们想对其构造函数进行改造,这时constructor就有用了,我们可以通过实例的constructor找到其构造函数,然后在构造函数的原型对象上添加一些新的属性和方法。
function Cat() {
this.name = 'coco'
}
const cat = new Cat()
// 在构造函数Cat上添加age属性,并赋值22
cat.constructor.prototype.age = 22
cat.constructor.prototype.say = function(){
console.log("my name is "+ this.name+", and age is "+this.age)
}
const cat1 = new Cat()
console.log(cat1.age) // 22
cat1.say() // my name is coco, and age is 22
// constructor.length构造函数参数个数
console.log(cat1.constructor.length) // 0
- Object.prototype.toString()
toString()是Object原型prototype的一个方法,默认返回对象的[Object,XX]
console.log(Object.prototype.toString()) // [object Object]
console.log(Object.prototype.toString.call(null)) // [object Null]
console.log(Object.prototype.toString.call(undefined)) // [object Undefined]
console.log(Object.prototype.toString.call('')) // [object Object]
console.log(Object.prototype.toString.call(1)) // [object Number]
console.log(Object.prototype.toString.call(true)) // [object Boolean]
console.log(Object.prototype.toString({})) // [object Object]
console.log(Object.prototype.toString.call([])) // [object Array]
console.log(Object.prototype.toString.call(function(){})) // [object Object]
- Object.prototype.toString()可以检测出8大数据类型。
- 检测object对象时直接调用,检测其它类型需添加call,apply等方法,貌似jq里面判断数据类型就是通过这个方法。