JavaScript 数据类型和函数参数传递
1.数据类型
ECMAScript中有5种简单的数据类型:Undefined,Null,Boolean,Number,String.还有一种复杂的数据类型--Object(本质上是由一组无序的名值对组成的)。
我们可以将它们分为:
基本数据类型:保存在栈内存中的简单数据段,按值访问,操作的是他们实际保存的值。
引用数据类型:保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针指向内存堆中实际的值;按引用访问,当查询时,我们需要先从栈中读取内存地址,然后再顺藤摸瓜地找到保存在堆内存中的值。
![](https://img.haomeiwen.com/i8066565/fd975f3cede67cd6.jpg)
2.简单介绍六种数据类型
首先我们先一起来认识三个判断数据类型的操作符吧。
-
typeof操作符-用于检测给定变量的数据类型
"undefined"—未定义或未初始化的变量
"boolean" —布尔值
"string"—字符串
"number"—数值
"object"—对象或者null
"function"—函数 -
Instanceof用于检测引用类型
alert(person instanceof Object);
alert(arr instanceof Array);
alert(pattern instanceof RegExp);
- toString
toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]] 。这是一个内部属性,其格式为 [object Xxx] ,其中 Xxx 就是对象的类型。
对于 Object 对象,直接调用 toString() 就能返回 [object Object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。
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 的引用
(1)Undefined
Undefined类型只有一个值,即为特殊的undefined。
- 使用var 声明变量但是未初始化,这个变量就是undefined;
var patty;
alert(patty==undefined);//true
- 通过typeof返回数据类型时,未定义变量或变量没初始化都将返回undefined
var patty;
//var pattyecho
alert(typeof patty);//undefined
alert(typeof patyecho);//undefined
虽然上述两种情况都为undefined,但其本质上来说是不一样的。
这里要强调,未定义的变量不能被使用,否则报错,除了typeof var以外
(2)Null类型
Null类型是第二个只有一个值的数据类型,这个特殊的值为null。从逻辑角度来看,null值表示一个空对象指针,而这也正是typeof操作符检测到null值返回object的原因。例如:
var car = null;
alert(typeof car);//object
因此,若定义一个空的变量用于将来存储对象,初始化时最好使用null。
(3) Boolean类型
boolean类型在ECMAscript中用得比较多的一种类型,它只有两个值:true or false 。但是这两个数值不是一回事,其他语言可能为1真0假,但是这里不是这样的。下面是为变量赋boolean值的例子:
var found = true ;
var lost = false;
//注意:true 和 false 区分大小写。
ECMAScript中可以用Boolean()函数转化相应的值为boolean值。例如:
var message = "Hello World";
var messageBoolean = Boolean(message) //true
下面会讲解具体类型的值转化为对应boolean值的情况。
数据类型 | 为true | 为false |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | ""(空的字符串) |
Number | 任何非零数字值(包括无穷大) | 0或者NaN |
Object | 任何对象 | null |
Undefined | 不适用 | undefined |
(4)Number类型
整数
-
十进制:
var intNun = 44;//整数
-
八进制:
var octalNum1 = 070;//八进制的56
var octalNum2 = 079;//无效的八进制的数值-解析为79
-
十六进制:
var hexNum1 = 0xA; //十六进制的10
var hexNum2 = 0x1f ; //十六进制31
浮点数值
var floatNum1 = 1.1;
var floatNum2 = 2.3534e7 ; //e7代表10的7次幂,即为23534000
NaN
特殊的数值,它本身也不等于他本身
alert(NaN==NaN);//false
数值的转化
Number();//可用于任何数据
parseInt();//转化为整型
parseFloat();//转化为浮点型
(5) String类型
用于表示由零个或多个16位Unicode字符串组成的字符序列,即为字符串。通常用单引号('')或双引号("")表示,例如:
var firstName = "Li";
var lastName = 'hua';
字符字面量
转义字符 | 名称 |
---|---|
\n | 换行 |
\t | 制表 |
\r | 回车 |
\f | 进纸 |
\\ | 斜杠 |
\' | 单引号 |
\" | 双引号 |
\b | 退格 |
(6)Object类型
ECMAScript中的对象其实就是一组数据和功能的集合。
var o = new Object(); //创建一个新的对象
Object的每个实例都具有以下的属性和方法:
1.constructor:保存着用于创建当前对象的函数。
2.hasOwnProperty(propertyName):用于检测给定的属性在当前对象实例中是否存在。其中参数名必须以字符串形式指定,例如:
O.hasOwnproperty("name");
3.isPrototypeOf(object):用于检查传入对象是否是当前对象的原型。
4.propertyIsRnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句,与hasOwnProperty用法一样,参数名必须以字符串形式指定。
5.toLocaleString():返回对象的字符串表示。
6.valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法返回值相同。
3.基本和引用类型的复制
基本类型变量的复制:
从一个变量向一个变量复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的位置上,改变源数据不会影响到新的变量(互不干涉)
引用类型变量的复制:
复制的是存储在栈中的指针,将指针复制到栈中未新变量分配的空间中,而这个指针副本和原指针执行存储在堆中的同一个对象,复制操作结束后,两个变量实际上将引用同一个对象;因此改变其中的一个,将影响另一个
4.函数参数的传递
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量,在向参数传递引用类型的值时,会把这个值在内存的地址复制给一个局部变量
基本数据类型传递参数
var num=10;
function addTen(sum){
sum+=10;
return sum;
}
var res=addTen(num);
alert(num); //10
alert(res); //20
从上面的结果我们知道,num并没有改变,num和sum相当于只是值传递
引用类型传递参数
var oo=new Object();
function setName(obj){
obj.name="patty";
}
setName(oo);
alert(oo.name);//patty
我们可以看到对象oo也多了一个name属性,说明oo是引用传递
我们先讲这么多吧,欢迎大家指正错误!!!