ECMAScript4.1中心数据类及援类型的值

ECMAScript变量可能包含两栽不同之数据类型:基本数据类及援类型。基本数据列值得是概括的数据段,而引用类型值指的是那些或有多个价构成的目标。

于将一个值赋给变量时,解析器必须确定这价是基本数据类或者引用类型,有5备受基本数据类:undefined,null,boolean,number和string
。这5面临着力数据列是按值访问的,因为可以操作保存在变量中之实际值。

援类型的值保存在内存中的目标,与另语言不同,JavaScript不允许直接看内存中的职务,也就是说不可知直接操作对象的内存空间。再操作对象时,实际是于操作对象的援而休是事实上的目标,为是,引用类型的价值是按照引用访问的。

流动:在众多语言中,字符串是为目标的花样来代表的,因此让看是援引类型,但是ECMAScript放弃了就同习俗。

1.1动态性

概念基本数据列以及援类型值得方式是近乎之:创建一个变量并为该变量赋值。但是当这个价值保存至该变量中后,对不同的类型值可以推行之操作则大相径庭。引用类型可以增长、修改,删除属性与法。但是基本性能类型则未得以。

var person = new Object();

person.name = “lihui”;

alert(person.name);//”lihiui”

上述代码创建了一个对象并以那个保存在了变量person中。然后,我们呢该对象上加了一个name属性,并将lihui赋值上去,只想对象非销毁,这个特性就会见直接存在。

只是,我们无克给核心数据类上加属性,尽管这样做不见面导致其他错误。比如:

var   name = “lihui”;

name.age = 10;

alert(name.age);//undefined

 

1.2复制变量值

   
除了保留之法子不同外,在由一个变量想向外一个变量复制基本数据列及援类型值时,也是正在不同。基本数据类会被考别一卖放到一个初的内存中,但是引用类型则是复制了平卖才想与同块内存的指针。两者有充分十分之差别。

1.着力数据列复制

var number = 5;

var number2 = number;

number2 = 6;

alert(number); // 5

这个时number 和number2
是安全无提到之鲜只变量,分别在少个不等之内存空间,修改外一个变量,对另外一个还无影响。

2.引用类型复制

当从一个变量向其它一个变量复制引用类型的下,同样为会见拿积存于变量对象中的值复制一卖放到为新变量分配的上空被。不同之是,这个值得副本实际上是一个指南针,而这指针指向储存在堆中之一个对象,复制操作完后少只变量实际上引用和一个对象。因此,改变中一个变量,就会潜移默化其他一个变量。

var obj1 = new Object();

var obj2 = obj1;

obj1.name = “zhangsan”;

obj2.name = “lisi”;

alert(obj1.name);// lisi

 

3.传递参数

   ECMAScript
中持有的函数的参数都是本值传递的。也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到其他一个变量一样。基本数据类的传递如同基本数据类变量的复制一样,而引用类型的传递,则似乎引用类型变量的复制一样。

在向参数传递基本型的价值时,被传送的值会被复制给一个有变量,(即命名参数)。在朝着参数传递引用类型的价经常,会管此价当内存中之地址复制给一个有些变量,因此这部分变量的变化会反映在函数的外部。请看下的事例:

function addTen (num){

num += 10;

return num;

}

var count  = 20;

var result = addTen (count);

alert(count);  //20  没有转变

alert(result);   //30 

解说:这里的函数addTen()有一个参数num
,而参数实际上是函数的组成部分变量。在调用这个函数时,变量count作为参数为传送给函数,这个变量的价是20.于是,数值20于复制给参数num以便在addTen()中应用。在函数内部,参数num的价值为抬高了10,但是就无异变通不会见潜移默化函数外部的count变量。参数num和count互免相识,他们才是装有相同的价。假如num是据引用传递来说,那么变量count的价为将改为30,从而影响函数内部的修改。当然使用数值等核心数据类值来说明按值传递参数比较简单,但是要以对象,那么问题便聊好讲了。再推个例子:

function setName () {

obj.name = “Nicholas”;

var person  = new Object();

setName (person);

alert (person.name);   //  “Nicholas”

 

   
 以上代码创建一个目标,并将那保存于了变量person中。然后,这个变量被传送及setName
()函数中事后便让复制给了obj。在函数内部,obj和person
引用的凡暨一个对象。换句话说,及时是变量是遵循值传递的,obj也会见依照引用来拜访同一个目标。于是,当在函数内部也obj添加name属性后,函数外部的person也拿兼具体现;因为person指向的对象在积内存中只发生一个,而且是全局对象,有许多开发人员错误的看:在片作用域中改的对象见面当大局作用域中反映下,就印证参数是依引用传递的。为了说明对象是按值传递的,下面这个事例说明

function setName  (obj) {

     obj.name = “Nicholas”;

     obj = new Object();

     obj.name = “zhangsan”;

}

var person  = new Object();

setName (person);

alert (person.name);   //  “Nicholas”

4.检测项目

typeof 是检测变量类型的极品工具

var s = “Nicholas”;

var b = true;

var i = 22;

var u;

var n = null;

var o = new Object();

alert(typeof s);// string

alert(typeof i);// number

alert(typeof b);//boolean

alert(typeof u);//undefined

alert(typeof o); //object

常见,我们连无是怀念了解某值是目标,而是想清楚他是呀品种的对象。为者,ECMAScript提供了instanceof
操作符,其语法是:

result = variable instanceof constructor

建立则归TRUE;

alert(person instanceof Object);//变量person是 Object吗?
是的口舌返回true;

 

横流:这是自我自己之一个360ssp网站,需要点访问量,希望大家会能够点击访问一下,支持一下。http://078156.top