6.JavaScript-引用类型

 1.Object 类型 

var person = new Object(); 
person.name = "Nicholas";
 person.age = 29

  用对象字面量表示法: 

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

在使用对象字面量语法时,属性名也可以使用字符串,如下面这个例子所示

var person = {     
  "name" : "Nicholas",   
  "age" : 29,   
   5 : true 
};

使用对象字面量语法时,如果留空其花括号,则可以定义只包含默认属性和方法的对象,如 下所示: 

var person = {};         //与 new Object()相同 
person.name = "Nicholas"; 
person.age = 29; 

2. Array 类型 

 数组的每一项可以保存任何类型的数据。 数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容 纳新增数据

创建数组的基本方式有两种:

 a). 方式一:

var colors = new Array(); 
var colors = new Array(20); 
var colors = new Array("red", "blue", "green"); 

给构造函数传递一个值也可以创建数组。但这时候问题就复杂一点了,因为如果传递的是数 值,则会按照该数值创建包含给定项数的数组;而如果传递的是其他类型的参数,则会创建包含那个值 的只有一项的数组。下面就两个例子

var colors = new Array(3);       // 创建一个包含 3 项的数组 
var names = new Array("Greg");     // 创建一个包含 1 项,即字符串"Greg"的数组

在使用 Array 构造函数时也可以省略 new 操作符。如下面的例子所示,省略 new 操作符的 结果相同

var colors = Array(3);             // 创建一个包含 3 项的数组 
var names = Array("Greg");   // 创建一个包含 1 项,即字符串"Greg"的数组 

b).方式二:

使用数组字面量表示法。数组字面量由一对包含数组项的方括号表 示,多个数组项之间以逗号隔开,如下所示: 

var colors = ["red", "blue", "green"]; // 创建一个包含 3 个字符串的数组
var names = [];                      // 创建一个空数组 
var values = [1,2,];                  // 不要这样!这样会创建一个包含 2 或 3 项的数组 
var options = [,,,,,];                  // 不要这样!这样会创建一个包含 5 或 6 项的数组 

--------------------------------------------------------------------------------------------------------------------------------

在读取和设置数组的值时,要使用方括号并提供相应值的基于 0的数字索引,如下所示: 

var colors = ["red", "blue", "green"];  // 定义一个字符串数组
alert(colors[0]);                   // 显示第一项 
colors[2] = "black";                  // 修改第三项 
colors[3] = "brown";                  // 新增第四项 

--------------------------------------------------------------------------------------------------------------------------------

数组的 length 属性很有特点——它不是只读的。因此,通过设置这个属性,可以从数组的末尾移 除项或向数组中添加新项

var colors = ["red", "blue", "green"];     // 创建一个包含 3 个字符串的数组
colors.length = 2;
alert(colors[2]);                 //undefined 
 

这个例子中的数组 colors 一开始有 3个值。将其 length 属性设置为 2会移除后一项(位置为 2的那一项),结果再访问 colors[2]就会显示 undefined 了。如果将其 length 属性设置为大于数组 项数的值,则新增的每一项都会取得 undefined 值,如下所示: 

var colors = ["red", "blue", "green"];    // 创建一个包含 3 个字符串的数组 
colors.length = 4; 
alert(colors[3]);                 //undefined 

利用 length 属性也可以方便地在数组末尾添加新项,如下所示: 

var colors = ["red", "blue", "green"];    // 创建一个包含 3 个字符串的数组 
colors[colors.length] = "black";          //(在位置 3)添加一种颜色 
colors[colors.length] = "brown";          //(在位置 4)再添加一种颜色 

--------------------------------------------------------------------------------------------------------------------------------

检测数组 
 if (Array.isArray(value)){    

       //对数组执行某些操作

--------------------------------------------------------------------------------------------------------------------------------
 栈方法 (push ,pop)

push()方法可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。而 pop()方法则从数组末尾移除后一项,减少数组的 length 值,然后返回移除的项:

var colors = new Array();                  // 创建一个数组
var count = colors.push("red", "green");   // 推入两项 
alert(count);  //2 
 
count = colors.push("black");              // 推入另一项 
alert(count);     //3 
var item = colors.pop();                  // 取得最后一项
alert(item);      //"black" 
alert(colors.length);   //2 
 

 --------------------------------------------------------------------------------------------------------------------------------

队列方法 ( shift()和 push())

var colors = new Array();                   //创建一个数组 
var count = colors.push("red", "green");    //推入两项
 alert(count);  //2 
 
count = colors.push("black");               //推入另一项 
alert(count);     //3 
 
var item = colors.shift();                  //取得第一项
 alert(item);      //"red" 
alert(colors.length); //2 

用 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 

--------------------------------------------------------------------------------------------------------------------------------

重排序方法  reverse()和 sort()

concat()方法传递参数的情况下,它只是 复制当前数组并返回副本。如果传递给 concat()方法的是一或多个数组,则该方法会将这些数组中的 每一项都添加到结果数组中

--------------------------------------------------------------------------------------------------------------------------------

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 
 

 删除:可以删除任意数量的项,只需指定 2 个参数:要删除的第一项的位置和要删除的项数。 例如,splice(0,2)会删除数组中的前两项。

 插入:可以向指定位置插入任意数量的项,只需提供 3个参数:起始位置、0(要删除的项数) 和要插入的项。如果要插入多个项,可以再传入第四、第五,以至任意多个项。例如, splice(2,0,"red","green")会从当前数组的位置 2开始插入字符串"red"和"green"。

 替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定 3 个参数:起 始位置、要删除的项数和要插入的任意数量的项。插入的项数不必与删除的项数相等。例如, splice (2,1,"red","green")会删除当前数组位置 2 的项,然后再从位置 2 开始插入字符串 "red"和"green"。 splice()方法始终都会返回一个数组,该数组中包含从原始数组中删除的项(如果没有删除任何 项,则返回一个空数组)。下面的代码展示了上述 3种使用 splice()方法的方式。 

--------------------------------------------------------------------------------------------------------------------------------

indexOf()和 lastIndexOf()。返回索引。。

--------------------------------------------------------------------------------------------------------------------------------

迭代方法 

 every():对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回 true。
  filter():对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组。

 forEach():对数组中的每一项运行给定函数。这个方法没有返回值。

 map():对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。

 some():对数组中的每一项运行给定函数,如果该函数对任一项返回 true,则返回 true。 

var numbers = [1,2,3,4,5,4,3,2,1]; 
 
var everyResult = numbers.every(function(item, index, array){     return (item > 2);  }); 
 
alert(everyResult);    //false 
 
var someResult = numbers.some(function(item, index, array){     return (item > 2); }); 
 
alert(someResult);     //true 

以上代码调用了every()和some(),传入的函数只要给定项大于2就会返回true。对于every(), 它返回的是 false,因为只有部分数组项符合条件。对于 some(),结果就是 true,因为至少有一项 是大于 2的。 

filter()函数

var numbers = [1,2,3,4,5,4,3,2,1]; 
 
var filterResult = numbers.filter(function(item, index, array){     return (item > 2); }); 
 
alert(filterResult);  //[3,4,5,4,3] 

map()也返回一个数组,而这个数组的每一项都是在原始数组中的对应项上运行传入函数的结果。 

var numbers = [1,2,3,4,5,4,3,2,1]; 
 
var mapResult = numbers.map(function(item, index, array){     return item * 2; }); 
 
alert(mapResult);  //[2,4,6,8,10,8,6,4,2] 
 

forEach():

var numbers = [1,2,3,4,5,4,3,2,1]; 
 
numbers.forEach(function(item, index, array){     //执行某些操作 
 }); 
 

 reduce()和 reduceRight()的函数接收 4 个参数:前一个值、当前值、项的索引和数组对象:这 个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第 一个参数是数组的第一项,第二个参数就是数组的第二项。 

使用 reduce()方法可以执行求数组中所有值之和的操作,比如: 
var values = [1,2,3,4,5]; 
var sum = values.reduce(function(prev, cur, index, array){  
   return prev + cur; 
 });
 alert(sum); //15 
 

 

3.Date 类型 

 Date 类型是在早期 Java中的 java.util.Date 类基础上构建的。具体参考java 货js  api

4. RegExp 类型 

5.Function 类型 

函数实际 上是对象。每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。由于函 数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。

   函数内部属:

    在函数内部,有两个特殊的对象:arguments 和 this。其中,arguments , 它是一个类数组对象,包含着传入函数中的所有参数。虽       然 arguments 的主要用途是保存函数参数, 但这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。 

   函数内部的另一个特殊对象是 this,其行为与 Java和 C#中的 this 大致类似。换句话说,this 引用的是函数据以执行的环境对象——或者也可以说是 this 值(当在网页的全局作用域中调用函数时, this 对象引用的就是 window)。来看下面的例子。 


 window.color = "red"; var o = { color: "blue" }; 
 
function sayColor(){     
alert(this.color);
 } 
 
sayColor();     //"red"  
o.sayColor = sayColor; o.sayColor();   //"blue" 

sayColor()是在全局作用域中定义的,它引用了 this 对象。由于在调用函数之前, this 的值并不确定,因此 this 可能会在代码执行过程中引用不同的对象。当在全局作用域中调用 sayColor()时,this 引用的是全局对象 window;换句话说,对 this.color 求值会转换成对 window.color 求值,于是结果就返回了"red"。而当把这个函数赋给对象 o 并调用 o.sayColor() 时,this 引用的是对象 o,因此对 this.color 求值会转换成对 o.color 求值,结果就返回了"blue"。
 函数的名字仅仅是一个包含指针的变量而已。因此,即使是 在不同的环境中执行,全局的 sayColor()函数与 o.sayColor()指向的仍然是同一 个函数

 

=====================================================================================

函数是对象,因此函数也有属性和方法。每个函数都包含两个 属性: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 是保存它们所有实例方法的真正所在

toString()和 valueOf()等方法实际上都保存在 prototype 名下,只不过是通过各自对象的实例访 问罢了。在创建自定义引用类型以及实现继承时,prototype 属性的作用是极为重要的

每个函数都包含两个非继承而来的方法:apply()和 call()。这两个方法的用途都是在特定的作 用域中调用函数,实际上等于设置函数体内 this 对象的值。首先,apply()方法接收两个参数:一个 是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是 Array 的实例,也可以是 arguments 对象
 

function sum(num1, num2){     return num1 + num2; } 
 
function callSum1(num1, num2){ 
    return sum.apply(this, arguments);        // 传入 arguments 对象
 } 
 
function callSum2(num1, num2){   
  return sum.apply(this, [num1, num2]);    // 传入数组 
} 
 
alert(callSum1(10,10));   //20 
alert(callSum2(10,10));   //20

在上面这个例子中,callSum1()在执行 sum()函数时传入了 this 作为 this 值(因为是在全局 作用域中调用的,所以传入的就是 window 对象)和 arguments 对象。而 callSum2 同样也调用了 sum()函数,但它传入的则是 this 和一个参数数组。这两个函数都会正常执行并返回正确的结果。 
在严格模式下,未指定环境对象而调用函数,则 this 值不会转型为 window。 除非明确把函数添加到某个对象或者调用 apply()或 call(),否则 this 值将是 undefined。

call()方法与 apply()方法的作用相同,它们的区别仅在于接收参数的方式不同。对于 call() 方法而言,第一个参数是 this 值没有变化,变化的是其余参数都直接传递给函数。换句话说,在使用 call()方法时,传递给函数的参数必须逐个列举出来,如下面的例子所示

function sum(num1, num2){    
 return num1 + num2;
 } 
 
function callSum(num1, num2){   
  return sum.call(this, num1, num2);
 } 
 
alert(callSum(10,10));   //20 

传递参数并非 apply()和 call()真正的用武之地;它们真正强大的地方是能够扩充函数 赖以运行的作用域。下面来看一个例子。

window.color = "red"; var o = { color: "blue" }; 
function sayColor(){     alert(this.color); } 
sayColor();                //red 
sayColor.call(this);       //red 
sayColor.call(window);     //red
sayColor.call(o);          //blue 

=====================================================================================

基本包装类型:Number,String ,Boolean

 

 

转载于:https://my.oschina.net/u/2995989/blog/3017612

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值