JS对象和数组

/*
   数组和对象 【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();
时间: 2024-07-31 17:43:56

JS对象和数组的相关文章

判断一个js对象是不是数组

//今天突然想到一个问题,如何判断一个对象是不是数组 var arr = [0, 1, 2]; console.log(arr) //object, 显然不行 //查阅了很多资料,发现几个挺不错的方法 //方法一 function isArr(arr){ return Object.prototype.toString.call(arr) === '[object Array]'; } isArr(arr) //true //方法二 function isArray(arr){ return a

js对象转数组

var list = data.data; for(var i = 0; i < list.length; i++) { var newlist =[]; var listdata = Object.values(list[i].data); for(var j =0;j<listdata.length;j++){ newlist.push(parseInt(listdata[j])) } list[i].data = newlist; } Object.values 原生的的获取对象的值 O

认真JS2-W3school上的JS2(JS对象、数组、函数和语句)

普通的字符串,也是有这些属性和方法的,但是直接的输出里面不会显示这些,而是直接显示他们的值,当作基本类型 当然他们也有包装类 构造函数的方法,可以先创建,后添加,很骚!不需要声明属性类型. 函数 因为都是var,所以参数也不需要类型 不需要声明返回类型 直接使用return返回即可 因为反正都是var 可以直接使用返回值 运算符,和别的语言一样,没什么好讲 字符串可以用+号来拼接 其实主要是=== 也和其他语言差不多 条件赋值,注意是赋值! if.else.switch 一样,没什么好讲 for

JS对象与json字符串格式

1 <head> 2 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 3 <title></title> 4 <script type="text/javascript"> 5 var obj = new Object(); 6 obj.Name = "八戒" 7 obj.Ag

js中的数组对象排序

一.普通数组排序 js中用方法sort()为数组排序.sort()方法有一个可选参数,是用来确定元素顺序的函数.如果这个参数被省略,那么数组中的元素将按照ASCII字符顺序进行排序.如: var arr = ["a", "b", "A", "B"]; arr.sort(); console.log(arr);//["A", "B", "a", "b"

JS 对象数组Array 根据对象object key的值排序sort,很风骚哦

有个js对象数组 var ary=[{id:1,name:"b"},{id:2,name:"b"}] 需求是根据name 或者 id的值来排序,这里有个风骚的函数 函数定义: function keysrt(key,desc) {   return function(a,b){     return desc ? ~~(a[key] < b[key]) : ~~(a[key] > b[key]);   } } 使用: var ary=[{id:1,nam

用js 对拥有多个对象的数组进行排序

我们想要根据某个对象属性对数组进行排序.而传递给数组sort()方法的比较函数要接收两个参数,即要比较的值.可是,我们需要一种方式来指明按照哪个属性来排序.要解决这个问题,可以定义一个函数,它接收一个属性名,然后根据这个属性名来创建一个比较函数,下面就是这个函数的定义. 1 function createComparisonFunction(propertyName) { 2 return function (object1, object2) { 3 var value1 = object1[

利用js对象的特性,去掉数组中的重复项

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Unt

js,jquery遍历数组,对象

each的用法  1.数组中的each 复制代码 var arr = [ "one", "two", "three", "four"]; $.each(arr, function(){ alert(this); }); //上面这个each输出的结果分别为:one,two,three,four var arr1 = [[1, 4, 3], [4, 6, 6], [7, 20, 9]] $.each(arr1, function