潜说js对象和数组


Posted in Javascript onMay 25, 2011
/* 
数组和对象 【JavaScript 权威指南 第五版】 
*/ /* 
对象: 是一个无序属性集合, 每个属性都有自己的名字和值 */ 
/* 创建对象简单方法, 对象直接量 */ 
var obj = {}; 
var obj = {name: 'maxthon'}; 
var obj = {name: {}, text: []}; 
/* 可使用 new 操作符 */ 
var a = new Array(); 
var d = new Date(); 
var r = new RegExp('javascript', 'i'); 
var o = new Object(); // var o = {}; 
/* 注: new 操作符后跟构造函数, 所以 
typeof Array; // 'function' 
typeof Object; // 'function' 
Object 是 Function 的实例. 
Function 是特殊的对象, 也是 Object 的实例. 
*/ 
/* 对象属性 */ 
// 使用 . 符合来存取属性的值. 
// 注:同时可使用 [], 里面使用属性名(可使用变量, 这点特别有用). 
var t = {}; 
t.text = 'hello'; 
t.o = {}; 
t.o.name = 'rd'; 
t.n = []; 
var t = { 
"text": "hello" 
}; 
console.log(t.text); // 'hello'; 
// 补充: 通常使用关键字 var 来声明变量, 但是声明对象属性时, 不能使用 var 声明 

/* 对象枚举 */ 
var F = function () {}; 
F.prototype.name = 'RD'; 
var obj = new F; 
for (var key in obj) { 
console.log(key); // name; 
} 
// 仅枚举对象自身, 不沿原型链向上查 
for (var key in obj) { 
if (obj.hasOwnProperty(key)) { 
console.log(key); // 
} 
} 
/* 注: for in 不能枚举出预定义属性; toString. */ 

/* 检查属性存在性 */ 
window.a = 'rd'; 
console.log(a in window); // true; 
var F = function () {}; 
F.prototype.name = 'RD'; 
var obj = new F; 
console.log('name' in obj); // true; 

var toString = Object.prototype.toString; 
// 如果对象 obj, 含有方法 getName, 则执行它; 
if (obj.getName && toString.call(obj.getName) === '[object Function]') ) { 
obj.getName(); 
} 
// 补充: 
console.log(null == undefined); // true; 
console.log(null !== undefined); // true; 

/* 删除属性 */ 
delete obj.name; 
// 补充: 使用 delete 操作符, 不能删除使用 var 声明的变量; 

/* 作为关联数组的对象 */ 
// 取对象属性: 
obj.name; 
obj['name']; // 这里 name 为字符串. 
// 使用 [] 表示时, 属性名是用字符串来表示的. 那么可 
// 在运行过程中进行添加等操作 
// 注:当此属性是做为变量传递时, 特别有用. 
// 又称 关联数组 
/* 映射: JavaScript 对象把字符串(属性名) 映射成值. */ 
for (var key in obj) { 
console.log(key); // key 属性名, 此处 做为值存在. 
} 

/* 
通用的 Object 属性和方法 
JavaScript 中所有对象都继承自 Object 类; 
1, constructor 属性. 
指向其构造函数. 
*/ 
var F = function () {}; 
var f = new F; 
console.log(f.constructor == F); // true 
// 构造函数的原型存在属性 constructor 指向自己; 
F.prototype.constructor == F; 
// 补充: 
var F = function () {}; 
var G = function () {}; 
G.prototype = new F; 
var g = new G; 
console.log(g.constructor == F); // true; 
console.log(g.constructor == G); // false; 
// 可使用 g instanceof F; 

/* 
2, toString() 方法 
*/ 
{'name': 'maxthon'}.toString(); // '[object Object]' 
/* 数组使用 toString 方法, 把会元素组成字符串, 其它对象会转化为 [object Object]; 
函数使用原始 toString 方法, 会得到函数源码 */ 
['a', 'b', 1, false, ['e','f'], {}].toString(); 
// "a,b,1,false,e,f,[object Object]" 
function t() { 
console.log('test'); 
} 
t.toString(); 
// 源码 
/* 
3, toLocalString(); 
返回对象的一个本地化字符串 
4, valueOf(); 
在转化为基本类型时, 会使用到. valueOf/toString. 
5, hasOwnProperty(); 
6, propertyIsEnumberable(); 
是否可枚举出来; 
7, isPrototyeOf(); 
a.isPrototyeOf(b); 
如果 a 是 b 的原型, 则返回 true; 
*/ 
var o = {}; // new Object; 
Object.prototype.isPrototyeOf(o); // true; 
Object.isPrototyeOf(o); // false; 
o.isPrototyeOf(Object.prototype); // false; 
Function.prototype.isPrototyeOf(Object); // true; 
/* 【闭包是存在函数实例, 垃圾没有回收是存在赋值引用】 */ 

/* 
数组: 有序的、值的集合; 
每个值, 也叫元素, 对应一个下标; 
下标是从 0 开始; 
数组中值, 可以为任何类型. 数组, 对象, null, undefined. 
*/ 
// 创建. 
var arr = []; 
var arr = new Array(); 
var t = ''; 
var arr = [1,2,3, null, undefined, [], {}, t]; 
/* 使用 new 操作符创建数组的3种情况: */ 
var arr = new Array(); // [], 和直接量相同 
var arr = new Array(5); // 长度为 5; []直接量是无法做到的. 
console.log(arr); // []; JavaScript 引擎会无视 undefined; 
var arr = new Array('5'); // 值为 ['5']; 
var arr = new Array('test'); // 值为 ['test']; 
/* 相关实例 */ 
var s = [1, 2, 3]; 
s[5] = 'a'; 
console.log(s); 
[1, 2, 3, undefined, undefined, 'a'] 

/* 数组的读和写 */ 
value = array[0]; 
a[1] = 3.14; 
i = 2; 
a[i] = 3; 
a[a[i]] = a[0]; 
// 数组 -> 对象 -> 属性 
array.test = 'rd'; 
// 数组下标大于等于 0, 并且小于 2的32次方 减 1 的整数. 
// 其它值, JavaScript 会转化成字符串, 做为对象属性的名字, 不再是下标. 

var array = []; 
array[9] = 10; // array 长度会变成 10; 
// 注: JavaScript 解释器只给数组下标为 9 的元素分配内存, 其它下标无. 
var array = []; 
array.length = 10; // 添加 array 的长度; 
array[array.length] = 4; 

/* 删除数组元素 */ 
// delete 运算符把一个数组元素设置为 undefined 值, 但是元素本身还是存在的. 
// 真正删除, 可以使用: Array.shift();【删除第一个】 Array.pop();【删除最后一个】 Array.splice();【从一个数组中删除一个连续范围】 或修正 Array.length 长度; 
/* 相关实例 */ 
var a = [1, 2, 3]; 
delete a[1]; 
console.log(a); // [1, undefined, 3]; 
/* 补充: JavaScript 权威指南 第五版 59页 
由 var 声明的变量是永久性的, 也就是说, 用 delete 运算符来删除这些变量将会引发错误. 
但: 在开发者工具里面, 是可以删除的. 而在网页中, 正如书上所写. 
*/ 

/* 数组长度 */ 
[].length; 

/* 遍历数组 */ 
var array = [1, 2, 3, 4, 5]; 
for (var i = 0, l = array.length; i < l; i++) { 
console.log(array[i]); 
} 
array.forEach(function (item, index, arr) { 
console.log(item); 
}); 
/* 截取或增长数组: 修正 length 长度, 前面已提过 */ 
/* 多维数组 */ 
[[1], [2]] 
/* 数组方法 */ 
// join 
var array = [1, 2, 3, 4, 5]; 
var str = array.join(); // 1,2,3,4,5 
var str = array.join('-'); // 1-2-3-4-5 
// 注: 此方法与 String.split() 方法相反; 
// reverse(); 
var array = [1, 2, 3, 4, 5]; 
array.reverse(); // [5, 4, 3, 2, 1] 
// 注:修改原数组; 
// sort(); 
var array = [1, 3, 2, 4, 5, 3]; 
array.sort();// [1, 2, 3, 3, 4, 5]; 
/* 注: 数组中存在未定义元素, 把这些元素放到最后 */ 
/* 同时可自定义排序, sort(func); 
func 接收两个参数, 如果第一个参数应该位于第二个参数之前, 那么比较函数将返回一个小于0的数, 相反, 返回大于0的数. 相等, 返回0; 
*/ 
array.sort(function (a, b) { 
return b - a; 
}); 
// 实例: 按奇数到偶数, 并且从小到大排序 
[1, 2, 3, 4, 5, 6, 7, 2, 4, 5, 1].sort(function (a, b) { 
if (a % 2 && b % 2) { 
return a - b; 
} 
if (a % 2) { 
return -1; 
} 
if (b % 2) { 
return 1; 
} 
return a - b; 
}); 

// concat() 方法. 合并数组, 但不深度合并 
var a = [1, 2, 3]; 
a.concat(4, 5); // [1, 2, 3, 4, 5] 
a.concat([4, 5]); // [1, 2, 3, 4, 5] 
a.concat([4, 5], [8, 9]); // [1, 2, 3, 4, 5, 8, 9] 
a.concat([4, 5], [6, [10, 19]]); // [1, 2, 3, 4, 5, 6, [10, 19] ] 

// slice() 方法. 源数组不改变. 
var a = [1, 2, 3, 4, 5]; 
a.slice(0, 3); // [1, 2, 3] 
a.slice(3); // [4, 5]; 
a.slice(1, -1); // [2, 3, 4] 
a.slice(1, -1 + 5) 
a.slice(1, 4); 
a.slice(-3, -2); // [3] 
a.slice(-3 + 5, -2 + 5); 
a.slice(2, 3); 
/* 注: 
不包括第二个参数指定的元素. 
负值转化为: 负值 + 数组长度 
*/ 
// splice(pos[, len[, a, b]]) 方法. 删除指定位置开始后, 指定长度元素, 再缀加元素; 
// 返回删除元素组成的数组. 原数组改变. 
var a = [1, 2, 3, 4, 5, 6, 7, 8]; 
a.splice(4); // [5, 6, 7, 8]; 此时 a: [1, 2, 3, 4] 
a.splice(1, 2); // [2, 3]; 此时 a: [1, 4]; 
a.splice(1, 1); // [4]; 此时 a: [1]; 
var a = [1, 2, 3, 4, 5]; 
a.splice(2, 0, 'a', 'b'); // [1, 2, 'a', 'b', 3, 4, 5] 
a.splice(2, 2, [1, 2], 3); // ['a', 'b']; 此时 a: [1, 2, [1, 2], 3, 3, 4, 5] 
/* 注: 
第二个参数后的参数, 直接插入到处理数组中。 
第一个参数可为负数. 
*/ 

// push() 方法和pop() 方法. 
// push() 可以将一个或多个新元素附加到数组的尾部, 然后返回数组新长度; 
// pop() 删除数组中的最后一个元素, 减少数组的长度, 返回它删除的值. 
// 注:两个方法都在原数组上修改, 而非生成一个修改过的数组副本. 
var stack = []; 
stack.push(1, 2); // stack: [1, 2]; return 2; 
stack.pop(); // stack: [1]; return 2; 删除的元素值 
stack.push(3); // stack: [1, 3]; return 2; 
stack.pop(); // stack: [1]; return 3; 删除的元素值 
stack.push([4, 5]); // stack: [1, [4, 5]]returm 2; 
stack.pop(); // stack: [1]; return [4, 5]; 删除的元素值 
// unshift() 方法和 shift() 方法. 同上, 从数组头开始. 

// toString() 方法和 toLocalString() 
[1, 2, 4].toString(); // 1,2,3; 
['a', 'b', 'c'].toString(); // 'a,b,c'; 
// 和无参数的 join 方法相同. 

/* jsapi 新添方法:map, every, some, filter, forEach, indexOf, lastIndexOf, isArray */ 

/* 类似数组的对象 */ 
arguments 
document.getElementsByTagName();
Javascript 相关文章推荐
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
Sep 15 Javascript
jQuery 源码分析笔记(6) jQuery.data
Jun 08 Javascript
javascript解析json数据的3种方式
May 08 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
Oct 28 Javascript
Jquery实现上下移动和排序代码
Oct 17 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
Oct 27 Javascript
AngularJS中$apply方法和$watch方法用法总结
Dec 13 Javascript
react写一个select组件的实现代码
Apr 03 Javascript
微信小程序如何调用json数据接口并解析
Jun 29 Javascript
layui 解决form表单点击无反应的问题
Oct 25 Javascript
Vue自定义多选组件使用详解
Sep 08 Javascript
多种类型jQuery网页验证码插件代码实例
Jan 09 jQuery
一些常用的JavaScript函数(json)附详细说明
May 25 #Javascript
javascript中万恶的function实例分析
May 25 #Javascript
js 页面关闭前的出现提示的实现代码
May 25 #Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
May 25 #Javascript
IE6/7/8/9不支持exec的简写方式
May 25 #Javascript
25个优雅的jQuery Tooltip插件推荐
May 25 #Javascript
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
May 24 #Javascript
You might like
php注入实例
2006/10/09 PHP
坏狼的PHP学习教程之第2天
2008/06/15 PHP
PHP filter_var() 函数 Filter 函数
2012/04/25 PHP
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
[原创]php正则删除html代码中class样式属性的方法
2017/05/24 PHP
js各种验证文本框输入格式(正则表达式)
2010/10/22 Javascript
JS维吉尼亚密码算法实现代码
2010/11/09 Javascript
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
JavaScript中的bold()方法使用详解
2015/06/08 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Django自定义过滤器定义与用法示例
2018/03/22 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
简单介绍HTML5中audio标签的使用
2015/09/24 HTML / CSS
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
自荐信格式的六要素
2013/09/21 职场文书
汉语专业应届生求职信
2013/10/01 职场文书
家佳咖啡店创业计划书
2013/12/27 职场文书
上班早退检讨书
2014/01/09 职场文书
2014年元旦活动方案
2014/02/15 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
工程学毕业生自荐信
2014/06/14 职场文书
2014年幼儿园教学工作总结
2014/12/04 职场文书
具结保证书
2015/01/17 职场文书
婚庆司仪开场白
2015/05/29 职场文书
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS