5种基本数据类型 & 引用数据类型
undefined null boolean number string & object
typeof 操作符,不是函数
- undefined —— 值未定义
- boolean —— 布尔值
- string —— 字符串
- object —— 对象或者null
- number —— 数值
- function —— 函数
Undefined 类型
使用 var 声明一个变量但是没有初始化时,这个变量的值就是 undefined。
var msg1;//声明了 msg1 但没有初始化; 没有声明 msg2
alert(typeof msg1);//undefined
alert(typeof msg2);//undefined
Null 类型
null 值表示一个空对象指针,所以 typeof null 返回 object。
所以如果定义的变量将来准备用于保存对象,那么最好将该变量初始化为 null。
if (car != null){
// 对 car 对象执行某些操作
}
实际上,undefined 值是派生自 null 值的,因此 ECMA-262 规定对它们的相等性测试要返回 true:
alert(null == undefined); //true
无论在什么情况下都没有必要把一个变量的值显示的蛇者为 undefined,null 却不一定;只要意在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存 null 值。这样不仅可以体现 null 作为空指针对象的惯例,也有助于进一步区分 null 和 defined。
Boolean 类型
Boolean()转型函数:
Number 类型
NaN(Not A Number),这个数值用来表示一个本来要返回数值的操作数未返回数值的情况。
- 任何涉及 NaN 的操作都会返回 NaN
- alert(NaN == NaN); //false
- isNaN()在接收到一个值后,会判断这个值能否转化为数值,不能返回 true。
String 类型
toString() 方法可以区分 null undefined
Object 类型
Object 的每个实例都具有下列属性和方法。
-
constructor:保存着用于创建当前对象的函数。
-
hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例 的原型中)是否存在。
-
isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型。
-
propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句。
-
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
-
toString():返回对象的字符串表示。
-
valueOf():返回对象的字符串、数值或布尔值表示。通常与 toString()方法的返回值
相同。
相等操作符
- == & != 先转换在比较
-
如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为 0,而 true 转换为 1
-
如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
-
如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法,用得到的基本类
型值按照前面的规则进行比较;
- === & !== 仅比较不转换
引用数据类型
- 基本类型和引用类型
基本类型值是简单的数据段,是按值访问的,可以直接操作保存在变量中的实际的值
引用类型值是可能由多个值构成的对象;是保存在内存中的对象,javascript 不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是操作对象的引用而不是实际的对象。引用类型的值是按引用访问的。
- 复制变量值
基本类型值:
如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制 到为新变量分配的位置上。来看一个例子:
var num1 = 5;
var num2 = num1;
在此,num1 中保存的值是 5。当使用 num1 的值来初始化 num2 时,num2 中也保存了值 5。但 num2 中的 5 与 num1 中的 5 是完全独立的,该值只是 num1 中 5 的一个副本。此后,这两个变量可以参与任 何操作而不会相互影响。
引用类型值:
当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象。复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,就会影响另 一个变量,如下面的例子所示:
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"
首先,变量 obj1 保存了一个对象的新实例。然后,这个值被复制到了obj2中;换句话说,obj1 和 obj2 都指向同一个对象。这样,当为 obj1 添加 name 属性后,可以通过 obj2 来访问这个属性,因为这两个变量引用的都是同一个对象。
检测类型的几种方法
- typeof
typeof undefined; // undefined
typeof 1; // number
typeof 'hjh'; // string
typeof true; // boolean
typeof function; // function
typeof null; // object
typeof []; // object
typeof {}; // object
typeof 操作符是确定一个变量是字符串、数值、布尔值,还是 undefined 的最佳工具。如果变量的值是一个对象或 null,则 typeof 操作符会返回"object"
- instanceof
instanceof 是用来判断 A 是否为 B 的实例,instanceof 检测的是原型
instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。
- constructor
null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。
函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object
- toString
toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。
对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。