【转】潜说js对象和数组
2013-12-25 17:02
330 查看
原文转自 转自:www.jimzhan.com
/*
数组和对象 【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();
相关文章推荐
- 判断是否为js数组对象
- JS实现json对象数组按对象属性排序操作示例
- js打印数组,js打印对象的方法
- JS(五)简要介绍数组或对象 typeof、类型转换
- JS基础 改对象中的Key名,变数组中的值为新的字典型中的Key
- js接收并转化Java中的数组对象
- js获取对象,数组所有属性值(key)和对应值(value)的方法
- [JS深入学习]——数组对象排序
- 个人感觉:JS的数组是用对象实现的
- js对象和数组
- js对象, 数组 , json 互相转换
- JavaScript基础精华03(String对象,Array对象,循环遍历数组,JS中的Dictionary,Array的简化声明)
- js数组排序,根据数组中对象的某一属性进行排序 支持数字和字符串的排序,也支持按两个属性进行排序
- js深入学习专题 ------ 类数组的对象和数组对象的区别和联系
- JS在火狐下还可以打印出对象及数组和普通字符
- js学习笔记——对象和数组
- js 大括号对象 方(中)括号为数组
- js数组与对象的一些区别。
- js 数组 对象数组排序
- js创建数组,创建对象