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 发明了这门语言,从 ...
随机推荐
- centos6.2升级到centos6.8(6.5应该也一样)
1.根据这篇文章https://wenku.baidu.com/view/55bf7f8db8f67c1cfad6b8bf.html修改CentOS-Base.repo文件(主要是修改baseurl为 ...
- Linux - YUM包管理
简述 rpm是由红帽公司开发的软件包管理方式,使用rpm可以方便的进行软件的安装.查询.卸载.升级等工作. 但是rpm软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个rpm包组成时. Yum(全称 ...
- 使用pipenv隔离不同项目的依赖包
pipenv可以为不同的路径创建python环境和依赖包,结合pyenv可以达到为不同项目使用不同python版本,不同依赖包的目的. pip install pipenv #安装pipenv 使用p ...
- C#容器类,性能介绍
http://www.php.cn/csharp-article-354819.html 1 indexer []声明的变量必须是固定长度的,即长度是静态的:object[] objectArray ...
- 从零开始学 Web 之 JavaScript(三)函数
大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...
- 解决Windows英文版中文软件乱码的问题
由于工作的原因,我们的开发环境都是基于英文的,但是在打开一些基于中文编码的软件的时候经常会出现乱码的情况.其实只要打开控制面板按照下面的步骤稍微设置一下,就可以完美的在英文操作系统下支持中文软件了,因 ...
- (转)深度学习目标检测指标mAP
深度学习目标检测指标mAP https://github.com/rafaelpadilla/Object-Detection-Metrics 参考上面github链接中的readme,有详细描述
- visual studio code (vsc)中查看 php 数组的全部元素
在 vsc 调试 php 时,如果数组元素过多,只能查看前面 30个左右的元素,如果需要看更多的元素,可以配置 xDebugSettings 修改项目中的 .vscode/launch.json 文件 ...
- Qt5——从零开始的学生管理系统
Qt教程——从零开始的学生管理系统(文件) 一.项目设计 1.需求分析 记录并处理学生成绩信息. 1)添加新的学生数据: 2)根据学号对已有的学生数据进行修改: 3)根据学号删除已存在的学生信息: 4 ...
- hihocoder #1828 : Saving Tang Monk II(BFS)
描述 <Journey to the West>(also <Monkey>) is one of the Four Great Classical Novels of Chi ...