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 9 被无情抛弃,Java 8 直接升级到 Java 10!!
前几天写了一篇 Java 8 即将在 2019 年停止免费向企业提供更新的文章,企图迫使用户向更新一代的 Java 版本升级,但让人遗憾的是,小编今天收到了 Oracle Java 版本的升级推送,装 ...
- js中break、continue和return的一般用法总结
break break :终止break的整个循环体,包括内部所有循环.但对循环体外部的循环不影响. for(let i = 0;i<2;i++){ for(let j = 0;j<2;j ...
- scrapy 框架入门
运行流程 官网:https://docs.scrapy.org/en/latest/intro/overview.html 流程图如下: 组件 1.引擎(EGINE):负责控制系统所有组件之间的数据流 ...
- 阿里架构师的工作总结:Spring Cloud在架构演进中起到的作用
Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,本篇主要解答这两个问题:Spring Cloud在微服务的架构中都做了哪些事情?Spring Cloud提供的这些功 ...
- 安尼泰科T1行车记录仪说明书
点击下载:安尼泰科T1行车记录仪说明书 自己总结:行车记录仪_使用总结.rar PS:我的型号是T1C,但说明书也适合.
- Android_注解+反射代替findViewById()
最近没啥事,前段时间看到一个框架是使用的注解来代替findViewById()的然后就研究了,发现还是蛮容易的,下面就是注解的代码: import java.lang.annotation.Docum ...
- 等宽高的ImageButton
@SuppressLint("AppCompatCustomView") public class SquareImageButton extends ImageButton { ...
- Hadoop项目实战-用户行为分析之应用概述(一)
1.概述 本课程的视频教程地址:<Hadoop 回顾> 好的,下面就开始本篇教程的内容分享,本篇教程我为大家介绍我们要做一个什么样的Hadoop项目,并且对Hadoop项目的基本特点和其中 ...
- 读vue-0.6-observer.js源码
实现监听数组方法 var ArrayProxy = Object.create(Array.prototype), methods = ['push','pop','shift','unshift', ...
- leetcode — longest-common-prefix
/** * Source : https://oj.leetcode.com/problems/longest-common-prefix/ * * Created by lverpeng on 20 ...