1、js中的类型
字符串、数字、布尔、数组、对象、Null、Undefined
①基本数据类型
null、undefined、boolean、number、string
console.log(typeof 1);//number console.log(typeof "a");//string console.log(typeof null);//object console.log(typeof undefined);//undefined console.log(typeof true);//boolean
但是 typeof null 的返回值却是 object ,js中定义的null 是一个特殊的对象。更确切的说,null是一个空对象的指针,指向一个空对象。以此来和undefined区分开。
为了便于操作基本类型值,ECMAScript还提供了三个特殊的引用类型:Boolean、Number和String,标准库提供了构造函数来封装布尔值、数字和字符串作为对象。这些类型与其他引用类型相似,同时也具有与各自的基本包装类型相应的特殊行为。实际上,每当读取一个基本类型值时,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。
1
2
3
|
var s1 = "some text" ; var s2 = s1.substring(2); var s3 = new String( "some text" ); |
但是不同于原始的字符串,String对象是一个真正的对象。
1
2
|
typeof s1; //"string" typeof s3; //"object" |
这个例子中的变量s1包含一个字符串,字符串当然是基本类型值。而下一行调用了s1的substring()方法,并将返回的结果保存在s2中。我们知道,基本类型值不是对象,因此从逻辑上讲,它们不应该有方法(但是它们确实有方法)。其实,为了让我们实现这种直观的操作,后台已经自动完成了一系列的处理。当第二行代码访问s1时,访问过程处于一种读取模式,也就是从内存中读取这个字符串的值。而在读取模式中访问字符串时,后台都会自动完成下列处理:
(1)创建String类型的一个实例。
(2)在实例上调用指定方法。
(3)销毁这个实例。
特点是:
基本数据类型的值是不能影响其他值改变的。
//传递基本类型时,实参传入的是该元素的一个副本,该元素本身并不变化。 var a = true;//boolean function arr(argument) { argument = false; console.log(argument); } arr(a);//false console.log(a);//true var b = 1;//number function num(argument){ argument = argument-1; console.log(argument); } num(b);//0 console.log(b);//1 var c = undefined; function und(argument){ argument = 1; } und(c);//1 console.log(c);//undefined var d = "asdf";//string function str(argument){ argument = argument.slice(1,2); console.log(argument); } str(d);//s console.log(d);//asdf
②引用类型。
引用类型通常叫做类(class)。
object、array。
引用类型的值存储在 内存中的栈区和堆区。
var a = {}. var b=a;
赋值给b的实质上堆区的一个指针,指向a对象的值。
所以,当a的值改变时,b的值也会随之改变。
var e = {};//obiect var f = e; function obj(argument){ argument.name = "onject"; console.log(e.name); } obj(e);//onject console.log(e.name);//onject console.log(f.name);//onject