JS的类型
基本类型:bigInt,number,string,boolen,symbol,undefined,null
复杂数据类型:object,Array,Function,内置对象
如何判断
1. typeof判断(最常用)
function func(){
console.log("js类型判断方法");
}
console.log(typeof 1); //number
console.log(typeof 'a'); //string
console.log(typeof true); //boolean
console.log(typeof undefined); //undefined
console.log(typeof Symbol());//symbol
console.log(typeof 42n); //bigint
console.log(typeof null); //object
console.log(typeof NaN); //number
console.log(typeof({a:1})); //object
console.log(typeof [1,3]); //object
console.log(typeof func); //function
console.log(typeof(new Date)); //object
判断一个变量是否被声明可以用(typeof 变量 === ‘undefined’)来判断
typeof可以判断基本数据类型,但是难以判断除了函数以外的复杂数据类型
2. instanceof
语法:obj instanceof Object
obj:要判断的内容
Object:类型
只能用来判断复杂数据类型
instanceof 是用于检测构造函数(右边)的 prototype 属性是否出现在某个实例对象(左边)的原型链上
console.log([1,2] instanceof Array); //true
console.log(func instanceof Function); //true
console.log({a:1} instanceof Object ); //true
console.log(new Date instanceof Date); //true
3. object.property.toString.call
// 基本数据类型
console.log(Object.prototype.toString.call(999)); //[object Number]
console.log(Object.prototype.toString.call('')); //[object String]
console.log(Object.prototype.toString.call(Symbol())); //[object Symbol]
console.log(Object.prototype.toString.call(42n));//[object BigInt]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call(undefined)); //[object Undefined]
console.log(Object.prototype.toString.call(true));//[object Boolean]
// 复杂数据类型
console.log(Object.prototype.toString.call({a:1})); //[object Object]
console.log(Object.prototype.toString.call([1,2])); //[object Array]
console.log(Object.prototype.toString.call(new Date)); //[object Date]
console.log(Object.prototype.toString.call(func)); //[object Function]
如何判断属性是自有属性
Object的hasOwnProperty()
方法返回一个布尔值,判断对象是否包含特定的自身(非继承)属性.
什么是自由属性?什么是继承属性?
例子:
function F() { //自定义数据类型
this.name = "自有属性";
}
F.prototype.name = "继承属性";
在上面例子中,this.name
就表示对象的自有属性,原型对象中的name
属性就是继承属性
语法:
object.hasOwnProperty(propertyName);
参数说明:propertyName 参数表示要检测的属性名称。
返回值:返回一个布尔值。如果 propertyName 是自有属性,那么返回 true,否则返回 false。
示例1:
针对上面的自定义类型,可以实例化对象,然后判定当前对象调用的属性 name 是什么类型。
let f = new F(); //实例话对象
console.log(f.hasOwnProperty("name")); // true
console.log(f.name); //自有属性
凡是构造函数的原型属性(原型对象包含的属性),都是继承属性,使用 hasOwnProperty()
方法检测时,都会返回false
。但是,对于原型对象本身来说,这些原型属性又是原型对象的自有属性,所以返回值又是true
。
示例2:
let d = Date;
console.log(d.hasOwnProperty("toString")); //false
let dd = Date.prototype;
console.log(dd.hasOwnProperty("toString")); //true
toString()
方法对于Date
对象来说是继承属性,但是对于Date
构造函数的原型对象来说,则是它的自有属性
注意: hasOwnProperty()
方法只能判断指定对象中是否包含指定名称的属性,无法检查对象原型链中是否包含某个属性,所以能够检测出来的属性必须是对象成员。
示例3:
演示hasOwnProperty()
方法所能检测的属性范围。
var o = { //对象直接量
o1 : { //子对象直接量
o2 : { //孙子对象直接量
name : 1 //孙子对象直接量的属性
}
}
};
console.log(o.hasOwnProperty("o1")); //返回true,说明o1是o的自有属性
console.log(o.hasOwnProperty("o2")); //返回false,说明o2不是o的自有属性
console.log(o.o1.hasOwnProperty("o2")); //返回true,说明o2是o1的自有属性
console.log(o.o1.hasOwnProperty("name")); //返回false,说明name不是o1的自有属性
console.log(o.o1.hasOwnProperty("name")); //返回true,说明name不是o2的自有属性