JavaScript大杂烩7 - 理解内置集合
var person = {
  name: 'Frank',
  age: 10
};
for(item in person) {
  if (person.hasOwnProperty(item)){
    alert(person[item]);
  }
}
var born = new Date("July 21, 1983 01:15:00");
document.write(born.toLocaleString());
这段代码会在页面上输出: 7/21/2014 5:15:00 PM
var o = {};
document.writeln(o.constructor); // function Object() { [native code] }
var f = function() {};
document.writeln(f.constructor); // function Function() { [native code] }
var i = 10;
document.writeln(i.constructor); // function Number() { [native code] }
从代码的输出可见,这些对象,包括函数对象自身都是使用函数作为构造函数实现的,所以可以使用new语法创建实例。
var o = {};
document.writeln(Function.prototype.isPrototypeOf(o)); // false
document.writeln(Object.prototype.isPrototypeOf(o)); // true
var f = function() {};
document.writeln(Function.prototype.isPrototypeOf(f)); // true
document.writeln(Object.prototype.isPrototypeOf(f)); // true
var i = 10;
document.writeln(Function.prototype.isPrototypeOf(i)); // false
document.writeln(Object.prototype.isPrototypeOf(i)); // false
var io = new Number(10);
document.writeln(Function.prototype.isPrototypeOf(io)); // false
document.writeln(Object.prototype.isPrototypeOf(io)); // true
从页面的输出可以看出:
var arr = ['Frank', 'Dong'];
// 比较神奇的地方
arr[3] = 'JavaScript';
for(var i = 0, len = arr.length; i < len; i++) {
alert(arr[i]);
}
数组通过[]访问,这个最正常不过了,不过JavaScript中实现的显然是动态的数组,不仅可以访问现有的值,还可以动态添加数据。
var arr = ['Frank', 'Dong'];
arr.push('C#', 'JavaScript');
alert(arr.pop());
alert(arr.length);
push方法一次可以添加任意数量的元素到集合末尾,修改集合的length值,并返回修改后的集合长度。
var arr = ['Frank', 'Dong'];
arr.push('C#', 'JavaScript');
alert(arr.shift());
alert(arr.length);
上面的代码很简洁,但是需要说明的是:
var arr = ['Frank', 'Dong'];
arr.unshift('C#', 'JavaScript');
alert(arr.pop());
alert(arr.length);
这里unshift方法同样可以一次添加多个元素。
var arr = [2, 1, 3, 4, 5];
arr.sort();
alert(arr); var arrString = ['A', 'a', 'B', 'b'];
arrString.sort();
alert(arrString);
如果要实现自定义的排序方式,需要提供sort的参数,就是自定义排序的方法,看例子:
// 实现升序排列:等同于JavaScript的默认实现
function compareAscendingly(value1,value2){
if(value1 < value2) {
return -1;
} else if(value1 > value2) {
return 1;
} else {
return 0;
}
} // 实现降序排列
function compareDescendingly(value1,value2){
if(value1 < value2) {
return 1;
} else if(value1 > value2) {
return -1;
} else {
return 0;
}
} var arr = [2, 1, 3, 4, 5];
arr.sort(compareDescendingly);
alert(arr); var arrString = ['A', 'a', 'B', 'b'];
arrString.sort(compareDescendingly);
alert(arrString);
上面的例子实现了数值和字符串的降序排列,当然了对于数值对象,也可以使用更加方便的方式:
// 实现升序排列:等同于JavaScript的默认实现
function compareAscendingly(value1, value2){
return value1 - value2;
} // 实现降序排列
function compareDescendingly(value1, value2){
return value2 - value1;
} var arr = [2, 1, 3, 4, 5];
arr.sort(compareDescendingly);
alert(arr);
对于自定义的对象复杂一点的对象,这里也只需要实现自己的compare逻辑,然后传给sort方法就可以,相当的简单:
function Person(name, age) {
  this.name = name;
  this.age = age;
  // 重写toString方法
  this.toString = function() {
    return name + ' ' + age;
  };
}
// 实现按照年龄升序排列
function compareAscendingly(p1, p2){
  return p1.age - p2.age;
}
var arr = [new Person('Frank', 20), new Person('Dong', 10)];
arr.sort(compareAscendingly);
alert(arr);
function Person(name, age) {
  this.name = name;
  this.age = age;
  // 重写toString方法
  this.toString = function() {
    return name + ' ' + age;
  };
}
var arr = [new Person('Frank', 20), new Person('Dong', 10)];
arr.reverse();
alert(arr);
function Person(name, age) {
  this.name = name;
  this.age = age;
  // 重写toString方法
  this.toString = function() {
    return name + ' ' + age;
  };
}
var arr = [new Person('Frank', 20), new Person('Dong', 10)];
alert(arr.toString()); // 等同于:alert(arr);
除了toString方法外,如果想自定义输出的格式(其实主要是自定义分隔符),则可以使用join方法:
var ps = ["Frank","Dong"];
alert(ps.join("-"));
var ps = ['Frank', 'Dong', 'C#', 'JavaScript'];
var ps1 = ps.slice(1);
var ps2 = ps.slice(1,2);
alert(ps1); // Dong,C#,JavaScript
alert(ps2); // Dong
var ps1 = ['Frank', 'Dong'];
var ps2 = ['C#'];
var ps3 = ['JavaScript'];
// 连接集合
var ps = ps1.concat(ps2, ps3);
alert(ps); // Frank,Dong,C#,JavaScript
// 注意ps1本身并没有改变
alert(ps1); // Frank,Dong
// 充当添加元素的角色,只不过会创建新的集合
alert(ps1.concat('Java', 'C++'));
arrayObject.splice(index,howmany,item1,.....,itemX)
index参数:必需。整数,规定添加/删除项目的位置,使用负数可从集合结尾处规定位置开始操作。
howmany参数:必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX参数:可选。向集合添加的新项目。
这个函数的返回值是修改后的数组(如果有的话)。
看一个小例子:
var ps = ['Frank', 'Dong', 'C#', 'JavaScript'];
ps.splice(1, 1, 'DDD');
alert(ps); // Frank,DDD,C#,JavaScript
ps.splice(1, 1);
alert(ps); // Frank,C#,JavaScript
var ps = ['Frank', 'Dong'];
// 最佳方式: 创新新的空集合,之前的集合如果没有引用在指向它将等待垃圾回收。
// 据有关人员测试,此种方式效率最高。
ps = [];
alert(ps); var ps1 = ['Frank', 'Dong'];
// 最奇怪的方式:简单粗暴但是有效,很多的类库都在使用
ps1.length = 0;
alert(ps); var ps2 = ['Frank', 'Dong'];
// 无法评价splice函数了,功能太多了
ps2.splice(0, ps.length);
alert(ps);
到此,JavaScript中的集合就总结到此了,简单说了,JavaScript内置对象中Object和Array可以演化成各种常用的集合来完成特定的功能。
JavaScript大杂烩7 - 理解内置集合的更多相关文章
- JS-安全检测JavaScript基本数据类型和内置对象的方法
		前言:在前端开发中经常会需要用到检测变量数据类型的需求,比如:判断一个变量是否为undefined或者null来进行下一步的操作,今天在阅读“编写高质量代码-改善JavaScript程序的188个建议 ... 
- JavaScript大杂烩9 - 理解BOM
		毫无疑问,我们学习JavaScript是为了完成特定的功能.在最初的JavaScript类型系统中,我们已经分析过JavaScript在页面开发中充当着添加逻辑的角色,而且我们知道JavaScript ... 
- javascript的优缺点和内置对象
		1)优点:简单易用,与Java有类似的语法,可以使用任何文本编辑工具编写,只需要浏览器就可执行程序,并且事先不用编译,逐行执行,无需进行严格的变量声明,而且内置大量现成对象,编写少量程序可以完成目标: ... 
- JavaScript原生函数(内置函数)
		1.JavaScript原生函数(内置函数) JavaScript原生函数(内置函数)有: String() Number() Boolean() Array() Object() Function( ... 
- 你不知道的JavaScript(五)内置对象模版
		尽管JavaScript中有对象的概念,但一般我们并不说JavaScript是面向对象的编程语言,因为它不具备面向对象的一些最基本特征. 在c++/Java等这些面向对象的编程语言中,我们要定义一个对 ... 
- JavaScript 本地对象、内置对象、宿主对象
		首先解释下宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序.如:web浏览器,一些桌面应用系统等.即由web浏览器或是这些桌面应用系统早就的环境即宿主环境. ... 
- JavaScript大杂烩12 - 理解Ajax
		AJAX缘由 再次谈起这个话题,我深深的记得就在前几年,AJAX被炒的如火如荼,就好像不懂AJAX,就不会Web开发一样.要理解AJAX为什么会出现,就要先了解Web开发面临的问题. 我们先来回忆一下 ... 
- JavaScript大杂烩1 - 理解JavaScript的类型系统
		随着硬件水平的逐渐提高,浏览器的处理能力越来越强大,本人坚信,客户端会越来越瘦,瘦到只用浏览器就够了,服务端会越来越丰满:虽然很多大型的程序,比如3D软件,客户端仍然会存在,但是未来的主流必将是浏览器 ... 
- JavaScript 核心参考教程 内置对象
		这个标准基于 JavaScript (Netscape) 和 JScript (Microsoft).Netscape (Navigator 2.0) 的 Brendan Eich 发明了这门语言,从 ... 
随机推荐
- Dispatch Queue 之内存中常驻的几个结构
			_dispatch_main_q 也就是主要主队列,一定运行在主线程里. // 6618342 Contact the team that owns the Instrument DTrace pro ... 
- 为什么我们喜欢用 sigmoid 这类 S 型非线性变换?
			本文整理自 @老师木 的一条图片新浪微博,从另一个角度给出为何采用 sigmoid 函数作非线性变换的解释. 为什么我们喜欢用 sigmoid 这类 S 型非线性变换? 
- Linux学习笔记之十二————vim编辑器的分屏操作
			一.分屏操作: sp: 上下分屏,后可跟文件名 vsp: 左右分屏,后可跟文件名 Ctr+w+w: 在多个窗口切换 二.启动分屏: 1.使用大写O参数进行垂直分屏 $ vim -On file1 fi ... 
- 让Java线程池实现任务阻塞执行的一种可行方案
			Java的线程池一般是基于concurrent包下的ThreadPoolExecutor类实现的, 不过当我们基于spring框架开发程序时, 通常会使用其包装类ThreadPoolTaskExecu ... 
- leetcode — reverse-integer
			/** * Source : https://oj.leetcode.com/problems/reverse-integer/ * * Created by lverpeng on 2017/7/4 ... 
- Python和Java分别实现冒泡排序
			1.基本思想 冒泡排序的基本思想是对比相邻的元素值.相邻元素值比较,如果满足条件两者就交换,把较小的移动到前面,把较大的移动到后面,这样较小的元素就像气泡一样浮上来了.可以看出,冒泡排序的每一次循环都 ... 
- 翻译:CREATE PROCEDURE语句(已提交到MariaDB官方手册)
			本文为mariadb官方手册:CREATE PROCEDURE的译文. 原文:https://mariadb.com/kb/en/create-procedure/我提交到MariaDB官方手册的译文 ... 
- over()的用法
			开窗函数over的常用方法-- 1.为每条数据显示聚合信息-- 2.为每条数据提供分组的聚合函数结果-- 3.与排名函数一起使用 -- 1 为每条数据显示聚合信息 -- 准备一些数据-- 该查询表只能 ... 
- Oracle 连接到RMAN
			set oracle_sid=orcl rman connect target sys/password@orcl; 
- Numbers、Strings、Lists 笔记<一>
			下一篇:流程控制<二> 阅读链接:官方Python3.7教程 废话:最近开始阅读python3.7文档,希望把容易混淆的知识记下来. 除法总是返回一个浮点数 >>> 8/ ... 
