JS复习第五章

第五章 引用类型

一、Object类型

创建object实例的方式有两种。

第一种是使用new操作符后跟object构造函数,如下所示:

ver person = new Object( ) ;
person.name = “Nicholas” ;
person.age = 29 ;

另一种方式是使用对象字面量表示法:

var person =  {
    name : “Nicholas”,
    age : 29
} ;

对象字面量是向函数传递大量可选参数的首选形式。

function displayInfo(args){
    var output = "";
    if (typeof args.name == "string") {
        output += "Name:" + args.name + "\n";
    }
    if (typeof args.age == "number") {
        output += "Age:" + args.age + "\n";
    }
    alert(output);
}

displayInfo({
    name : "Nicholas",
    age : 29
});
displayInfo({
    name : "Greg"
})        

访问对象属性时使用的都是点表示法,如果属性名中包含会导致语法错误的字符,或者属性名使用的是关键字或者保留字,也可以使用方括号表示法。例如

var propertypeName = “name”;

alert(person[propertypeName]) ;

二、Array类型

创建数组的基本方式有两种,第一种是使用Array构造函数,如下面的代码所示:

var colors = new Array( );

可以省略new操作符。

第二种方式是使用数组的对象字面量。

var names = [ ];

var values = [ 1 , 2 ];

1.检测数组

Array.isArray( )方法。这个方法的目的是最终确定某个值到底是不是数组,而不管它是在哪个全局执行环境中创建的。

2.转换方法

如前所述,所有对象都具有toLocaleString( )、toString( )和valueOf( )方法。其中,调用数组的toString( )方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串。而调用valueOf( )返回的还是数组。

ver person1 = {
    toLocaleString : function(){
        return “Nikolaos”;
    },

    toString : function(){
        return “Nicholas”;
    },
} ;

var person2 = {
    toLocaleString : function(){
        return “Grigorios” ;
    },
    toString : function(){
        return “Greg”;
    }
};

var people = [person1 , person2];

alert(people);      // Nicholas , Greg

alert(people.toString());      // Nikolaos , Grigorios

alert(people.toLocaleString());       // Nicholas , Greg            

当直接传值给alert( )时,默认调用的是toString( )方法。

3.栈方法

数组的push( )和pop( )方法,可以让数组的行为类似于其他数据结构,表现的像栈一样。push( )方法可以接受任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。而pop( )方法则从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。

例如:

var colors = [“red” , “blue”] ;
colors.push(“black”);
alert(colors.length)      //3
alert(colors.po( ) )       //”black”

4.队列方法

队列在列表的末端添加项,从列表的前端移除项。实现这一操作的数组方法就是shift( ),它能够移除数组中的第一个项并返回该项,同时将数组长度减1。

  

var colors = ["red","green"];

colors.push("black");

colors.shift(“white”,”brown”)

alert(colors.length);

alert(colors.pop());     //black

alert(colors.shift());     //red

alert(colors.shift());     //green

alert(colors.length);     //0

  unshift( )方法与shift( )方法相反,它能在数组前端添加任意个项并返回新数组的长度,因此,同时使用unshift( )和pop( )方法,可以从相反的方向来模拟队列,即在数组的前端添加项,从数组的末端移除项。

例如:

  

         var colors = new Array( );

         var count = colors.unshift(“red”,”green”);

         alert(count);        //2

         count = colors.unshift( “black” );

         alert(count);        //3

         var item = colors.pop( );

         alert(item);         //”green”

         alert(colors.length) ;         //2

总结:unshift( )用来向数组前端添加项,push( )用来向数组后端添加项;shift( )用来移除最前端的项,pop( )用来移除最后端的项。

5.重排序方法

数组中,已经存在两个可以直接用来重排序的方法:reverse( )和sort( )。

reverse( )会反转数组的项排序,sort( )会按从小到大排序。

var values = [1 , 2 , 3 , 4 , 5];

values.reverse( );       // 5 , 4 , 3 , 2 , 1

values.sort( );          //1 , 2 , 3 , 4 , 5

6.操作方法

(1)concat( )方法 :可以基于当前数组中的所有项创建一个新的数组。如果没有传递参数,则只是简单的复制当前数组并返回副本,如果传递的是一个或多个数组,则该方法会将这些数组中的每一项都添加到结果数组中。如果传递的值不是数组,这些值就会被简单添加到结果数组的末尾。例如:

         var colors = [ “red” , “green” , “blue” ] ;

         var colors2 = colors.concat(“yellow” , [“black”,”brown”]);

         alert(colors);     //red , green , blue

         alert(colors2);    //red , green , blue , yellow , black , brown

(2)slice( )方法 :能够基于当前数组中的一个或多个项创建一个新数组。slice( )方法可以接受一或两个参数,即要返回项的起始和结束位置。在只有一个参数的情况下,slice( )方法返回从该参数指定位置开始到当前数组末尾的所有项。如果有两个参数,该方法返回其实和结束位置之间的项——但不包括结束位置的项。注意,slice( )方法不会影响原始数组。

例如:

         var colors = [“red” , “green” , “blue” , “yellow” , “purple”];

         var colors2 = colors.slice(1) ; 

         var colors3 = colors.slice(1 , 4) ;

         alert(colors2);    //green,blue,yellow,purple

         alert(colors3);    //green,blue,yellow

(3)splice( )方法 :使用的方式有以下三种

删除 :指定要删除的第一项的位置和要删除的项数就可以删除任意数量的项。

例如 :splice( 0 , 2 )会删除数组中的前两项。

插入 :提供三个参数——起始位置、0(要删除的项数)和要插入的项。

例如:splice( 2 , 0 , “red” , “green” )会删除当前数组位置2的项,然后再从位置2开始插入字符串“red”和“green”。

替换 :可以向指定位置插入任意数量的项,同时删除任意数量的项,只需指定3个参数——其实位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。

例如:splice( 2 , 1 , “red” , “green” )会删除当前数组位置2的项,然后再从位置2开始插入字符串“red”和“green”。

splice( )方法始终都会返回一个数组,该数组中包含从原始数组中删除的项。

7.位置方法

         indexOf( )和lastIndexOf( )。这两个方法都接受两个参数:要查找的项和表示查找起点位置的索引。其中,indexOf( )从数组的开头开始向后查找,lastIndexOf( )从数组的末尾开始查找。

8.迭代方法

数组的5个迭代方法,都接收两个参数:要在每一项上运行的函数和运行该函数的作用域对象——影响this的值。

(1)every( ) :如果该函数对每一项都返回true,则返回true。

(2)filter( ) :返回该函数会返回true的项组成的数组。

(3)forEach( ) :没有返回值。

(4)map( ) :返回每次函数调用的结果组成的数组。

(5)some( ) :如果该函数对任一项返回true,则返回true。

every( )必须每一项都返回true它才返回true;而some( )只要有一项返回true,它就返回true。

9.归并方法

reduce( )和reduceRight( )。这两个方法都会迭代数组的所有项。然后构建一个最终返回值。其中,reduce()方法从数组的第一项开始,逐个遍历到最后。而reduceRight( )则从数组的最后一项开始,向前遍历到第一项。

例如:

var values = [1 , 2 , 3 , 4 , 5];

var sum = values.reduce(function(prev , cur , index , array){

return prev + cur;

});

alert(sum) ;     //15

三、date类型

如果想根据特定的日期和时间创建日期对象,必须传入表示该日期的毫秒数,有两个方法:Date.parse( )、Date.UTC( )

四、function类型

1.函数名仅仅是指向函数的指针,因此函数名与包含对象指针的其他变量没有什么不同。2.函数没有函数重载,声明两个同名函数,第二个函数会覆盖第一个函数。

3.函数声明和函数表达式:

alert(sum(10 , 10)) ;

function sum(num1 , num2){

    return num1 + num2 ;

}

以上代码可以正常运行,因为在代码执行之前解析器会读取并将函数声明添加到执行环境中,对代码求值时,javascript引擎在第一遍会声明函数并将它们放到源代码树的顶部。

而下面的代码是错误的:

alert( sum(10 , 10) ) ;
var sum = function ( num1 , num2 ) {
    return num1 + num2 ;
}

原因在于函数位于一个初始化语句中,而不是一个函数声明。在执行到函数所在的语句之前,变量sum中不会保存有对函数的引用。

4.作为值的函数

函数名本身就是变量,因此函数可以像传递参数一样作为另一个函数的返回值。例如:

function callSomeFunction( someFunction , someArgument ){
    return someFunction( someArgument ) ;

}

5.函数内部属性

在函数内部,有两个特殊的对象:arguments和this。其中,arguments是类数组对象,包含着传入函数中的所有参数。它的callee属性时一个指针,指向拥有这个arguments对象的函数。

例如:

function factorial (num) {
    if(num <=1){
    return 1 ;
} else {
    return num*factorial (num -1) ;
    }
}

以上函数耦合度比较高,修改一个函数名必须要修改两次,改善后的代码为:

function factorial (num) {
    if(num <=1){
        return 1 ;
    } else {
    return num*arguments.callee(num -1)
    }
}    
时间: 2024-10-19 22:41:57

JS复习第五章的相关文章

数据结构期末复习第五章数组和广义表

数据结构期末复习第五章 数组和广义表 二维数组A[m][n]按行优先 寻址计算方法,每个数组元素占据d 个地址单元.     设数组的基址为LOC(a11) :LOC(aij)=LOC(a11)+((i-1)*n+j-1)*d     设数组的基址为LOC(a00) :LOC(aij)=LOC(a00)+( i*n+j )*d    二维数组A[m][n]按列优先 寻址计算方法,每个数组元素占据d 个地址单元.     设数组的基址为LOC(a11) :LOC(aij)=LOC(a11)+((j

《数据结构与算法分析:C语言描述》复习——第五章“堆”——二叉堆

2014.06.15 22:14 简介: 堆是一种非常实用的数据结构,其中以二叉堆最为常用.二叉堆可以看作一棵完全二叉树,每个节点的键值都大于(小于)其子节点,但左右孩子之间不需要有序.我们关心的通常只有堆顶的元素,而整个堆则被封装起来,保存在一个数组中. 图示: 下图是一个最大堆: 实现: 优先队列是STL中最常用的工具之一,许多算法的优化都要利用堆,使用的工具就是优先队列.STL中的优先队列通过仿函数来定义比较算法,此处我偷懒用了“<”运算符.关于使用仿函数的好处,我之后如果有时间深入学习S

[NOIP 2014复习]第五章:图论

一.最短路问题 1.图的存储方式 2.Floyd算法求多源最短路 3.Dijsktra算法求单源最短路 4.Bellman-Ford算法求单源最短路 5.SPFA求单源最短路 (1)Wikioi 1173 最优贸易 题目描述 Description [问题描述] C 国有n 个大城市和m 条道路,每条道路连接这n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路,双向通行的道路在统计条数时也计为1 条. C 国幅员

2014年软考程序员-常考知识点复习笔记【第五章】

51CTO学院,在软考备考季特别整理了"2014年软考程序员-常考知识点复习笔记[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考程序员-常考知识点复习笔记[汇总篇]  内部排序 考查你对书本上的各种排序算法及其思想以及其优缺点和性能指标(时间复杂度)能否了如指掌. 排序方法分类有:插入.选择.交换.归并.计数等五种排序方法. (1)插入排序中又可分为:直接插入.折半插入.2路插入(?).希尔排序.这几种插入排序

2017.12.8 软件工程-----第五章 总体设计(复习)

软件工程-----第五章 总体设计(复习) (1)概要 经过需求分析阶段的工作,系统必须"做什么"已经很清楚了,现在是决定"怎样做"的时候了.总体设计的基本目的是系统应该如何实现.他最重要的一项工作是设计软件结构.因此,总体设计又称为概要设计或初步设计.通过这个阶段的工作确定划分出组成系统的物理元素-----程序.文件.数据库.人工过程和文档. (2)设计过程 总体设计过程通常是有两个主要阶段组成:系统设计阶段,确定系统的具体实现方案:结构设计阶段,确定软件结构.

D3.js的v5版本入门教程(第五章)—— 选择、插入、删除元素

D3.js的v5版本入门教程(第五章) 1.选择元素 现在我们已经知道,d3.js中选择元素的函数有select()和selectAll(),下面来详细讲解一下 假设我们的<body>中有三个<p>,如下 <p>dog</p> <p>cat</p> <p>pig</p> <p>rat</p> 选择第一个元素<p> var p = d3.select("body&qu

CSS3秘笈复习:十三章&amp;十四章&amp;十五章&amp;十六章&amp;十七章

第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮动元素.关键字:left.right或both. (2).浮动外围元素:让包含浮动元素的<div>也浮动.选择这种方法一定要在浮动容器后面的任何元素中添加一个clear属性,确保浮动元素落到容器的下方. (3).利用overflow : hidden.另一种常见的方法是在外围的样式中添加以下属性:

ArcGIS API for JavaScript 4.2学习笔记[16] 弹窗自定义功能按钮及为要素自定义按钮(第五章完结)

这节对Popups这一章的最后两个例子进行介绍和解析. 第一个[Popup Actions]介绍了弹窗中如何自定义工具按钮(名为actions),以PopupTemplate+FeatureLayer的形式测量要素的长度为例子进行介绍. 第二个[Custom popup actions per feature]则是上一个的升级,如果说上一个例子的功能是写死的,那么这个例子就把这个功能写活了.什么意思呢?上个例子的测距仅仅能测距,没有什么别的特别的.而这个例子以啤酒店的分布(点要素图层)为例,在自

js高程笔记4-5章

第四章 变量/作用域和内存问题 1.从一个变量给另一个变量赋值时,如果是赋基本类型值,是创建一个值副本,两个变量操作互不影响.如果是赋引用类型值,是创建一个引用(指针)的副本.两个变量指向同一个对象,操作互相会影响. 2.函数传参时,如果传基本类型值,函数局部作用域修改值不会再全局作用域体现出来.传引用类型值,局部作用域修改对象会在全局作用域体现出来.P71 3.检测基本数据类型用typeof,检测引用类型值时,想知道是什么类型的对象,用instanceof. 4.js没有块级({})作用域,一