js005-引用类型

js005-引用类型

数据类型分为基本类型和引用类型:基本类型值如下:Undefined、Null、Bollean、Number、String

本章内容:

1、使用对象

2、创建并操作数组

3、理解基本的javaScript类型

4、使用基本类型和基本操作类型

引用类型的值(对象)是引用类型的一个实例。引用类型是一种数据结构,和类看起来很相似。

引用类型如下:

5.1 Object类型

创建Object实例有两种方式:


1、 new


2、对象字面量


var obj1 = new Object();

obj1.name = "meimei";


var person{

name : "meimei";

age : 18;

}


var person = {}

person.name = "meimei";

person.age = 18;

5.2 Array 类型

这是除了Object之外最常用的类型。

创建数组的方式有两种:


1、使用Array构造函数


var colors = new Array();

var colors = new Array(20);//数组长度为20

var colors = new Array(“gread”);

//省略new操作符

var colors = new Array(3);

var name = Array("gread");


2、使用数组字面量表示方法


var colors = ["red", "blue", "yellow"];   //创建一个包换3个字符串的数组

var names = [];               //创建一个空数组

var values = [1,2,];           //别这样做,这样会创建一个2或者3项的数组。

var options = [,,,,];         //别这样,这样会创建一个5或者6项的数组


var colors = ["red", "blue", "yellow"];

alert(colors[0]);           //显示第一项

colors[2] = "black";        //修改第三项

colors[3] = "green";        //新增第四项

5.2.1 检测数组

Instanceof

5.2.2 转换方法


var colors = ["red", "blue", "yellow"]; //创建一个包含三个字符串的数组

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

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

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

5.2.3 栈方法

LIFO的数据结构


var colors = new Array();

var account = colors.push("red", "black");

alert(account);   //2

account = colors.push("yellow", "pink");

alert(account);   //4

var item = colors.pop();

alert(item);   //pink

5.2.4        队列方法

FIFO数据结构


var colors = new Array();

var account = colors.push("red", "black");

alert(account);   //2

account = colors.push("yellow", "pink");

alert(account);   //4

var item = colors.shift();

alert(item);   //red

alert(colors.length);

5.2.5        重排序方法


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

values.reverse();

alert(values);


反转数组项的顺序


var values = [1,20,10,36,5];

values.sort();

alert(values);   //1,10,20,36,5


sort()方法是进行升序排序。是进行字符串比较。会先调用toString()方法。一般不是最佳的方法。一般sort()方法接收一个比较函数作为参数比较好。

5.2.6        操作方法


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

var colors2 = colors.concat("yellow" , ["red", "green", "blue"]);

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

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


concat()方法


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

var colors2 = colors.slice(1);

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

alert(colors2);  //green,blue

alert(colors3);  //green


slice()

传入1,表示从数组下标为1的开始;

传入1,2表示从1开始到2结束


删除


可以删除任意数量的项,指定两个参数:要删除的第一项的位置和要删除的项数。如:splice(0, 2);  表示删除前两项


插入


可以向指定位置插入任意数量的项,提供三个属性:起始位置,0(要删除的项),要插入的项。如:splice(2, 0, “green” , “red”);


替换


可以向指定位置插入任意数量的项,同时删除任意数量的项。提供三个属性:起始位置,要删除的项,要插入的项。如:splice(2,2, “green” , “red”);在第二个位置(包括该项),删除两项后,插入green和red。

5.2.7        位置方法

两种位置方法


indexOf()


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

alert(numbers.indexOf(4));    //3

alert(numbers.lastIndexOf(4));    //5

alert(numbers.indexOf(4, 4));    //5

alert(numbers.lastIndexOf(4, 4));    //3

var person = {name :"meimei"};

var people = [{name :"meimei"}];

var morePeople = [person];

alert(people.indexOf(person));    //-1

alert(morePeople.indexOf(person))    //0


lastIndexOf()

5.2.8        迭代方法

以下是五个迭代方法


every()


对数组中的每一项运行给定函数,如果该函数每一项都返回true则返回true


filter()


对数组中的每一项运行给定函数,返回函数会返回true的项组成的数组


forEach()


对数组中的每一项运行给定函数,没有返回值


map()


对数组中的每一项运行给定函数,返回函数每次调用的结果组成的数组


some()


对数组中的每一项运行给定函数,如果该函数对任意一项返true,则返回true

5.2.9         归并方法


reduce()    reduceRight() 两种方法。相同点:

都会迭代数组的所有项,然后构建一个最终返回的值。都接收两个参数:一个在每一项上调用过得函数和(可选)作为归并基础的初始值。传给这两个函数接收的4个参数:前一个值、当前值、项的索引和数组对象。函数返回的任何值都会被作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数是数组的第二项;

不同点:


reduce()


从第一项开始,逐个遍历到最后


reduceRight()


从最后一项开始,逐个遍历到最前面

5.3 Date类型

创建一个日期对象,使用new操作符和Date构造函数

如下:

var now = new Date();   UTC时间1970年1月1日午夜0点

Date.parse()

使用+操作符取得Date对象的时间戳


var start = +new Date();

//调用函数

dosomething();

//取得停止时间

var stop = +new Date();

result = stop - start;

5.3.1 继承方法

5.3.2 日期格式化方法


toDateString()


以特定于实现的格式显示星期几、月、日、年


toTimeString()


以特定于实现的格式显示时、分、秒、时区


toLocaleDateString()


以特定于地区的格式显示星期几、月、日、年


toTimeeDateString()


以特定于实现的格式显示时、分、秒


toUTCString()


以特定于实现的格式完整的UTC日期

5.3.3 日期/时间组件方法

未完成


方法


说明

5.4 RegExp类型

ECMAScript通过RegExp类型来支持正则表达式

var expression = / pattern /flags;

其中pattern部分可以是任何简单或者复杂的正则表达式,可以包含字符类、限定类、分组向前查找以及方向引用。每个正则表达式可以带一个或者多个标志,用于


g


表示全局(global)模式,即模式将被英语与所有字符串,而非在发现第一个匹配项时立即停止;


i


表示不区分大小写(case-insensitive)


m


表示多行(multiline)模式

表明正则表达式的行为。正则表达式的匹配模式支持下列3个标志:

5.4.1 RegExp实例属性

RegExp的每个实例都具有下列属性:


global


布尔值,表示是否设置了g标志


ignoreCase


布尔值,表示是否i标志


lastIndex


整数,表示开始搜索下一个匹配项的字符位置,从0算起


multiline


布尔值,表示是否设置了m标志


source


正则表达式的字符串表示,按照字面量的形式而非传入构造函数的字符串欧式返回。

5.4.2 RegExp实例方法

RegExp对象的主要方法是exec(),该方法专门为捕获组而设计,接受一个参数


var text = "mom and dad and baby";

var patttern = /mom(and dad(and baby)?)?/gi;

var matches = patttern.exce(text);

alert(matches.index);  //0

alert(matches.input);  //"mom and dad and baby"

alert(matches[0]);     //"mom and dad and baby"

alert(matches[1]);     //"and dad and baby"

alert(matches[2]);     //"and baby"

5.4.3 RegExp构造函数属性

RegExp构造函数包含一些属性,这些属性适用于作用域中的所有正则表达式,并且基于所执行的最近一次正则表达式操作而变化。

下表为RegExp构造函数的属性


长属性名


短属性名


说明


input


$_


最近一次要匹配的字符串。Opera为实现此属性


lastMatch


$&


醉经一次的匹配项,Opera未实现此属性


lastParen


$+


最近一次匹配的捕获组。Opera未实现此属性


leftContext


$’


input字符串中的lastMatch之前的文本


multiline


$*


布尔值,表示是否所有表达式都是使用多行模式。IE和Opera未实现此属性


rightContext


$’


Input字符串中的lastMatch之后的文本

5.4.4 模式的局限性

ECMAScript正则表达式不支持的特性


匹配字符串开始和结尾的\A  和\Z 锚


向后查找(lookbehind)


并集和交集类


原子组


Unicode支持(单个字符除外)


命名的捕获组


s (single 单行)和x(free-spacing 无间隔)匹配模式


条件匹配


正则表达式注释

5.5 Function类型

函数实际上是对象。

函数通常是使用函数声明语法定义的,如下:


function add(num1 , num2){

var sum = num1 + num2;

return sum;

}

5.5.1 没有重载 (深入理解)


function addSomeNunber(num){

return num + 100;

}

function addSomeNunber(num){

return num + 200;

}

var result = addSomeNunber(100);  //300


var addSomeNunber = function(num){

return num + 100;

}

var addSomeNunber = function(num){

return num + 200;

}

var result = addSomeNunber(100);  //300


这两个例子声明了两个同名函数,结果是后面的函数覆盖了前面的函数。

5.5.2 函数声明和函数表达式


alert(sum(10,10));

function sum(num1,num2){

return num1 + num2;

}


alert(sum(10,10));

var sum = function(num1,num2){

return num1 + num2;

};

5.5.3 作为值的函数

函数名本身就是变量,所以函数也可以作为值来使用。就是可以把函数名像参数一样传给另一个参数

5.5.4函数内部属性

在函数内部有两个特殊对象:arguments和this。

arguments主要用途是保存函数参数,但是这个对象有个属性是callee,该属性是一个指针,指向拥有这个arguments对象的函数


function factorial(num){

if (num <= 1) {

return 1;

}else {

return num * factorial(num - 1);

}

}


如果函数名不变的话,这个方法是正确的。但是问题是这个函数的执行与函数名factorial紧密耦合在一起,未消除这种现象可以使用一下arguments.callee。


function factorial(num){

if (num <= 1) {

return 1;

}else {

       return num * arguments.callee(num - 1);

}

}


在重写的函数体内没有引用函数名factorial,这样无论函数名使用什么样的名字,都可以保证正常完成递归调用

5.5.4 函数属性和方法

每个函数都包含两个属性:length和prototype。其中length蛇形表示函数希望接收的命名参数的个数,如下例子


function sayName(name){

alert(name);

}

function sum(num1 , num2){

return num1 + num2;

}

function sayHi(){

alert("hi");

}

alert(sayName.length); //1

alert(sum.length);     //2

alert(sayHi.length);   //0

在传点自定义引用类型中,prototype属性是不可枚举的,因此for-in无法发现。

注:第五章未完成,函数那一块差不多看了一晚上。感觉上次讲课中,函数这一块讲的很多,还有原型prototype。比较难以理解。明天早上继续学习。

时间: 2024-10-13 01:14:57

js005-引用类型的相关文章

C# 引用类型之特例string

在C#编程的时候经常会使用字符串(string)类型,它也是引用类型,但是处处都不作为引用的用法来使用,实属特例,下来我一一罗列出来,供自己记忆方便: 1)字符串的直接赋值:本身字符串就是引用类型,应该使用  new 对象方法一个实例,但是微软为了方便大家,可以直接定义字符串变量 并且赋值操作,例如: string a = "我的中国心"; ,这样只是简化我们的操作: 2)一个字符串赋值给另一个字符串变量:正常的引用类型会将两个引用变量指向同一个地址,但是一个字符串变量赋值给另一个字符

JavaScript的进阶之路(三)引用类型之Object类型和Array类型

引用类型 Object类型 function a(num){ if(num>3){ a(--num); } console.log(num); } a(5); //如何创建对象的实例 var obj1= new Object(); console.log(obj1); obj1.name="吴琼"; obj1.age=28; console.log(obj1.name+" "+obj1.age); //对象字面量语法 ,有点封装的感觉 var obj2 = {

值类型与引用类型的区别

值类型 基本类型  4类8种 整型  byte   字节型   1长度   0~255 short  短整型   2长度 int      整型      4长度 long   长整型   8长度 浮点型  float     单精度浮点型 double 双精度浮点型 字符型  char  单字符型  数据必须包裹在单引号之间 波尔型  bool  逻辑型  true 真.对 /  false  假.错 枚举类型 结构体 引用类型               字符串   string  多个字符

java中四种引用类型(对象的强、软、弱和虚引用)

对象的强.软.弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分为4种级别,从而使程序能更加灵活地控制对象的生命周期.这4种级别由高到低依次为:强引用.软引用.弱引用和虚引用. ⑴强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出O

javascript中用来定义引用类型的一种&quot;默认&quot;模式

// 终极版:组合使用构造函数模式和原型模式:***************************** // 评价:集构造函数模式和原型模式之大成: 用来定义引用类型的一种默认模式 function Person(name, age, job){ //构造函数用来定义实例属性 this.name = name; this.age = age; this.job = job; this.friends = ["Shelby","Court"]; } Person.p

从一个简单例子来理解js引用类型指针的工作方式

? 1 2 3 4 5 6 7 <script> var a = {n:1};  var b = a;   a.x = a = {n:2};  console.log(a.x);// --> undefined  console.log(b.x);// --> [object Object]  </script> 上面的例子看似简单,但结果并不好了解,很容易把人们给想绕了--"a.x不是指向对象a了么?为啥log(a.x)是undefined?".&

C# 引用类型和值类型

1.引用类型 FCL(Framework)中的大多数类型都是引用类型,引用类型总是在托管堆中分配的,C#的new操作符会返回对象的内存地址,也就是指对象数据的内存地址.在使用引用类型时,存在以下性能问题,这是我们在开发中必须要注意的: a.内存必须从托管堆上分配(也就是说每new一个对象,会占用内存,对象过多就会导致内存占用) b. 堆上分配的每个对象都有一些额外的成员,这些成员必须初始化 c.对象中的其他字节(为字段而设),总是设为0 d.从托管堆中每分配一个对象,可能强制执行一次垃圾回收操作

定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型

为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会. 面向对象编程也叫做OOP编程 简单来说面向对象编程就是结构化编程,对程序中的变量结构划分,让编程更清晰. 类的概念: 类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法. 类定义了类的每个对象(称为实例)可以包含什么数据和功能. 类中的数据和函数称为类的成员:数据成员        函数成员 数据成员: 数据成员

基本类型、引用类型、基本包装类型和单体内置对象

基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象.基本包装类型和单体内置对象都是特殊的引用类型. 一.基本类型 基本类型包含Undefined.Null.Boolean.Number.String 这5种.基本数据类型是按值访问的,因为可以操作保存在变量中的实际值. 基本类型保存在内存中的栈中,大小固定,复制其变量时会创建这个值的一个副本.用typeof方法可以确定一个值是哪种基本类型. 二.引用类型 引用类型包括Object .Array.  Date.  RegExp.

方法的传递机制---引用类型传递

.Net里的方法是不能独立存在的,调用方法必须使用类或者对象作为主调用者.如果声明方法包含了形参声明,调用方法必须给这些形参指定参数值,调用方法时实际传递给形参的参数值被称为实参. 当引用类型作为参数传递到方法中是如何传递的呢?下面先看一下源码吧,猜猜输出的结果是什么? namespace Test { class Program { static void Main(string[] args) { Person person = new Person(); SetPerson(person)