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 发明了这门语言,从 ...
随机推荐
- 彻底理解Java中的基本数据类型转换(自动、强制、提升)
说基本数据类型转换之前,先了解下 Java 中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围,如下图所示. 重新温故了下原始数据类型,现在来解释下它们之间的转换关系. 自动类型转换 自 ...
- mysql之select语法
一:连接查询(外链接outer和内链接inner) 连接查询是另一种类型的多表查询.连接查询对多个表进行JOIN运算,简单地说,就是先确定一个主表作为结果集,然后,把其他表的行有选择性地“连接”在主表 ...
- web自动化测试---测试环境的部署
当前我的测试环境配置如下: python3.6 下载地址: https://www.python.org/downloads/release/python-365/ 选择windows版本,下载完成后 ...
- Spring的Java配置方式—@Configuration和@Bean实现Java配置
Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.@Configuration 和 @BeanSpring的Java配置方式是通过 @Configuration 和 @Be ...
- 项目实战安装工具箱Busybox
1.Busybox是一个集成了100多个最常用Linux命令的软件工具箱,他在单一的可执行文件中提供了精简的UNIX工具集.该工具箱中包含了常见简单实用的工具如cat.echo.grep.find.m ...
- tensorflow 导入gfile模型文件
with tf.gfile.GFile(os.path.join(self.model_dir, 'ner_model.pb'), 'rb') as f: graph_def = self.tf.Gr ...
- JDK源码分析之hashmap就这么简单理解
一.HashMap概述 HashMap是基于哈希表的Map接口实现,此实现提供所有可选的映射操作,并允许使用null值和null键.HashMap与HashTable的作用大致相同,但是它不是线程安全 ...
- CentOS7用阿里云Docker Yum源在线安装Docker
一.参考文档 官方Docker安装文档:https://docs.docker.com/install/linux/docker-ce/centos 阿里云Docker安装文档:https://yq. ...
- JavaWeb学习 (十三)————JSP
一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...
- shell | {}和()
执行 bash -n xx.sh用于检测脚本语法是否有错误 bash -x xx.sh用于追踪执行 ${var} 用于限定变量名称的范围,并且支持通配符 $(cmd) shell会先执行括号的cmd, ...