1.JavaScript有几种类型的值?Javascript有两种数据类型,原始数据类型和引用数据类型。其中,基本数据类型包括Undefined、Null、Boolean、Number、String、Symbol(ES6新加入,代表一个唯一值),引用数据类型统称为Object对象,主要包括对象、数组、和功能。接下来,我们就来看看两者的特点吧。二、基本数据类型1、值不可变varname='java';name.toUpperCase();//输出'JAVA'console.log(name);//Output'java'可以由此得到,基本上数据类型的值是不可变的2.存放在栈区原始数据类型直接存放在栈(stack)中简单的数据段占用空间小,有一个固定的大小。它们是经常使用的数据,所以它们存储在堆栈中。3.值比较vara=1;varb=true;console.log(a==b);//trueconsole.log(a===b);//false==:只进行值比较,会进行数据类型转换。===:不仅比较值,还比较数据类型。三、引用数据类型1、取值为变量vara={age:20};a.年龄=21;console.log(a.age)//21上面的代码表明引用类型可以有属性和方法,并且可以动态改变。2.同时存储在栈内存和堆内存中,引用数据类型存储在堆(heap)中,占用空间大,大小不固定。如果存放在栈中,会影响程序运行的性能;引用数据类型存储在堆栈中中存储一个指针,它指向该实体在堆中的起始地址。解释器在查找引用值时,首先获取其在栈中的地址,获取到地址后,再从堆中获取实体。3.比较是参考文献的比较。当将一个变量的引用类型的值赋值给另一个变量时,存储在该变量中的对象的值也将被复制并放置在为新变量分配的空间中。vara={age:20};varb=a;b.age=21;console.log(a.age==b.age)//true上面我们说了基本类型和引用类型的存放位置在内存中不同,引用类型在堆中存储对象,同时,在栈中存储指针,这个指针指向实体在堆中的起始位置。初始化变量a时,a指针指向对象{age:20}的地址。a赋给b后,b指向对象{age:20}的地址。这两个变量指向同一个对象。因此,改变这些变量中的任何一个都会影响另一个。此时,如果一个变量对原对象的引用被取消,另一个变量不会受到影响。vara={age:20};varb=a;a=1;b//在上面的代码中{age:20},a和b指向同一个对象,那么a的值就变成了1,即不会影响b,b还是指向原来的对象。4、检查数据类型1.typeoftypeof返回一个代表数据类型的字符串,返回结果包括:number、boolean、string、symbol、object、undefined、function等7种数据类型,但无法判断null、array、等等typeofSymbol();//符号有效typeof'';//字符串有效typeof1;//数字有效typeoftrue;//布尔有效类型未定义;//未定义的有效类型newFunction();//函数有效typeofnull;//对象无效typeof[];//对象是无效的typeofnewDate();//对象是无效的typeofnewRegExp();//object是无效数组,object返回对象,那么需要用instanceof来判断2.instanceofinstanceof用来判断A是否是B的实例,表达式为:AinstanceofB,如果A是B的实例,返回真,否则返回假。instanceof运算符用于测试对象的原型链中是否具有构造函数的原型属性。[]数组实例;//true{}instanceofObject;//truenewDate()instanceofDate;//truenewRegExp()instanceofRegExp//true关于数组的类型判断,也可以用ES6加上Array.isArray()数组。isArray([]);//trueinstanceof的三大缺点:对于基本数据类型,字面量方法创建的结果与实例方法创建的结果不同。console.log(1instanceofNumber)//falseconsole.log(newNumber(1)instanceofNumber)//true严格来说,只有实例创建的结果才是标准对象数据类型值,同时也是实例标准数字类;对于字面量方法创建的结果是一个基本数据类型的值,不是严格的实例,但是由于JS松散的特性,可以使用Number.prototype上提供的方法。只要在当前实例的原型链上,我们用它检测的结果都是真的。在类的原型继承中,我们最终检测到的结果可能并不准确。vararr=[1,2,3];console.log(arrinstanceofArray)//trueconsole.log(arrinstanceofObject);//truefunctionfn(){}console.log(fninstanceofFunction)//trueconsole.log(fninstanceofObject)//true无法检测null和undefined对于特殊数据类型null和undefined,它们的类是Null和Undefined,但是浏览器保护了这两个类,不允许我们在使用之外访问它们。3.严格运算符===只能用来判断null和undefined,因为这两类值是唯一的。vara=nulltypeofa//"object"a===null//trueundefined也可以用typeof判断varb=undefined;typeofb==="undefined"//trueb===undefined//true4.constructor构造函数角色非常类似于instanceof。但是构造函数检测Object和instanceof不一样,同样可以处理基本数据类型的检测。varaa=[1,2];console.log(aa.constructor===Array);//trueconsole.log(aa.constructor===RegExp);//falseconsole.log((1).constructor===Number);//truevarreg=/^$/;console.log(reg.constructor===RegExp);//trueconsole.log(reg.constructor===Object);//falseconstructor两大缺点:null和undefined是无效对象,所以不会有构造函数。这两类数据需要通过其他方法来判断。函数的构造函数不稳定。这主要体现在重写类的原型上。在重写过程中,很可能会覆盖之前的构造函数,所以检测到的结果是一个不准确的函数Fn(){}Fn.prototype=newArray()varf=newFnconsole.log(f.constructor)//Array5.Object.prototype.toString.call()Object.prototype.toString.call()最准确最常用的方式。首先获取Object原型上的toString方法,让方法执行,让toString方法中的this指向第一个参数的值。关于toString的重要补充说明:本意是转为字符串,但有些toString方法不仅转为字符串。Number、String、Boolean、Array、RegExp、Date、Function原型上的toString方法,当前数据Types转字符串(它们只用于转字符串),Object上的toString不用于转字符串。toStringonObject的作用是返回当前方法执行的主体(方法中的this)所属类的详细信息,即“[objectObject]”,其中第一个对象代表当前instance是object数据类型(this是固定的Dead),第二个Object表示this所属的类是Object。Object.prototype.toString.call('');//[对象字符串]Object.prototype.toString.call(1);//[对象编号]Object.prototype.toString.call(true);//[对象布尔值]Object.prototype.toString.call(undefined);//[对象未定义]Object.prototype.toString.call(null);//[objectNull]Object.prototype.toString.call(newFunction());//[对象函数]Object.prototype.toString.call(newDate());//[对象日期]Object.prototype.toString.call([]);//[对象数组]Object.prototype.toString.呼叫(新正则表达式());//[objectRegExp]Object.prototype.toString.call(newError());//[对象错误]Object.prototype.toString.call(document);//[对象HTMLDocument]Object.prototype.toString.call(window);//[objectglobal]window是全局对象global的引用如果觉得文章对你有帮助,请点赞关注我的GitHub博客,非常感谢!参考资料【文章】【【JS进阶】基本类型引用类型简单赋值对象参考】(https://segmentfault.com/a/11...(推荐)JS类型判断中JS判断数据类型数据的三种方法Javascript判断变量类型的误区及正确的处理方法四种判断JS数据类型的方法
