Web前端之路

JavaScript 数据类型和函数参数传递

2017-11-07  本文已影响160人  卓三阳

1.数据类型

ECMAScript中有5种简单的数据类型:Undefined,Null,Boolean,Number,String.还有一种复杂的数据类型--Object(本质上是由一组无序的名值对组成的)。
我们可以将它们分为:
基本数据类型:保存在栈内存中的简单数据段,按值访问,操作的是他们实际保存的值。
引用数据类型:保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针指向内存堆中实际的值;按引用访问,当查询时,我们需要先从栈中读取内存地址,然后再顺藤摸瓜地找到保存在堆内存中的值。

memory.jpg

2.简单介绍六种数据类型

首先我们先一起来认识三个判断数据类型的操作符吧。

alert(person instanceof Object);
alert(arr instanceof Array);
alert(pattern instanceof RegExp);

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 patty;
alert(patty==undefined);//true
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 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是引用传递
我们先讲这么多吧,欢迎大家指正错误!!!

上一篇下一篇

猜你喜欢

热点阅读