《JavaScript高级程序设计》笔记5:引用类型

Object类型

  • 创建object实例方式一:使用new操作符跟Object构造函数
var person = new Object();
person.name = "Nicholas";
person.age = 29;
  • 创建object实例方式二:使用对象字面量表示法(不会调用Object构造函数)
var person = {
  name : "Nicholas",
  age: 29
}

var person1 = {
  name : "Nicholas",
  age: 29,
  5 : true
}
//* 使用对象字面量表示法,属性名也可以用字符串。
//* 上面数值属性名5会自动转换为字符串。
//*  用person={}  ==> new Object()
  • 函数传参(需要多个可选参数时),最好做法是:对必须值使用命名参数,用对象字面量来封装多个可选参数。例子如下:
function dispalyInfo(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"
});

// displayInfo函数接收一个args参数。
//参数可能带有一个名为name或age属性,也可能这个两个属性都有或者没有。

Array类型

检测数组

使用instanceof操作符:

if (value instanceof Array){
  //对数组执行某些操作
}

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

if(Array.isArray(value)){
     //对数组执行某些操作
}

IE9+及以上,其它主流浏览器兼容。

转换方法

  • toLocaleString()方法
  • toString()方法
  • valueOf()方法
  • join()方法、
    前三种是所有对象都具有的方法。方法说明在本系列笔记3有详细说明。其中:调用数组的toString方法会返回数组中的每个值的字符串形式拼接而成的一个以逗号分隔的字符串
    而调用valueOf()返回仍然是数组。
var colors = ['red', 'blue', 'green'];
console.log(colors.toString());
console.log(colors.valueOf());
console.log(colors.toLocaleString());

2468166859-59301e4ab875a_articlex.png

另外toLocaleString()方法经常会返回跟toString()valueOf()方法相同的值。但也不是总如此。当调用数组的 toLocaleString()方法时,它也会创建一个数组值的以逗号分割的字符串。而与前两个方法唯一不同的是,这一次为了取得每一项的值,调用的每一项的toLocaleString()方法,而不是toString()方法。如下面例子:

var person1 = {
    toLocaleString: function(){
        return "Nikolaos";
    },
    toString: function(){
        return "Nicholaos";
    }
}
var person2 = {
    toLocaleString: function(){
        return "Grigorios";
    },
    toString: function(){
        return "Greg";
    }
}

var person = [person1,person2];
alert(person); //Nicholaos,Greg
alert(person.toString()); //Nicholaos,Greg
alert(person.toLocaleString());//Nikolaos,Grigorios

说明:由于alert()要接收字符串参数,所以它会在后台调用toString()方法,得到跟直接调用toString()方法一样的结果。

数组继承的toLocaleString()、toString()、valueOf()方法,在默认情况下都会以逗号分割的字符串的形式返回数组项。可以使用join()方法,则可以使用不同的分隔符来构建这个字符串。

join()方法
join() 方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。返回:一个字符串。

var colors = ['red','blue','green'];
console.log(colors.join(',')); //red,blue,green
console.log(colors.join('||')); //red||blue||green

栈方法(后进先出)

栈是一种LIFO(Last-In-First-Out,后进先出)的数据结构,也就是最新添加的元素最早被移除。

  • ArrayObj.push()方法
  • ArrayObj.pop()方法

ArrayObj.push():就是向数组末尾添加新的元素,返回的是:数组新的长度
ArrayObj.pop():就是向数组中删除数组最后一个元素并且:返回该元素。如果数组为空就返回:undefined

队列方法(先进先出)

  • ArrayObj.shift()
  • ArrayObj.unshift()

ArrayObj.shift():方法用于把数组中的第一个元素删除,并返回:第一个元素的值
ArrayObj.unshift():该方法可把它的参数顺序添加到数组的头部。它直接修改了数组,而不是创建一个新的数组。返回的:是新数组的长度
unshift()在IE6,IE7下,数据有添加成功,但返回值却是undefined。

重排序方法

  • reverse()方法
  • sort()方法
    reverse()方法会反转数组项的顺序。直接修改了数组,而不是创建一个新数组
var values = [1, 2, 3, 6, 5];
values.reverse();
alert(values);  //5,6,3,2,1

sort()方法按升序排列数组——即最小的值位于最前面,最大的值排在最后面。为了实现排序,sort()方法会调用每个数组项的toString()转型方法,然后比较得到字符串,以确定如何排序。即使数组中的每一项都是数组,sort()方法比较的也是字符串,如下所示:

var values = [0, 1, 5, 10, 15];
values.sort();
alert(values);  //0,1,10,15,5

sort()方法可以接受一个比较函数作为参数,以便我们指定那个值位于那个值的前面。

比较函数接受两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等,则返回0,如果第一个参数位于第二个之后则返回一个正数。以下就是一个简单的比较函数:

function compare(value1, value2) {
   if (value1 < value2) {
       return -1;
   } else if (value1 > value2) {
       return 1;
   } else {
       return 0;
   }
}

这个比较函数可以使用于大多数数据类型,只要将其作为参数传递给sort()方法即可,如下面这个例子所示:

var values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values);  //0,1,5,10,15

在将比较函数传递到sort()方法之后,数值仍然保持了正确的升序。当然,也可以通过比较函数产生降序排序的结果,只要交换比较函数返回的值即可:

function compare(value1, value2) {
   if (value1 < value2) {
       return 1;
   } else if (value1 > value2) {
       return -1;
   } else {
       return 0;
   }
}
var values = [0, 1, 5, 10, 15];
values.sort(compare);
alert(values);  //15,10,5,1,0

reverse()和sort()方法会返回值是经过排序之后的数组。

对于数值类型或者其valueOf方法会返回数值类型的对象类型,可以使用一个更简单的比较函数。这个函数只要用第二个值减第一个值即可:

function compare(value1, value2) {
   return value2 - value1;
}

由于比较函数通过返回一个小于零、等于零或大于零的值来影响排序结果,因此减法操作就可以适当处理所有情况。

操作方法

  • concat()方法
  • slice()方法
  • splice()方法

concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本

var a = [1,2,3];
console.log(a.concat(4,5)); //[1,2,3,4,5]
console.log(a) //[1,2,3]

//也可以多个数组
//arrObj1.concat(arrObj2,arrObj3);

简介slice()与splice()方法

slice(start,end)方法

start必需。规定从何处开始选取。负数:从数组尾部开始算起。-1是最后一个,-2指倒数第二个元素。
end可选。规定何处结束选取。可负数,同上。
返回:新数组。包含start到end(不包括在内)的arrayObj中的元素。

splice() 方法用于插入、删除或替换数组的元素
语法:arrayObj.splice(index, howmany, ele1, ......, eleX)

index 必需。规定从何处添加/删除元素。
必须数字,是开始插入或删除的数组元素下标。

howmany必需。规定删除多少元素。必须数字。可以为"0"。
未规定时。删除从index开始到原数组结尾的所有元素。

element1 可选。规定要添加到数组的新元素。从 index 所指的下标处开始插入。
elementX 可选。可向数组添加若干元素。

说明:splice()方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。

slice()与splice()方法:
slice(start, end); slice()方法返回从参数指定位置开始到当前数组末尾的所有项。如果有两个参数,该方法返回起死和结束位置之间的项,但不包括结束位置的项。

var colors = ["red", "green", "blue", "yellow", "purple"];
var colors2 = colors.slice(1);
var colors3 = colors.slice(1,4);

console.log(colors2); // green, blue, yellow, purple
console.log(colors3); // green, blue, yellow

splice()有删除,插入,替换的功能

  • 删除 - 需要两个参数,要删除的第一项的位置和要删除的项数。
    • 直接修改本数组。返回:删除元素的数组。
var colors = ["red", "green", "blue"];
var removed = colors.splice(0,2);
console.log(colors); // ["blue"]
console.log(removed); // ["red", "green"]
  • 插入 - 需要三个参数:起始位置、0(要删除的项数)和要插入的项
    • 直接修改本数组。返回:删除元素的数组。
var colors = ["red", "green", "blue"];
var removed = colors.splice(1,0,"yellow", "orange");
console.log(colors); // ["red", "yellow", "orange", "green", "blue"]
console.log(removed); // 返回空
  • 替换 - 需要三个参数:起始位置、要删除的项数和要插入的任意数量的项。
    • 直接修改本数组。返回:删除元素的数组。
var colors = ["red", "green", "blue"];
var removed = colors.splice(1,1,"yellow", "orange");
console.log(colors);  // ["red", "yellow", "orange", "blue"]
console.log(removed); // ["green"]

位置方法

  • indexOf()方法
  • lastIndexOf()方法

ECMAScript5为数组实例添加了两个位置方法:indexOf()lastIndexOf()。这两个方法都接收两个参数:要查找的项和(可选的)表示查找起点位置的索引。其中indexOf()方法从数组开头(位置0)开始向后查找,lastIndexOf()方法则从数组的末尾开始向前查找。

这两个方法都返回查找的项在数组中的位置,或者没有查找到的情况下返回-1。在比较第一个参数与数组中的每一项时,会使用全等操作符;也就是说要求查找的项必须严格相等(就像使用===一样)。

var numbers = [1,2,3,4,5,4,3,2,1];
console.log(numbers.indexOf(4));//3
console.log(numbers.lastIndexOf(4));//5
console.log(numbers.indexOf(4,4)); //5
console.log(numbers.lastIndexOf(4,4));//3
var person = {name:'Niccholas'};
var people = [{name:'Niccholas'}];
var morePeople = [person];
console.log(people.indexOf(person));//-1
console.log(morePeople.indexOf(person)); //0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容