金沙棋牌官方平台

当前位置:金沙棋牌 > 金沙棋牌官方平台 > 数组和对象就像书和报纸一样,深入理解JavaScr

数组和对象就像书和报纸一样,深入理解JavaScr

来源:http://www.logblo.com 作者:金沙棋牌 时间:2019-10-11 00:33

JavaScript 数组和对象就像书和报纸一样

2017/05/26 · JavaScript · 对象, 数组

原文出处: Kevin Kononenko   译文出处:蔡耀冠   

简评:作者将 JavaScript 的数组和对象比喻为书和报纸,数组更注重顺序,而标签则对对象更重要。

如果你读书、看报,那么你会理解 JavaScript 的数组和对象之间的不同之处。

当你刚开始学 JavaScript 时,用哪一种方式组织和存储数据更好往往会让人困惑。

一方面,你可能在学习 “for” 循环的时候熟悉了数组。但是,一旦你尽可能多地将数据塞进数组,当你在检查你的代码的时候,你创造的乱七八糟的东西将会让你难以理解。

当你可以快速地决定每个结构的目标时,在对象和数组之间选择会简单得多。数组和书籍存储信息的方式相差无几,而对象则和报纸存储信息的方式差不多。

让我们来看看!

介绍

       JavaScript 中的对象

  

数组:数据的顺序是最重要的

这是超短篇小说的章节,以数组的形式。

JavaScript

var book = ['foreword', 'boyWhoLived', 'vanishingGlass', 'lettersFromNoOne', 'afterword'];

1
var book = ['foreword', 'boyWhoLived', 'vanishingGlass', 'lettersFromNoOne', 'afterword'];

好吧,我承认,这是《哈利波特》系列的第一本的前三章。这是数组的可视化的形式:

金沙棋牌官方平台 1当顺序成为组织信息的最重要的因素时你应该使用数组。没有人(我希望)这样看《哈利波特》的章节标题,“嗯…,那章看起来很有趣,让我跳到那!”章节的顺序告诉你下一章是什么。

当你从数组中检索信息时,你使用每个元素的下标。数组是从零开始索引的,这意味着从 0 开始计数而不是 1。

如果你想要访问下标为 0 的书籍数组,你要用:

JavaScript

books[0]

1
books[0]

然后你会得到:

JavaScript

'foreword'

1
'foreword'

如果你想得到这本书第三章的章节标题,你要用:

JavaScript

books[2]

1
books[2]

你会基于书的章节顺序来读下一章,而不是基于书的章节标题。

享元模式(Flyweight),运行共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类)。

JavaScript 中的所有事物都是对象:字符串、数值、数组、函数...

第2章JavaScript语法

对象:数据标签是最重要的

报纸可能看起来是这样的,以对象的形式。

JavaScript

var newspaper= { sports: 'ARod Hits Home Run', business: 'GE Stock Dips Again', movies: 'Superman Is A Flop' }

1
2
3
4
5
var newspaper= {
  sports: 'ARod Hits Home Run',
  business: 'GE Stock Dips Again',
  movies: 'Superman Is A Flop'
}

下面是以可视化的形式来看同样的数据。

金沙棋牌官方平台 2当你要基于数据标签来组织数据时,对象是最好的。当你看报纸时,你可能不会从前往后一页页地读。你会基于新闻标题来跳过特定的部分。无论在报纸的哪个地方,你都可以快速的跳过并且有合适的上下文。这和书不一样,书的章节顺序很重要。

对象通过键/值对来组织数据。看起来像这样:

JavaScript

key: value

1
key: value

如果你想要进入报纸的商业部分,你会使用这样的

JavaScript

newspaper[‘business’]

1
newspaper[‘business’]

或者:

JavaScript

newspaper.business

1
newspaper.business

这回返回 ‘GE Stock Dips Again’。所以,通过数据的标签(键)来访问数据是最简单的,你想要把数据存在对象里。

享元模式可以避免大量非常相似类的开销,在程序设计中,有时需要生产大量细粒度的类实例来表示数据,如果能发现这些实例除了几个参数以外,开销基本相同的 话,就可以大幅度较少需要实例化的类的数量。如果能把那些参数移动到类实例的外面,在方法调用的时候将他们传递进来,就可以通过共享大幅度第减少单个实例 的数目。

JavaScript 允许自定义对象。

本章内容

结合对象和数组

目前为止,我们只是在数组和对象中保存了 strings,你也可以保存其他类型的数据,比如 numbers 和 booleans,同时:

  1. 对象内的数组
  2. 数组中的对象
  3. 数组中的数组
  4. 对象中的对象

现在开始变复杂了。但是,你几乎只需要两种以扩展方式的组合来存储你的数据。当你一星期后回顾代码也想要理解。

让我们再看下书的例子。如果我们想要保存每章的页数会怎样呢?用对象来填满我们的数组可能是最好的。像这样:

JavaScript

var book =[ [‘foreword’, 14], [‘boywholived’, 18] ]

1
2
3
4
var book =[
  [‘foreword’, 14],
  [‘boywholived’, 18]
]

JavaScript

var book = [ {name:'foreword', pageCount: 14}, {name:'boyWhoLived', pageCount: 18}, {name:'vanishingGlass', pageCount: 13}, {name:'lettersFromNoOne', pageCount: 17}, {name:'afterword', pageCount: 19} ];

1
2
3
4
5
6
7
var book = [
  {name:'foreword', pageCount: 14},
  {name:'boyWhoLived', pageCount: 18},
  {name:'vanishingGlass', pageCount: 13},
  {name:'lettersFromNoOne', pageCount: 17},
  {name:'afterword', pageCount: 19}
];

我们维护了每章的顺序,现在我们可以叫出每章的特定的属性。所以,如果我们想要知道第二张的页数,我们可以用:

JavaScript

book[1][‘pageCount’]

1
book[1][‘pageCount’]

这会返回一个 18 的

现在假设你想知道你当地报纸每个栏目的顶级作者的排名,基于他们的资历。你可以在报纸对象中用一个数组来表达,像这样:

JavaScript

var newspaper= { sports: 'ARod Hits Home Run', sportsWriters: ['Miramon Nuevo', 'Rick Reilly', 'Woddy Paige'], business: 'GE Stock Dips Again', businessWriters: ['Adam Smith', 'Albert Humphrey', 'Charles Handy'], movies: 'Superman Is A Flop', moviesWriters: ['Rogert Ebert', 'Andrew Sarris', 'Wesley Morris'] }

1
2
3
4
5
6
7
8
var newspaper= {
  sports: 'ARod Hits Home Run',
  sportsWriters: ['Miramon Nuevo', 'Rick Reilly', 'Woddy Paige'],
  business: 'GE Stock Dips Again',
  businessWriters: ['Adam Smith', 'Albert Humphrey', 'Charles Handy'],
  movies: 'Superman Is A Flop',
  moviesWriters: ['Rogert Ebert', 'Andrew Sarris', 'Wesley Morris']
}

一个数组用来存储作者很合适,因为顺序很重要。你知道每个数组中靠前的作者排名更高。下标为 0 的作者是排名最高的。

你可以通过创建对象来优化报纸对象。比如,一个包含标题和作者列表的体育对象。但我会让你来尝试!

1 赞 2 收藏 评论

金沙棋牌官方平台 3

那么如果在JavaScript中应用享元模式呢?有两种方式,第一种是应用在数据层上,主要是应用在内存里大量相似的对象上;第二种是应用在DOM层上,享元可以用在中央事件管理器上用来避免给父容器里的每个子元素都附加事件句柄。

 

q 语句

享元与数据层

(一)数组

q 变量和数组

Flyweight中有两个重要概念--内部状态intrinsic和外部状态extrinsic之分,内部状态就是在对象里通过内部方法管理,而外部信息可以在通过外部删除或者保存。

 

q 操作符

说白点,就是先捏一个的原始模型,然后随着不同场合和环境,再产生各具特征的具体模型,很显然,在这里需要产生不同的新对象,所以Flyweight模式中常出现Factory模式,Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个Flyweight pool(模式池)来存放内部状态的对象。

数组对象的作用是:使用单独的变量名来存储一系列的值。

q 条件语句和循环语句

使用享元模式

 

q 函数与对象

让我们来演示一下如果通过一个类库让系统来管理所有的书籍,每个书籍的元数据暂定为如下内容:

创建数组创建数组,为其赋值,然后输出这些值。

本章将对JavaScript语法中最重要的一些概念进行简要的介绍。

复制代码 代码如下:

 

2.1        准备工作

ID
Title
Author
Genre
金沙棋牌官方平台,Page count
Publisher ID
ISBN

For...In 声明使用 for...in 声明来循环输出数组中的元素。

一个普通的文本编辑器和一个Web浏览器就足够了。

我们还需要定义每本书被借出去的时间和借书人,以及退书日期和是否可用状态:

 

用JavaScript编写的代码必须嵌在一份HTML/XHTML文档中才能得以执行。这可以通过两种方法做到。第一种方法是将JavaScript代码插入文档<head>部分的<script>标签间,如下所示:

复制代码 代码如下:

合并两个数组 - concat()如何使用 concat() 方法来合并两个数组。

金沙棋牌官方平台 4<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
金沙棋牌官方平台 5";
金沙棋牌官方平台 6<html>
金沙棋牌官方平台 7<head>
金沙棋牌官方平台 8金沙棋牌官方平台 9<script type="text/javascript">...
金沙棋牌官方平台 10         JavaScript goes here...
金沙棋牌官方平台 11</script>
金沙棋牌官方平台 12</head>
金沙棋牌官方平台 13<body>
金沙棋牌官方平台 14Mark-up goes here...
金沙棋牌官方平台 15</body>
金沙棋牌官方平台 16</html>
金沙棋牌官方平台 17

checkoutDate
checkoutMember
dueReturnDate
availability

 

更好的方法是先把JavaScript代码存入一个独立的文件——建议把.js作为这种文件的扩展名,再利用<script>标签的src属性指向该文件,如下所示:

因为book对象设置成如下代码,注意该代码还未被优化:

用数组的元素组成字符串 - join()如何使用 join() 方法将数组的所有元素组成一个字符串。

金沙棋牌官方平台 18<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
金沙棋牌官方平台 19";
金沙棋牌官方平台 20<html>
金沙棋牌官方平台 21<head>
金沙棋牌官方平台 22<script type="text/javascript" src="file.js">
金沙棋牌官方平台 23</script>
金沙棋牌官方平台 24</head>
金沙棋牌官方平台 25<body>
金沙棋牌官方平台 26Mark-up goes here...
金沙棋牌官方平台 27</body>
金沙棋牌官方平台 28</html>

复制代码 代码如下:

 

如果有兴趣试一下本章中的示例,可以用文本编辑器先创建一两个文件。首先,创建一个简单的HTML或XHTML文档框架,这个文件可以命名为诸如test.html之类的名称。这里的要点是,在这份文档中的<head>部分包含一个<script>标签,该标签的src属性设置为用文本编辑器将要创建的第二个文件的名字,比如example.js。

var Book = function( id, title, author, genre, pageCount,publisherID, ISBN, checkoutDate, checkoutMember, dueReturnDate,availability ){
   this.id = id;
   this.title = title;
   this.author = author;
   this.genre = genre;
   this.pageCount = pageCount;
   this.publisherID = publisherID;
   this.ISBN = ISBN;
   this.checkoutDate = checkoutDate;
   this.checkoutMember = checkoutMember;
   this.dueReturnDate = dueReturnDate;
   this.availability = availability;
};
Book.prototype = {
   getTitle:function(){
       return this.title;
   },
   getAuthor: function(){
       return this.author;
   },
   getISBN: function(){
       return this.ISBN;
   },
/*其它get方法在这里就不显示了*/

文字数组 - sort()如何使用 sort() 方法从字面上对数组进行排序。

test.html应该包含如下所示的内容:

// 更新借出状态
updateCheckoutStatus: function(bookID, newStatus, checkoutDate,checkoutMember, newReturnDate){
   this.id  = bookID;
   this.availability = newStatus;
   this.checkoutDate = checkoutDate;
   this.checkoutMember = checkoutMember;
   this.dueReturnDate = newReturnDate;
},
//续借
extendCheckoutPeriod: function(bookID, newReturnDate){
    this.id =  bookID;
    this.dueReturnDate = newReturnDate;
},
//是否到期
isPastDue: function(bookID){
   var currentDate = new Date();
   return currentDate.getTime() > Date.parse(this.dueReturnDate);
 }
};

 

金沙棋牌官方平台 29<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
金沙棋牌官方平台 30";
金沙棋牌官方平台 31<html xmlns="" xml:lang="en">
金沙棋牌官方平台 32<head>
金沙棋牌官方平台 33<meta http-equiv="content-type"content="text/html;charset=gbk" />
金沙棋牌官方平台 34<title>Just a test</title>
金沙棋牌官方平台 35<script type="text/javascript" src="example.js">
金沙棋牌官方平台 36</script>
金沙棋牌官方平台 37</head>
金沙棋牌官方平台 38<body>
金沙棋牌官方平台 39</body>
金沙棋牌官方平台 40</html>

程序刚开始可能没问题,但是随着时间的增加,图书可能大批量增加,并且每种图书都有不同的版本和数量,你将会发现系统变得越来越慢。几千个book对象在内存里可想而知,我们需要用享元模式来优化。

数字数组 - sort()如何使用 sort() 方法从数值上对数组进行排序。

这一章的示例脚本仅只使用一个简单的对话框来显示消息。

我们可以将数据分成内部和外部两种数据,和book对象相关的数据(title, author 等)可以归结为内部属性,而(checkoutMember, dueReturnDate等)可以归结为外部属性。这样,如下代码就可以在同一本书里共享同一个对象了,因为不管谁借的书,只要书是同一本书,基本信息是一样的:

 

如果改变了example.js文件的内容,只需在Web浏览器中重新加载test.html文档即可查看到其执行效果。

复制代码 代码如下:

 

程序设计语言分为解释型和编译型两大类。Java或C++等语言需要一个编译器(complier)。编译器是一种能够把用Java等高级语言编写出来的源代码翻译为直接在计算机上执行的二进制可执行文件的程序。

/*享元模式优化代码*/
var Book = function(title, author, genre, pageCount, publisherID, ISBN){
   this.title = title;
   this.author = author;
   this.genre = genre;
   this.pageCount = pageCount;
   this.publisherID = publisherID;
   this.ISBN = ISBN;
};

1、数组的基本概念
   数组 是在内存空间中连续存储的一组有序数据的集合。
  元素在数组中的顺序,称为下标。可以使用下标访问数组的每个元素。

解释型程序设计语言不需要编译器——它们仅需要解释器。对于JavaScript语言,Web浏览器将负责完成有关的解释和执行工作。浏览器中的JavaScript解释器将直接读入源代码并加以执行。如果没有解释器,JavaScript代码将无法得到执行。

定义基本工厂

2、如何声明一个数组?
   ① 使用自变量声明:var arr=[]

如果用编译型程序设计语言编写的代码包含着错误,那些错误在代码编译阶段就会被发现并报告。对于解释型程序设计语言,代码中的错误只有等到解释器实际执行到有关代码时才会被发现并报告。

让我们来定义一个基本工厂,用来检查之前是否创建该book的对象,如果有就返回,没有就重新创建并存储以便后面可以继续访问,这确保我们为每一种书只创建一个对象:

在JS中同一数组可以存储各种数据类型。

JavaScript的优点之一是比较容易学习和掌握,但千万不要因此而小看JavaScript能力:它能够完成许多相当复杂的编程任务。不过,本章将只介绍它的最基本的语法和用途。

复制代码 代码如下:

② 使用new关键字声明 、;var arr=new Array(参数);
参数可以是:
a. 参数省略表示创建一个空数组
b. 参数直接放一个整数,表示声明一个数组的长度为指定长度的数组
但是length可以随时可变,可增加。

2.2        语法

/* Book工厂 单例 */
var BookFactory = (function(){
   var existingBooks = {};
   return{
       createBook: function(title, author, genre,pageCount,publisherID,ISBN){
       /*查找之前是否创建*/
           var existingBook = existingBooks[ISBN];
           if(existingBook){
                   return existingBook;
               }else{
               /* 如果没有,就创建一个,然后保存*/
               var book = new Book(title, author, genre,pageCount,publisherID,ISBN);
               existingBooks[ISBN] =  book;
               return book;
           }
       }
   }
});

c. 参数为逗号分隔的多个数值,表示数组的多个值。
new array() ==[1,2,3]

英语是一种解释型的语言。在阅读和处理别人用英语写出来的文字时,阅读者本人就相当于一个英语解释器。只要作者遵守了英语的语法规则,他想表达的意思就可以被阅读者正确地解读出来。语法(syntax)的广义含义包括语句,单词,标点符号等各个方面,它的狭义含义则特指语句结构方面的各项规则。在接下来的讨论中,我们使用的是“语法”这个词的狭义含义。

管理外部状态 外部状态,相对就简单了,除了我们封装好的book,其它都需要在这里管理:

3、数组中元素的读写/增删?
1.读写;通过下标访问元素。下标从0开始 arr[1]="we2e212123123"
2.增删;i. 使用delete关键字,删除数组的某一个值,删除之后数组的长度不变
对应 位置变为undefined。 例:delete arr[1];
ii. 使用arr.pop()删除数组中的最后一个值。相当于 arr.length -= 1 ;
iii. 使用arr.shift()删除数组的第一个值。

JavaScript语言的语法与Java和C++等其他一些程序设计语言的语法非常相似。

复制代码 代码如下:

f . 使用arr.unshift(值) 在数组的开头新增一个值;
ff. 使用arr.push(值) 在数组的最后一个位置新增一个值;
fff. 使用arr[数值] 直接访问数组没有达到的下标,可以动态追加;
例 arr[100]="1" 中间如果有空余下标将存入undefined;

2.3        语句

/*BookRecordManager 借书管理类 单例*/
var BookRecordManager = (function(){
   var bookRecordDatabase = {};
   return{
       /*添加借书记录*/
       addBookRecord: function(id, title, author, genre,pageCount,publisherID,ISBN, checkoutDate, checkoutMember, dueReturnDate, availability){
           var book = bookFactory.createBook(title, author, genre,pageCount,publisherID,ISBN);
            bookRecordDatabase[id] ={
               checkoutMember: checkoutMember,
               checkoutDate: checkoutDate,
               dueReturnDate: dueReturnDate,
               availability: availability,
               book: book;

4、数组中的其他方法(重要)
1 .join("符号")将数组用指定分隔符链接为字符串,当参数为空时,默认用逗号分隔;
2. cincat():【原数组不会被改变】将数组与两个或多个数组的值,连接为新数组;
concat()连接时,如果有二维数组,则至多能拆一层[]
[1,2].concat([3,4],[5,6]) ->[1,2,3,4,5,6]
[1,2].concat([3,4,[5,6]]) ->[1,2,3,4,[5,6]]

用JavaScript或任何一种其他程序设计语言编写出来的脚本都是由一系列指令构成的,这些指令称为语句(statement)。只有按照正确的语法编写出来的语句才能得到正确的解释。

           };
       },
    updateCheckoutStatus: function(bookID, newStatus, checkoutDate, checkoutMember,     newReturnDate){
        var record = bookRecordDatabase[bookID];
        record.availability = newStatus;
        record.checkoutDate = checkoutDate;
        record.checkoutMember = checkoutMember;
        record.dueReturnDate = newReturnDate;
   },
   extendCheckoutPeriod: function(bookID, newReturnDate){
       bookRecordDatabase[bookID].dueReturnDate = newReturnDate;
   },
   isPastDue: function(bookID){
       var currentDate = new Date();
       return currentDate.getTime() > Date.parse(bookRecordDatabase[bookID].dueReturnDate);
   }
 };
});

  1. .pop()删除数组中的最后一个值。相当于 arr.length -= 1 ; 返回被删除的值
    .push(值) 在数组的最后一个位置新增一个值; 返回新数组长度
    .shift()删除数组的第一个值。
    .unshift(值) 在数组的开头新增一个值;

英语语法要求每个句子必须以一个大写字母开头,以一个句号结尾。JavaScript在这方面的要求不那么严格,程序员只需简单地把各条语句放在不同的行上就可以分隔它们,如下所示:

通过这种方式,我们做到了将同一种图书的相同信息保存在一个bookmanager对象里,而且只保存一份;相比之前的代码,就可以发现节约了很多内存。

!!!上述方法会改变原数组的值

金沙棋牌官方平台 41first statement
金沙棋牌官方平台 42second statement

享元模式与DOM

  1. reverse()原数组被改变,将数组反转倒叙输出。

  2. slice(begin,end) 原数组不会被改变, 截取数组中的某一部分,并返回新数组,
    》>>传入一个参数,表示开始区间,默认将截取到数组最后;
    》》 传人两个参数,表示开始和结束的下标(包含begin不含end) ;
    》》 两个参数可以为负数,表示从右边开始数,最后一个值为-1;

如果你想把多条语句放在同一行上,就必须像下面这样用分号来分隔它们:

关于DOM的事件冒泡,在这里就不多说了,相信大家都已经知道了,我们举两个例子。

!!! 6. sort():【原数组被改变】将数组进行升序排列。
i. 默认情况下,会按每个元素首字母ASCII码值进行排列
[3,1,5,12] -> [1,12,3,5]

金沙棋牌官方平台 43first statement;second statement;

例1:事件集中管理

ii.可以传人一个比较函数,手动指定排序的函数算法;
函数将默认接收两个值a,b 如果函数返回值>0,则证明a>b.

即使没有把多条语句放在同一行上,但在每条语句的末尾加上一个分号,也是一种良好的编程习惯:

举例来说,如果我们又很多相似类型的元素或者结构(比如菜单,或者ul里的多个li)都需要监控他的click事件的话,那就需要多每个元素进行事件绑定,如果元素有非常非常多,那性能就可想而知了,而结合冒泡的知识,任何一个子元素有事件触发的话,那触发以后事件将冒泡到上一级元素,所以利用这个特性,我们可以使用享元模式,我们可以对这些相似元素的父级元素进行事件监控,然后再判断里面哪个子元素有事件触发了,再进行进一步的操作。

7. indexOf(value,index):返回数组中第一个value所在的下标,如果没有找到 返回-1;
lastIndex (value,index):返回数组中最后一个value所在的下标,如果没有找到 返回-1;
>>>如果没有指定index,则表示全数组查找value;
>>>如果指定了index,则表示从index开始,向后查找value。

金沙棋牌官方平台 44first statement;
金沙棋牌官方平台 45second statement;

在这里我们结合一下jQuery的bind/unbind方法来举例。

  1. forEach() 【IE8之前不支持】专门用于循环遍历数组,接收一个回调函数,回调函数接收两个参数,
    第一个为数组每一个值,第二个为数组下标;
    num.forEach(function(item,index){

这可以让代码更容易阅读。将每条语句单独占用一行的做法可以让你本人或其他程序员更容易追踪JavaScript脚本的执行流程。

HTML:

})

注释

复制代码 代码如下:

  1. map() 对数组的每一个值进行一一映射 ,使用方法与foreach相同。
    但是map有返回值,表示将原数组的每一个值操作后 ,返回一个新数组;

有时,需要在脚本中写出一些仅供参考或提示性信息,但并不希望JavaScript解释器真的去执行这样的语句。这种语句称为注释(comment)。

<div id="container">
   <div class="toggle" href="#">更多信息 (地址)
       <span class="info">
          这里是更多信息
       </span></div>
   <div class="toggle" href="#">更多信息 (地图)
       <span class="info">
          <iframe src=";
       </span>
   </div>
</div>

var num1=num.map(function(item,index){
return item-1
})

注释语句非常有用,它们可以让你把编写代码时的一些想法和考虑记载下来供今后参考,还可以帮助你追踪有关代码的执行流程。类似于日常生活中的便条,注释语句可以帮助程序员跟踪和追查在脚本中发生的事情。

JavaScript:

5、二维数组与稀疏数组(了解)

有多种在JavaScript脚本中插入注释的具体做法。例如,如果使用了两个斜杠作为一行的开头,这一行就将被解释为一条注释:

复制代码 代码如下:

  1. 二维数组:数组中 值,依然是一个数组形式。
    eg: arr=[[1,2,3],[4,5]]
    读取二维数组 arr[i][j] 行、列
    2.稀疏数组:数组中的索引是不连续的。(length要比数组中实际的元素个数大)

金沙棋牌官方平台 46//Note to self:comments are good.

stateManager = {
   fly: function(){
       var self =  this;
       $('#container').unbind().bind("click", function(e){
           var target = $(e.originalTarget || e.srcElement);
           // 判断是哪一个子元素
           if(target.is("div.toggle")){
               self.handleClick(target);
           }
       });
   },

6、基本数据类型和引用数据类型
1. 基本数据类型赋值时是将原变量中的值赋给另一个变量,修改其中一个,相互不影响。

如果使用这种记号方式,就必须在每行注释的开头加上两个斜杠。也就是说,像下面这样的做法是有问题的——第2行将不会被解释为一条注释:

   handleClick: function(elem){
       elem.find('span').toggle('slow');
   }
});

  1. 引用数据类型 赋值时是将原变量在内存中 的地址赋值给另一个变量,赋值完成后,
    两个变量中存储的是同一个内存地址,访问的是同一个数据,修改其中一个另一个也会变化。
  2. 数值型,字符串,布尔型等变量属于 基本数据类型
    数组,对象 属于引用数据类型。

金沙棋牌官方平台 47//Not to self:
金沙棋牌官方平台 48 comments are good.

例2:应用享元模式提升性能

 

如果你想写出两行注释,就必须把它们写成如下所示的样子:

另外一个例子,依然和jQuery有关,一般我们在事件的回调函数里使用元素对象是会后,经常会用到$(this)这种形式,其实它重复创建了新对象,因为本身回调函数里的this已经是DOM元素自身了,我们必要必要使用如下这样的代码:

 

金沙棋牌官方平台 49//Note to self:
金沙棋牌官方平台 50//comments are good.

复制代码 代码如下:

 

一条跨越多行的注释还可以用下面这个方式来给出:在整段注释内容的开头加上一个“/*”,在整段注释内容的末尾加上一个“*/”。下面是一个多行注释的例子:

$('div').bind('click', function(){
 console.log('You clicked: ' + $(this).attr('id'));
});
// 上面的代码,要避免使用,避免再次对DOM元素进行生成jQuery对象,因为这里可以直接使用DOM元素自身了。
$('div').bind('click', function(){
 console.log('You clicked: ' + this.id);
});

       对象

金沙棋牌官方平台 51金沙棋牌官方平台 52/**//*Note to self:
金沙棋牌官方平台 53 comments are good.*/

其实,如果非要用$(this)这样的形式,我们也可以实现自己版本的单实例模式,比如我们来实现一个jQuery.signle(this)这样的函数以便返回DOM元素自身:

 

还可以使用HTML风格的注释,但这种做法仅适用于单行注释。换句话说,JavaScript解释器对“<!-”的处理与对“//”的处理是一样的:

复制代码 代码如下:

 

<!-这是一个JavaScript的注释。

jQuery.single = (function(o){

自定义对象

这个注释如果是用于HTML文档中,还需要以“->”来结束这种注释语句,如下所示:

   var collection = jQuery([1]);
   return function(element) {

JavaScript 提供多个内建对象,比如 String、Date、Array 等等。

JavaScript不要求这样做,它会把“->”视为注释内容的一部分。

       // 将元素放到集合里
       collection[0] = element;

对象只是带有属性和方法的特殊数据类型。

请注意,HTML允许上面这样的注释跨越多行,但JavaScript要求这种注释的每行都必须在开头加上“<!-”来作为标志。

        // 返回集合
       return collection;

 

因为JavaScript解释器在处理这种风格的注释时与大家所熟悉的HTML做法不同,为避免发生混淆,强烈建议大家最好不要在JavaScript脚本中使用HTML风格的注释。如果没有特别的理由,用“//”记号给出单行注释,用“/**/”记号给出多行注释。

   };
 });  

创建 JavaScript 对象实例

一旦您有了对象构造器,就可以创建新的对象实例,就像这样:

var myFather=new person("Bill","Gates",56,"blue");
var myMother=new person("Steve","Jobs",48,"green");

2.4        变量

使用方法:

把属性添加到 JavaScript 对象

您可以通过为对象赋值,向已有对象添加新属性:

假设 personObj 已存在 - 您可以为其添加这些新属性:firstname、lastname、age 以及 eyecolor:

person.firstname="Bill";
person.lastname="Gates";
person.age=56;
person.eyecolor="blue";

x=person.firstname;

在以上代码执行后,x 的值将是:

Bill

在日常生活里,有些东西是固定不变的,有些东西则会发生变化。例如,人的姓名和生日是固定不变的,但心情和年龄却会随着时间的推移而发生变化。在谈论程序设计语言时,人们把那些会发生变化的东西称为变量(variable)。

复制代码 代码如下:

把方法添加到 JavaScript 对象

方法只不过是附加在对象上的函数。

在构造器函数内部定义对象的方法:

function person(firstname,lastname,age,eyecolor)
{
this.firstname=firstname;
this.lastname=lastname;
this.age=age;
this.eyecolor=eyecolor;

this.changeName=changeName;
function changeName(name)
{
this.lastname=name;
}
}

changeName() 函数 name 的值赋给 person 的 lastname 属性。

 

1.基本概念
①对象:拥有一系列无序属性和方法的集合。
②键值对:对象中的数据是以键值对的形式存在。对象的每个属性和方法,都对应一个键名,以键取值。
③属性:描述对象特征的一系列行为,称为属性。
④方法:描述对象行为的一系列函数,称为方法。

2.对象的声明:
① 字面量声明: var obj{
key1:value ,
key2:value ,
func1:function(){}
}
! 对象中的数据是以键值对形式储存,键与值之间,用:分隔,
!多个键值对之间 , 用逗号,分隔。
! 对象中的键可以是除了数组对象以外的任何数据类型。但是一般只用普通数据名。
! 对象中的值可以是任何数据类型。
!对象中的值可以是任何数据类型。包括数组和对象;

② 使用new关键字声明:var obj=new Object();
obj.key1=value1;
obj.func1=function(){};

3.对象中属性和方法的读写
1.运算符:
对象内部:this.属性 this.方法();
对象外部:对象名.属性 对象名.方法();
2.通过["key"]调用:对像名.["属性名"] 对像名.["方法名"]();

! 如果键中包含特殊字符,则只能使用第二种方式。
! 对象中直接写变量名,默认为全局变量。
如果要调用对象自身的属性或方法。需要使用对象名.属性,或者this.属性
(对象内部使用this 外部使用对象名)

3.删除对象的属性和方法:delete 对象名.属性名/方法名;

 

 

 

 

把值存入变量的操作称为赋值(assignment)。我把变量mood赋值为"happy",把变量age赋值为33。

$('div').bind('click', function(){
   var html = jQuery.single(this).next().html();
   console.log(html);
 });

     JavaScript 事件参考手册

下面是在JavaScript中对这些变量进行赋值的语法:

这样,就是原样返回DOM元素自身了,而且不进行jQuery对象的创建。

事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行。

mood="happy";

总结

 

HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。

FF: Firefox, N: Netscape, IE: Internet Explorer

属性 当以下情况发生时,出现此事件 FF N IE
onabort 图像加载被中断 1 3 4
onblur 元素失去焦点 1 2 3
onchange 用户改变域的内容 1 2 3
onclick 鼠标点击某个对象 1 2 3
ondblclick 鼠标双击某个对象 1 4 4
onerror 当加载文档或图像时发生某个错误 1 3 4
onfocus 元素获得焦点 1 2 3
onkeydown 某个键盘的键被按下 1 4 3
onkeypress 某个键盘的键被按下或按住 1 4 3
onkeyup 某个键盘的键被松开 1 4 3
onload 某个页面或图像被完成加载 1 2 3
onmousedown 某个鼠标按键被按下 1 4 4
onmousemove 鼠标被移动 1 6 3
onmouseout 鼠标从某元素移开 1 4 4
onmouseover 鼠标被移到某元素之上 1 2 3
onmouseup 某个鼠标按键被松开 1 4 4
onreset 重置按钮被点击 1 3 4
onresize 窗口或框架被调整尺寸 1 4 4
onselect 文本被选定 1 2 3
onsubmit 提交按钮被点击 1 2 3
onunload 用户退出页面 1 2 3

 

 

 

 

 

age=33;

Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度.应用场合很多:比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复的,那么我们可以将这些字符串储存在Flyweight池(pool)中。

把值赋给变量后,我们就可以说该变量包含这个值。例如,变量mood现在包含值“happy”,变量age现在包含值33.我们可以用如下所示的语句把这两个变量的值显示在一个弹出式警告窗口中:

如果一个应用程序使用了大量的对象,而这些大量的对象造成了很大的存储开心时就应该考虑使用享元模式;还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么就可以用相对较少的共享对象取代很多组对象,此时可以考虑使用享元模式。

alert(mood);

您可能感兴趣的文章:

  • 轻松掌握JavaScript享元模式
  • 总结JavaScript设计模式编程中的享元模式使用
  • 学习JavaScript设计模式之享元模式
  • JS实现简单的图书馆享元模式实例
  • js设计模式之结构型享元模式详解

alert(age);

默然说话:你可以把上面的四句代码依序写入example.js文件中,然后双击test.html文件(如果你已经打开了test.html文件,那只需要刷新一下就可以了,刷新之前,记得保存example.js哦!),就可以看到效果了。

下面是一个显示mood变量值的例子。

下面是一个显示age变量值的例子。

我们将在本书后面的章节中用变量做一些有用的事情,请大家耐心地阅读下去。

请注意,JavaScript允许程序员直接对变量进行赋值而无需提前对它们做出声明。这在许多程序设计语言中都是不允许的。有相当一部分程序设计语言要求在使用变量之前必须先对它做出“介绍”——术语称之为声明(declare)。

在JavaScript脚本中,如果程序员在对某个变量进行赋值之前未对其做出声明,赋值操作将自动声明该变量。虽然JavaScript没有要求程序员必须这么做,但提前对变量做出声明仍是一种良好的编程习惯。下面的语句对变量mood和age做出了声明:

var mood;

var age;

每次只声明一个变量的做法并不是绝对的,JavaScript也允许程序员用一条语句声明多个变量,如下所示:

var mood,age;

JavaScript也允许程序员把声明变量和对该变量进行赋值这两项操作合起来一次完成:

var mood="happy";

var age=33;

我们甚至还可以像下面这样做:

var mood="happy",age=33;

在JavaScript语言里,变量和其他语法元素的名字都是区分大小写的。名字是mood的变量与名字是Mood,MOOD或mOOd的变量没有任何关系,它们不是同一个变量。下面的语句是在对两个不同的变量进行赋值:

var mood="happy";

MOOD="sad";

默然说话:坚决禁用上面的这种变量命名方法,因为这样会导致我们对变量名的混淆和使用的错误!坚决禁用!

JavaScript变量名允许包含字母,数字,美元符号和下划线字符。不允许包含空格,所以下面这条语句将导致语法错误:

var my mood="happy";

为了让比较长的变量名有更好的可读性,可以在变量名中的适当位置插入一个下划线字符就像下面这样:

var my_mood="happy";

2.4.1数据类型

变量mood的值是字符串类型,变量age的值则是一个数值类型。虽然它们是两种不同的数据类型,但在JavaScript脚本中为它们做出声明和进行赋值的语法无任何区别。有些程序设计语言要求程序员在声明变量的同时还必须明确地对其数据类型做出声明,这种做法称为类型声明(typing)。

要求程序员必须明确地对数据类型做出声明的程序设计语言被称为强类型(strongly typed)语言。像JavaScript这样不要求程序员进行类型声明的语言则被称为弱类型(weakly typed)语言。所谓弱类型意味着程序员可以随意改变某个变量的数据类型。

下面这条语句在强类型语言中是非法的,但在JavaScript语言里却完全没有问题:

var age="thirty three";

age=33;

JavaScript并不关心变量age的值是字符串还是数值。

接下来,我们一起看看JavaScript语言中最重要的几种数据类型。

1.字符串

字符串由零个或多个字符构成。字符包括字母,数字,标点符号和空格。字符串必须放在引号里——单引号或双引号都允许使用。下面这两条语句有着同样的效果:

var mood='happy';

var mood="happy";

默然说话:上面这两条语句不能同时放到“example.js”中,这会导致一个语法错误:变量名重复!但你可以分两次,一次放一条,分别实验,这样你就会发现,这两条语句的效果是完全一样的。

var mood="don't ask";

上面这条语句中的字符串包含了单引号,就必须保证字母“n”和“t”之间的单引号能被解释为这个字符串的一部分。换句话说,必须保证这个单引号被解释为这个字符串里的一个字符,而不是被解释为这个字符串的结束标志。一般而言,只要在最外面使用双引号就可以了,同理,如果要在一个字符串里包含双引号,那就在最外面使用单引号就可以了。如下所示:

var mood='i say:"Happy!"';

但有一种特殊情况:我的字符串中既要包含单引号又要包含双引号,那应该怎么办呢?这个问题需要使用字符转义(escaping)功能来解决。在JavaScript语言中,对字符进行转义需要用到反斜杠字符,如下所示:

var mood='don/'t ask';

类似的,我们可以这样来完成既要包含双引号,又要包含单引号的字符串。

var height="about 5'10/" tall";

因为最外层使用了双引号,所以表示5英尺的单引号,就没有加反斜杠,而表示10英寸的双引号就加了一个反斜杠。

你们可以自己验证这一点:把下面这段代码添加到example.js文件中,然后重新加载test.html(双击这个文件或点刷新):

var height="about 5'10/" tall";

alert(height);

下面是用反斜杠字符对有关字符进行转义后的一个屏幕输出示例。

就个人而言,笔者比较喜欢用双引号来给出字符串。作为一种良好的编程习惯,不管你们选择的是双引号还是单引号,最好能在整个脚本中保持一致。如果在同一个脚本中一会儿使用双引号,一会儿又使用单引号,代码很快就会变得难以阅读和理解。

2.数值

如果想让某个变量包含一个数值,不用限定它必须是一个整数。JavaScript允许程序员使用带小数点的数值,并且允许数值是任意位数,这类数值称为浮点数(floating-point number):

var age=33.25;

还可以使用负数。负数表示方式是在有关数值的前面加上一个减号(-),如下所示:

var temperature=-20;

JavaScript并不要求负数必须是一个整数:

var temperature=-20.3333333;

3.布尔值

另一种重要的JavaScript数据类型是布尔(boolean)类型。

默然说话:布尔是什么?布尔是一个人,是他发明的逻辑运算,逻辑运算就是一类运算结果只会是“真”或者“假”的运算法则。所以布尔数据只有两种取值——true或false。假设需要这样一个变量:如果我正在睡觉,这个变量将存储一个值;如果我没有睡觉,这个变量将存储另一个值。可以用字符串数据类型来解决这个问题——只要根据具体情况把有关变量赋值为“sleeping”或“not sleeping”即可达到目的,但布尔数据类型显然是一个更好的选择:

var sleeping=true;

从某种意义上讲,为计算机设计程序就是与布尔值打交道。作为最基本的事实,所有的电子电路只能识别和使用布尔数据:电路中有电流或是没有电流。根据具体情况,这两种状态可以代表“真或假”,“是或否”或者“1或0”,但不管它们代表什么,这两种状态绝不可能同时出现——换句话说,在任意时刻只能使用两种可取值中的一种。

与字符串值不同,千万不要把布尔值用引号括起来。布尔值false与字符串值'false'或"false"是两回事!

下面这条语句将把变量married设置为布尔值true:

var married=true;

下面这条语句将把变量married设置为一个包含着单词"true"的字符串:

var married="true";

2.4.2数组

如果想用一个变量来存储一组值,就需要使用数组(array)。

数组是由名字相同的多个值构成的一个集合,集合中的每个值都是这个数组的元素(element)。例如,我们可以用名为beatles的变量来保存Beatles乐队全体四位成员的姓名。

在JavaScript脚本中,数组要用关键字Array来声明。在声明数组的同时,程序员还可以对这个数组的元素个数,也就是这个数组的长度(length)做出规定:

var beatles=Array(4);

有时我们无法提前预知某个数组最终会容纳多少个元素。这没有关系,JavaScript并不要求在声明数组时必须给出它的元素个数,我们完全可以在声明数组时不给出明确具体的元素个数:

var beatles=Array();

向数组中添加元素的操作称为填充(populating),它类似于变量的赋值操作,但在填充数组时,不仅需要给出新元素的值,还要在数组中为新元素指定存放位置,这个位置要通过数组名加下标(index)给出。数组里的每个元素都有一个相应的下标。在语句中,下标值必须放在方括号内,如下所示:

array[index]=element;

现在来填充刚才声明的beatles数组。我们将按照人们在提到Beatles乐队成员时的传统顺序(即John,Paul,George和Ringo)进行。首先是第一个下标和元素:

beatles[0]="John";

以0而不是1作为第一个下标值多少会让人感到有些不习惯,但JavaScript语言就是这么规定的,所以我们这里只能这么做。这一点很重要,但也很容易被忘记,初出茅庐的程序员在刚接触JavaScript数组时经常在这个问题上犯错误。

下面是声明和填充beatles数组的全过程:

var beatles=Array(4);

beatles[0]="John";

beatles[1]="Paul";

beatles[2]="George";

beatles[3]="Ringo";

有了上面这些代码,我们即可在脚本中通过下标值“2”(beatles[2])来检索取值为“George”的元素了。请注意,beatles数组的长度是4,但它最后一个元素的下标却是3。因为数组下标是从0开始计数的,你们或许需要一些时间才能习惯这一事实。

像上面这样填充数组未免有些麻烦。这里有一种相对简单的方式:在声明数组的同时对它进行填充。这么做时别忘记了用逗号把各个元素分隔开:

 

上面这条语句会为beatles数组中的每个元素自动分配一个下标:第一个下标是0,第二个是1,依此类推。因此,beatles[2]仍将对应于取值为“George”的元素。

我们甚至用不着明确地表明我们是在创建数组。事实上,只需用一对方括号把各个元素的初始值括起来就足以创建出我们想要的数组了:

金沙棋牌官方平台 54var beatles=["John","Paul","George","Ringo"];

不过,在声明或填充数组时写出Array关键字是一个良好的编程习惯,这可以提高JavaScript脚本的可读性,并让我们一眼就看出哪些变量是数组。

数组元素不必非得是字符串。可以把一些布尔值存入一个数组,还可以把一组数值存入一个数组:

金沙棋牌官方平台 55var years=Array(1940,1941,1942,1943);

甚至可以把三种数据类型混在一起存入一个数组:

金沙棋牌官方平台 56var lennon=Array("John",1940,false);

数组元素还可以是变量:

金沙棋牌官方平台 57var name="John";
金沙棋牌官方平台 58beatles[0]=name;

这将把beatles数组的第一个元素赋值为“John”;

数组元素的值还可以是另一个数组的元素。下面两条语句将把beatles数组的第二个元素赋值为“Paul”:

金沙棋牌官方平台 59var names=Array("Ringo","John","George","Paul");
金沙棋牌官方平台 60beatles[1]=names[3];

事实上,数组还可以包含其他的数组!数组中的任何一个元素都可以把一个数组作为它的值:

金沙棋牌官方平台 61var lennon=Array("John",1940,false);
金沙棋牌官方平台 62var beatles=Array();
金沙棋牌官方平台 63beatles[0]=lennon;

现在,beatles数组的第一个元素的值是另外一个数组。要想获得那个数组里的某个元素的值,我们需要使用更多的方括号。beastles[0][0]的值是“John”,beatles[0][1]的值是1940,beatles[0][2]的值是false。

这是一种功能相当强大的存储和获取信息的方式,但如果我们不得不记住每个下标数字的话,编程工作将是一种非常痛苦和麻烦的体验。还好,有一种办法可以让我们以更可读的方式去填充数组。

关联数组

beastles数组是数值数组的一个典型例子:每个元素的下标是一个数字,每增加一个元素,这个数字就依次增加1。第一个元素的下标是0,第二个元素的下标 1,依此类推。

如果在填充数组时只给出了元素的值,这个数组就将是一个数值数组,它的各个元素的下标将被自动创建和刷新。

我们可以通过在填充数组时为每个新元素明确地给出下标的方式来改变这种默认的行为。在为新元素给出下标时,不必局限于整数数字。数组下标可以是字符串:

金沙棋牌官方平台 64var lennon=Array();
金沙棋牌官方平台 65lennon[“name”]="John”;
金沙棋牌官方平台 66lennon[“year”]=1940;
金沙棋牌官方平台 67lennon[“living”]=false;

这称为关联数组(associative array)。用关联数组来代替数值数组的做法意味着,我们可以通过各元素的名字而不是一个下标数字来引用它们。这可以大大提高脚本的可读性。

您好:
    当您在阅读和使用我所提供的各种内容的时候,我非常感谢,您的阅读已是对我最大的支持。
    我更希望您能给予我更多的支持。
    1.希望您帮助我宣传我的博客,让更多的人知道它,从中获益(别忘记了提醒他们帮我点点广告,嘿嘿)。
    2.希望您能多提出宝贵意见,包括我所提供的内容中的错误,建设性的意见,更希望获得哪些方面的帮助,您的经验之谈等等。
    3.更希望能得到您经济上的支持。
   
    我博客上面的内容均属于个人的经验,所有的内容均为开源内容,允许您用于任何非商业用途,并不以付费为前提,如果您觉得在阅读和使用我所提供的各种内容的过程中,您得到了帮助,并能在经济上给予我支持,我将感激不尽。

    您可以通过点击我网站上的广告表示对我的支持。

    您可以通过银行转帐付款给我:
    招商银行一卡通:
    卡号:6225888712586894
    姓名:牟勇
   
    您也可以通过汇款的方式:
    通讯地址:云南省昆明市女子(28)中学人民中路如意巷1号
    收信人:陈谦转牟勇收
    邮编:650021
   
    无论您给予我怎么样的支持,我都衷心的再次感谢。
    欢迎光临我的博客,欢迎宣传我的博客
   
   
    EMail:mouyong@yeah.net
    QQ:11167603
    MSN:mouyong1973@hotmail.com

版权声明:本文为博主原创文章,未经博主允许不得转载。


本文由金沙棋牌发布于金沙棋牌官方平台,转载请注明出处:数组和对象就像书和报纸一样,深入理解JavaScr

关键词:

上一篇:没有了

下一篇:没有了