原本打算一天更新一篇的,但是发现这样不现实。主要还是时间问题,准备blog的大纲需要不少时间以及平时工作比较忙。第一次写blog以为能每天更新,但发现技术类的blog很多深层次的问题不是一天能解决并且写出来的,所以以后还是每周尽量写两篇与大家分享。

  js中主要的复合数据类型有object和Array,Array其实是一种特殊数据类型,对于弱类型的js语言,Array有很多其他语言没有的特性。

  先讲Object类型,对象我个人理解就是基本数据和属性的结合体。所有对象的基类都是object。object中定义了constructor构造函数、toString、toLocaleString、hasOwnProperty、isPropertyEnumber、isPropertyOf。所有对象都继承这些函数,也可以重写。简单介绍下下面几个函数,hasOwnProperty(property):对象是否具有property属性;isPropertyEnumber(property):property属性是否可以枚举;isPropertyOf(object):判断该对象是否为传入对象的原型。当对象作为函数参数时,参数传入的是引用值,而不是拷贝值。对引用操作时,实际操作的是引用而不是实际的对象。

exp:  var oA={“name”:”jack”};

    var oB=oA;

    function changeName(oa){

      oa.name=”china”;

      oa={“name”:”steven”};  //=========操作对象时实际操作的是引用而不是实际对象

    }

    changeName(oA,oB);    //==========不会报错,函数参数是以数组的形式传递的

    alert(oA.name);  //output china==========操作对象时实际操作的是引用而不是实际对象

    alert(oB.name);  //output china==========当object作为函数参数时,传入的是引用的对象,而不是对象的拷贝值

并且js中是不能够直接访问对象的内存的,也就是说不能够直接操作对象的内存空间。

exp:  var sA=”welcome”;

    var sB=sA.concat(“ world!”);

    alert(sB);                  //output “welcome world!”

    alert(sB==eval(sA.concat(“ world!”)));   //output “true”,如果程序写成eval(sA.concat(“ world!”))==sB 将会报错因为无法直接访问sA.concat(“ world!”)这个字符串对象,自己体会

    alert(eval(sA.concat(“ world!”)));      //case error

    

  js中有3个内置对象:String、Date、Math。Date继承与java的Date类,不细说了。Math类呢是一个不能创建实例的一个类,提供给了一系列的数学算法。String类中除了constructor、prototype属性还有length属性。提供了一些方法如:indexOf()、lastIndexOf()、subString()、match()、slice()、toLowerCase()、toUpperCase()…

  Array数组是js中一个非常强大的数据结构,数据项中能够存储任何类型的数据结构,(可以每一项的数据类型都不一样)。并且length属性是可以变动的,它提供了类栈的操作push()、pop(),还有类队列的操作shift()、unshift()方法。还有reverse()将数组项反转的方法,同时提供了sort(comparsion)排序的方法(参数comparsion是一个比较函数,如果函数返回-1则两者交换位置,如果返回1或0时位置比变)。与String对象一样也有slice方法,具体方法就不细说了。

  Array中的增删改方法都是通过splice()来实现的它接收至少2个参数,如splice(0,2)表示删除从第0项开始的2个数组项,splice(2.0,”jack”)表示在第2项后插入”jack”新项,splice(2,1,”jack”,”steven”)表示删除第2项,然后在那位置插入”jack”、”steven”2项,注意js中函数的参数个数是没有限制的,因为函数的参数是以数组的形式传入。

  Array中迭代方法ever()、filter()、forEach()、map()、some()都接受2个参数,第1个参数是对每一项运行的函数,第2项是运行该函数的作用域。every()和some()都是检验数组项运行后返回true或者false,every是数组每一项都返回true时,返回ture,否则返回flase;some则是只要有一项检验后返回ture则返回ture,否则返回false。filter过滤函数,使原数组中的项运行参数函数后返回ture的项组成一个新的数组并且返回该数组。forEach()没有返回值,每项运行给定的函数。map()运行给定的参数函数,返回的结果组成新的数组。

  ECMA Script5中会有增加isArray方法来判断是不是数组,还有缩小数组的方法reduce()和reduceRight()。

​ 关于js的delete,详细可见kangax的文章http://perfectionkills.com/understanding-delete/,我总结了下就是delete可以删除对象的属性,不能删除声明的变量,但能删除直接赋值的变量,var a=”sa” 是不能删除的,如果b=”sa”,b是可以删除的,其实我们可以这样理解,直接赋值的变量在js中是全局变量,也可以将它当作window的一个属性,而属性是可以删除的。只要记住只要属性才可以delete。

  如果有问题希望网友指正。


一个好奇的人