第五章 引用类型

一、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) //
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);     //

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

例如:

  

         var colors = new Array( );

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

         alert(count);        //

         count = colors.unshift( “black” );

         alert(count);        //

         var item = colors.pop( );

         alert(item);         //”green”

         alert(colors.length) ;         //

总结: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)
}
}

JS复习第五章的更多相关文章

  1. 读JS高级——第五章-引用类型 _记录

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Javascript高级程序设计复习——第五章引用类型 【原创】

    5.1  Object类型 1:创建Object实例的两种方式 ①new构造法 var obj1 = new Object(); 注意大写!不传递参数时可以省略圆括号 obj1.hehe = &quo ...

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

    2014.06.15 22:14 简介: 堆是一种非常实用的数据结构,其中以二叉堆最为常用.二叉堆可以看作一棵完全二叉树,每个节点的键值都大于(小于)其子节点,但左右孩子之间不需要有序.我们关心的通常 ...

  4. Unity 游戏框架搭建 2019 (五十二~五十四) 什么是库?&第四章总结&第五章简介

    在上一篇,我们对框架和架构进行了一点探讨.我们在这一篇再接着探讨. 什么是库呢? 来自同一位大神的解释: 库, 插到 既有 架构 中, 补充 特定 功能. 很形象,库就是搞这个的.我们的库最初存在的目 ...

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

    D3.js的v5版本入门教程(第五章) 1.选择元素 现在我们已经知道,d3.js中选择元素的函数有select()和selectAll(),下面来详细讲解一下 假设我们的<body>中有 ...

  6. CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章

    第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...

  7. JS复习--更新结束

    js复习-01---03 一 JS简介 1,文档对象模型 2,浏览器对象模型 二 在HTML中使用JS 1,在html中使用<script></script>标签 2,引入外部 ...

  8. 读《编写可维护的JavaScript》第五章总结

    第五章 UI层的松耦合 5.1 什么是松耦合 在Web开发中,用户界面是由三个彼此隔离又相互作用的层定义的: HTML是用来定义页面的数据和语义 CSS用来给页面添加样式 JavaScript用来给页 ...

  9. 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

    http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...

随机推荐

  1. mysql数据库主从搭建

    一.最近一直在学习mysql的东西,刚好看到mysql如何搭建主从数据库,搜集了很多资料后大致了解了mysql主从复置的原理.以下是我的理解: 举例master为主数据库,slave为从数据库. sl ...

  2. vue+webpack构建项目

    概述 -- 项目中会用到的插件 vue-router vue-resource 打包工具 webpack 依赖环境 node.js start 安装vue开发的模板 # 全局安装 vue-cli $ ...

  3. php7.0 和 php7.1新特性

    PHP7.1 新特性 1.可为空(Nullable)类型 类型现在允许为空,当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null .可以通过在类型前面加上一个问号来使之成为 ...

  4. HDU 5903 Square Distance

    $dp$预处理,贪心. 因为$t$串前半部分和后半部分是一样的,所以只要构造前一半就可以了. 因为要求字典序最小,所以肯定是从第一位开始贪心选择,$a,b,c,d,...z$,一个一个尝试过去,如果发 ...

  5. StringMVC(拦截器)

    单个拦截器 使用jar包 创建FirstController.java @Controller public class FirstController { @RequestMapping(" ...

  6. iOS开发系列-九宫格算法-xib

    给大家演示 应用程序下载 小项目,效果图:涉及知识点:懒加载,九宫格算法,字典转模型,自定义UIView ,xib文件的使用 首先把素材拖到Xcode项目中:简单看一下素材文件 此时大家应该首先关注. ...

  7. NEUQ1051: 谭浩强C语言(第三版)习题6.7

    //C代码简直难看到家,求大神知道如何写出复用性好的,维护性强的代码... //格式错误了好几次,最后发现是are和数字之间多了个空格......本来一直以为是最后的换行多了,费劲搞掉了. #incl ...

  8. PHP-FPM进程数的设定

    近日,服务器出现异常,网站不能正常访问.经排查是php的问题. 在重启php-fpm时,恢复正常.1分钟之后又出现故障.查看php日志文件 /usr/local/php/var/log 后提示 WAR ...

  9. ElasticSearch(7)-排序

    引用自ElaticSearch权威指南 一.排序 相关性排序 默认情况下,结果集会按照相关性进行排序 -- 相关性越高,排名越靠前. 这一章我们会讲述相关性是什么以及它是如何计算的. 在此之前,我们先 ...

  10. 李明杰的视频和李明杰的博客是学习OC的基础

    http://www.cocoachina.com/bbs/read.php?tid=196664