JS高程4.变量,功能域和内存问题(1)

1.为主类型和应用项目标值

  ECMAScript变量可能含有二种不同数据类型的值:

  基本类型值——简单的数据段。(5种基本的数据类型,按值访问,因为可以操作保存在变量中的实际的值。)

  引用类型值——三个值构成的对象。(引用类型的值是保存在内存中的对象。)

注意:

  javascript不容许直接访问内存中的岗位,也就是不可以一贯操作对象的内存空间。在操作对象时,实际上是操作对象的引用,引用类型的值是按引用访问的。

说明:

  其实下边这种说法不严苛,但复制保存着对象时,操作的是目的的引用。不过为对象添加属性时,操作的是指标。

 

另:在不少言语中,字符串以目的来代表,由此被认为是引用类型的。ECMAScript丢弃了这一价值观。

 

(1)可以为引用类型的值动态地添加属性

eg:

1 var person=new Object(); //注意,Object的第一个字母为大写,如果小写会出现错误。
2     person.name="Linshuling";
3     alert(person.name);
4     </script>

图片 1

 

(2)复制变量值

  

  复制基本类型的值:

  eg:var num1=5;

    var num2=num1;

  如上的例证,num1和num2是一点一滴独立的,尽管它们的值都为5。

  

  复制引用类型的值:

  eg:

1  var obj1=new Object();
2     var obj2=obj1;
3     obj1.name="Linshuling";
4     alert(obj2.name);

图片 2

  如上,当一个变量向另一个变量复制引用类型的值是,同样也会将变量对象中的值复制一份放到位新变量分配的半空中中。不同的是,那些值的副本实际上是一个指南针,而以此指针指向存储在堆中的一个对象。复制操作停止后,多少个变量实际校官引用同一对象。因而,改变其中一个变量,就会影响另一个变量。

 

(3)传递参数

  ECMAScript中所用函数的参数都是按值传递的。(访问变量有按值和按引用二种,而参数只可以按值传递。)

  以下两个例证体会使用对象类型值的按值传递:

  eg:

  

1  function setName(obj){
2         obj.name="Linshuling";
3     }
4     var person=new Object();
5     setName(person);
6     alert(person.name);

图片 3

1  function setName(obj){
2         obj.name="Linshuling";
3         obj=new Object();
4         obj.name="lin";
5     }
6     var person=new Object();
7     setName(person);
8     alert(person.name);

图片 4

 

(4)检测项目

  用typeof操作符可以检测一个变量是何许基本数据类型,当变量的值是null和对象时,typeo操作符会再次回到“Object”。当我们想精通对象时咋样项目的目的时,可以用instanceof操作符。

语法如下:

  result = variable instanceof
constructor

即使变量是给定引用类型的实例,instanceof会重临true。

eg:

  

1 alert(person instanceof Object);   //变量person是Object吗?

 

注意:

  ECMA-262确定任何在其中贯彻[[Call]]办法的靶子都应有在利用typeof操作符时重临“function”,由于Safari
5及后面版本和Chrome
7及此前版本的正则表明式实现了那个措施,由此对正则表达式应用typeof会重临“function”,在ie和Firefox中,对正则表明式应用typeof会重临“Object”。