javascript中如何准确判断一个变量是什么,面试中这是考一个人基本功扎不扎实必定会问的一个问题。如果你还不是很清楚,相信这篇文章会对你有所帮助。
<强> typeof 强>
1.我们能够使用typeof判断变量的身份,判断字符串得到字符串,数字和南得到号码,函数会得到函数等,但是判断数组,对象和空时都会得到对象,详细请看js数据类型,这就是typeof的局限性,并不能准确的判断该变量的“真实身份”。那如何判断一个变量是数组还是对象?
2.<>强,运算符强>
使用instanceof可以用来判断一个变量是数组还是对象,原理如下:
数组也是对象的一种,使用instanceof都会返回真正的
var arr=new Array (); var arr=[“aa”、“bb”、“cc”); var obj={“aa”, b:“bb”, c:“cc”}; 控制台。日志(arr instanceof数组);//正确的 控制台。日志(arr instanceof对象);//正确的 控制台。日志(obj instanceof数组);//错误 控制台。日志(obj instanceof对象);//真正的
运算符是如何判断的:
instanceof运算符用来测试一个对象在其原型链中是否存在一个构造函数的原型属性,意思就是该变量通过原型链上能否找到构造函数的原型属性,还不清楚原型链的请看原型链,所以就能明白为什么instanceof判断一个变量可以分清楚它到底是数组还是对象:
数组。===arr原型。__proto__
对象。===arr.__proto__原型。__proto__
因为arr的原型链上存在Array.prototype和对象。原型
只有数组类型的变量才会满足arr instanceof数组和arr实例对象都返回真,
也只有对象类型变量才满足obj instanceof数组返回假,obj instanceof对象返回true ,,,,,,,
<强> 强>
3.构造函数var arr=[“aa”、“bb”、“cc”); var obj={ “一”:“aa”, b:“bb”, “c”:“cc” }; console.log(加勒比海盗。构造函数===数组);//正确的 console.log(加勒比海盗。构造函数===对象);//错误 console.log (obj。构造函数===对象);//真正的
<强> 4. object.prototype.tostring.call() 强>
Object.prototype.toString.call()方法可以精准判断变量类型,它返回(对象constructorName)的字符串格式,这里的constructorName就是叫参数的函数名
var=南; var b=' 222 '; var c=零; var d=false; var e=定义; var f=符号(); var arr=[“aa”、“bb”、“cc”); var obj={a:“aa”、“b”:“bb”、“c”:“cc”}; var res=Object.prototype.toString.call (arr); console.log (res);//var(对象数组)它=Object.prototype.toString.call (obj);console.log(它);(对象对象)//var res3=Object.prototype.toString.call(一个);console.log (res3);(物体)//var res4=Object.prototype.toString.call (b);console.log (res4);(对象的字符串)//var res4=Object.prototype.toString.call (c);console.log (res4);//[对象Null] var res5=Object.prototype.toString.call (d);console.log (res5);(布尔对象)//var res6=Object.prototype.toString.call (e);console.log (res6);//[对象定义]var res7=Object.prototype.toString.call (f);console.log (res7);(对象符号)////JavaScript文件
判断简单数据类型可以用typeof,判断数组,对象使用instanceof,构造函数和Object.prototype.toString.call(),最好使用Object.prototype.toString.call(),更加精准
以上所述是小编给大家介绍的javascript判断一个变量是数组还是对象详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!