Javasript基本数据类型
-
几种?
包括
Boolean
、Null
、NaN
、undefined
、Number
、String
、Symbol
七种基本数据类型,一个引用类型Object
-
Boolean 布尔类型
true / false
-
Null 空
-
NaN 非数值
ES5中(不可配置、不可写),一般在Math的某个计算失败时,作为返回值出现或在字符串解析数字失败时会出现
-
undefined undefined类型
一个没有被赋值的变量的默认值
-
Number 数字类型
可表示NaN和带符号的浮点、整数
-
String 字符串类型
-
Symbol 符号类型
唯一且不可修改,可用来作为Object的key值
-
-
怎么判断和区分?
-
typeof
typeof null //object 无效 typeof NaN //number 无效 typeof [] //object 无效 typeof new Date() //object 无效 typeof function //function 有效 typeof Symbol() //Symbol 有效 typeof 1 //Number 有效 typeof '' //String 有效 typeof undefined //undefined 有效
null 返回object
NaN 返回 number
除了function之外的引用类型,统一返回object
除了null之外的基本类型,均可正确返回类型
function 返回 function
对于引用类型变量及特殊情况判断不准确
-
instanceof
instanceof检测的是原型,A instanceof B ,当A时B的实例时,返回true,否则返回false
[] instanceof Array //true [] instanceof Object //true new Date() instanceof Date //true
现象
:[]既是Array的示例,也是Object的实例原因
:[]._proto_
到Array._proto_
到Object.__proto_
到null
形成一条原型链instanceof只能用来判断两个对象是否属于实例关系,而不能判断一个对象实例具体属于那种类型。当一个网页中包含多个框架,存在两个以上不同的全局执行环境,会存在两个不同版本的构造函数,导致判断存在问题,可以使用
Array.isArray()
方法 -
constructor
function F(){} var f = new F(); f.constructor == F //true
F被当成构造函数,f是F的实例,F原型链上的constructor传递给了f,因此f.constructor == F
细节问题:
- null和undefined是无效的对象,因此不会有constructor存在,这两种类型的数据需要通过其他方式判断。
- 函数的constructor是不稳定的,当开发者重写prototype后,原有的constructor引用会丢失,constructor会默认为Object
-
toString
toString()是Object的原型方法,调用该方法,默认返回当前对象的[[Class]],这是一个内部属性,其格式为[object Xxx],其中Xxx就是对象的类型。
Object.prototype.toString.call('') ; // [object String] Object.prototype.toString.call(1) ; // [object Number] Object.prototype.toString.call(true) ; // [object Boolean] Object.prototype.toString.call(Symbol()); //[object Symbol] Object.prototype.toString.call(undefined) ; // [object Undefined] Object.prototype.toString.call(null) ; // [object Null] Object.prototype.toString.call(new Function()) ; // [object Function] Object.prototype.toString.call(new Date()) ; // [object Date] Object.prototype.toString.call([]) ; // [object Array] Object.prototype.toString.call(new RegExp()) ; // [object RegExp] Object.prototype.toString.call(new Error()) ; // [object Error] Object.prototype.toString.call(document) ; // [object HTMLDocument] Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用
-
- 实现一个 instanceof
function instanceOf(A,B){
let proto = A._proto_;
const prototype = B.prototype;
while(true){
if(proto === null) return false;
if(proto === prototype) return true;
proto = proto._proto_;
}
}
实现思路:判断A._proto_
是不是强等于B.prototype
,不等于再找A._proto_._proro
,直到_proto_
为null