第四章 变量、作用域和内存问题(一 )

  1接上个文章说下重载的问题。ECMAScript函数不能像传统意义上那样实现重载

  2如果在ECMAScript中定义了两个名字相同的函数,改名字只属于后定义的函数

 

  3ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。

  4字符串是一对象的形式来表示,因此被认为是引用类型的但是ECMAScript放弃了这一传统。

 

  5动态的属性

引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法

//    引用类型的值添加属性
    var person = new Object();
    person.name = "Nicholas";
    alert(person.name);//Nicholas
    //创建了一个对象并将其保存在了变量perseon中,然后我们危改对象添加了一个名为name的属性,并将字符串值Nicholas赋给了这个
    //属性。接着,又通过弹窗访问了这个新属性,

  

var name = "Nicholas";
    name.age = 27;
    alert(name.age);//undefined 因为我们不能给基本类型的值添加属性

  6复制变量值

基本类型的值:如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到为新变量分配的位置上

 var num1 = 5;
    var num2 = num1;
    alert(num1);//5
    alert(num2);//5

  

var num1 = 5;
    var num2 = num1;
   var num2 = 3;
alert(num2);//3 由此可见两个不干扰
alert(num1);//5 由此可见两个不干扰

  引用类型的值:

当从一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。不同的是,这个值的副本实际上是一个指针,而这个指针指向存储在堆中的一个对象,复制操作结束后,两个变量实际上将引用同一个对象。因此,改变其中一个变量,将会影响另一个变量

    var obj1 = new Object();
    var obj2 = obj1;
    obj1.name = "Nicholas";
    alert(obj2.name);//Nicholas

  

    var obj1 = new Object();
    var obj2 = obj1;
    obj1.name = "Nicholas";
    obj2.name = "Jack";
    alert(obj2.name);//Jack
    alert(obj1.name);//Jack

  7传递参数

ECMAScript中所有函数的参数都是按值传递的。也就是说把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样

 

posted @ 2016-12-16 17:12  shenq2014  阅读(142)  评论(0编辑  收藏  举报