javascript 高程二 第五章,引用类型-上

/*
         * 引用类型是一种数据结构,用于将数据和功能组织一起,它也经常被称作类。这中称呼并不妥当。
         * 引用类型有时候也会称为对象定义。因为他们是描述一类对象所具有的属性和方法。
         * 对戏那个是某个特定引用类型的实例、
         *
         * Object类型
         * 对象字面量定义对象时,该对象的最后一个属性,应没有逗号,否则会在IE6 和OPera中出现错误
         * 用过对象字面量定义对象时,不用调用Object的构造函数(Firefox除外)
        */
        var My = {
                name : "jalen",
                job : "F2E",
                skills : "xhtml1.1,css2.1,php,js",
                getSkills : function(){
                        return this.skills;
                }
        }
        console.log(My.getSkills());    //xhtml1.1,css2.1,php,js
        console.log(My['job']);                 //F2E 使用方括号语法时,应该将访问的属性以字符串的形式放在括号中,
        
        /*
         * Array类型 中的每一项可以保存任何类型的数据。
         * 使用数组字面量创建数组时,也不会调用Array构造函数(Firefox除外)
         * 创建数组基本二种方式:1.使用Array构造函数创建
         *                                                2.使用数组字面量方括号表示,
         * 如果知道数组要保存的数量,可预先给构造函数传递该数量 var arr = new Array(20); 每一项的初始值都是undefined
         * 可传递数组中的包含项,var arr = new Array('key1','key2','key3');
        */
                //var options = [1,2,];         //IE下有bug 会出现1,2,undefined,其他浏览器值有1,2两个值
                //var values = [,,,,,,];        //同上,不推荐这样创建。[undefined, undefined, undefined, undefined, undefined, undefined]

                var colors = ['red','blue','green'];
                alert(colors[0]);                               //red
                colors[2] = 'black';                    //修改第三项
                colors[3] = 'gray';                             //新增第四项 通过索引值自动加1的长度
                console.log(colors)                             //["red", "blue", "black", "gray"]
                console.log(colors.length);             //4

                //可通过length来新增和删除新项,looking following ths code:
                
                colors.length = 2;
                console.log(colors[2]);                 //长度设置为2,会删除第三项和第四项。
                console.log(colors);                    //["red", "blue"]
                
                colors.length = 5;                              //如果将length设置大于数组项目的值,新增的每一项都会取得undefined
                console.log(colors);                    //["red", "blue", undefined, undefined, undefined]
                
                //利用length属性,可方便的在数组末尾添加新项。
                
                var options = [1,2,3,4,'fuck','shit','nice','aggress'];
                console.log(options.length);                    //8
                options[options.length]='action';               //末尾增加字符串action
                options[options.length]='lastString';   //末尾增加字符串lastString
                console.log(options.length);                    //10
                console.log(options);   //[1, 2, 3, 4, "fuck", "shit", "nice", "aggress", "action", "lastString"]

                //数组的最后一项的索引值是length-1;
                var vals = ['aa','bb','cc'];
                vals[99] = '第一百个索引为99,length为100';
                console.log(vals.length);
                console.log(vals); //索引位置从3~98的每一项都是undefined

                /*
                 * 转换方法
                 * 所有对象都具有toLocaleString(),toString(),和valueOf()方法,调用数组的toString()和valueOf()会返回相同的值
                 * 即数组中的每个字符串形式拼接而成的一个以逗号分隔的字符串,实际上为创建这个字符串会调用数组中每一项的
                   toString()方法
                */

                var arr = ['red','green','what?','astrophysics',null,undefined];
                console.log(arr.toString());    //red,green,what?,astrophysics
                console.log(arr.valueOf());             //["red", "green", "what?", "astrophysics"]
                console.log(arr);                               //["red", "green", "what?", "astrophysics"]
                alert(arr);                                             //red,green,what?,astrophysics alert接受字符串参数,所以后台会调用toString()

                //toLocaleString

                var son1 = {
                        toLocaleString : function(){
                                return "ToLocale";
                        },
                        toString : function(){
                                return "toString";
                        }
                };
                var son2 = {
                        toLocaleString : function(){
                                return "ToL-Value";
                        },
                        toString :function(){
                                return "toS-value";
                        }
                }

                var father = [son1,son2];

                alert(father);                                  //toString,toS-Value  调用了数组每一项的toString()方法
                alert(father.toString());               //toString,toS-value  同上
                alert(father.toLocaleString()); //ToLocale,ToL-Value  调用了数组每一项的toLocaleString()方法

                //以上都以逗号分隔的字符串形式返回数组项,可使用join()使用不同的分隔符来构建字符串。

                var options = ['adult video','sex girl','some hand',3,'baby',null,undefined];
                console.log(options.join('|'));         //adult video|sex girl|some hand|3|baby||
                console.log(options.join('%'));         //adult video%sex girl%some hand%3%baby%%
                console.log(options.join('/'));         //adult video/sex girl/some hand/3/baby//
                console.log(options.join('\\'));        //adult video\sex girl\some hand\3\baby\\

                //notes:如果数组中的某一项的值是null或undefined,那么该值在join(),toString(),toLocaleString(),valueOf()中返回的结果中以空字符串表示。

                /*
                 * 栈方法 数组可以表现的和栈一样 
                 * 栈是一种LIFO(last-in-first-out)后进先出的数据结构,最新增加的项最早被移除。
                 * 栈中的插入叫推入,也可以理解为压入,移除叫做弹出。只发生在一个位置-栈的顶部
                 * 为数组提供了push()和pop()方法,来模拟类似栈的行为。
                 * push()方法可以接受任意数量的参数,逐个增加到数组末尾。返回修改后的数组长度。
                 * pop()方法从数组末尾移除最后一项,减少数组的length值,返回移除的项。
                */

                var arr = [];
                var countArr = arr.push('red','green','gray');
                console.log(countArr);                          // 3    修改后的数组长度。

                var countArr = arr.push('black','yellow');
                console.log(countArr);                          // 5    修改后的数组长度。

                var item = arr.pop();                           
                console.log(item);                                      // yellow 移除最后一项,返回移除的项
                console.log(arr);                                       //["red", "green", "gray", "black"] 
                
                arr.push('myGod');                                      //增加一项
                console.log(arr);                                       //["red", "green", "gray", "black","myGod"]
                arr[5] = 'lastObject';                          // 增加一项
                console.log(arr.length);                        // 6

                var lastItem = arr.pop();                       //取得最后一项,并移除
                console.log(lastItem);                          // lastObject

                /*
                 * 队列方法
                 * 栈数据的访问规则是LIFO,而队列数据结构的访问规则是FIFO(first-in-first-out)先进先出。
                 * 队列在列表的末端添加项,从列表的顶端移除项。
                 * shift()方法能够移除数组中的第一项并返回该项,同事数组的长度减去一。
                 * unshift()方法和shift用途相反,能够在数组的前端增加任意个数的项并返回新数组的长度。
                */

                var arr = ['one','2','3','4'];
                var count = arr.push('li8n','li9n');
                console.log(count);                                     // 6

                var count = arr.push('li10n');
                console.log(count);                                     // 7

                var item = arr.shift();                         //取得第一项,删除该项,并返回该项
                console.log(item);                                      // one

                var item2 = arr.pop();                          //取得最后一项,并移除。
                console.log(item2);                                     // li10n

                console.log(arr.length);                        // 5
                console.log(arr);                                       //["2", "3", "4", "li8n", "li9n"]

                //相反的方向模拟队列 先进后出。使用unshift()和pop()

                var ops = ['task1','task2','task3','extends'];
                var counts = ops.unshift('green','red','yellow');
                console.log(counts);                            // 7

                var list = ops.pop();                   
        console.log(list);                                      // extends
                var list = ops.pop();
                console.log(list);                                      // task3
                console.log(ops);                                       // ["green", "red", "yellow", "task1", "task2"]

                // ie对js的实现有个偏差,其中unshift()返回的是undefined,而不是新数组的长度。
                // notes: shift() 从数组的前端移除,并返回该项。pop() 从数组的末端移除,并返回该项。
                // unshift() 从数组的前端增加任意项,并返回新数组的长度。push() 从数组的末端增加任意项,并返回新数组的长度。

                var arr = [];
                var ops = [];
                for(var i = 0; i< 10 ; i++){
                        arr.push(i);
                        ops.unshift(i);
                }
                console.log(arr);                                       // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
                console.log(ops);                                       // [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

                /*
                 * 重排序方法
                 * reverse()方法会反转数组项的顺序,也就是逆向。
                 * sort()方法按照升序排列数组项,该方法会调用每个数组项的toString()方法,然后比较得到的字符串,
                   即使数组里每一项都是数值比较的也是转换后的字符串。
                 * 
                */

                var values = [1,5,10,2,2,7,40,18];
                values.reverse();
                console.log(values);            // [18, 40, 7, 2, 2, 10, 5, 1]

                values.sort();
                console.log(values);            // [1, 10, 18, 2, 2, 40, 5, 7]

                //因为sort()方法 比较的是转换后的字符串,所以得不到想要的结果。但,sort()可接受一个比较函数作为参数,
                //以便我们指定那个值位于那个值前面。
                
                //compare函数原理:如果第一个参数应该位于第二个之前则返回一个负数(2-3),如果像个参数相等返回0(2-2);
                //如果第一个参数应该位于第二个之后则返回一个正数(3-2)。

                function compare(val1,val2){
                        if(val1  < val2){
                                return -1;
                        }else if(val1 > val2){
                                return 1;
                        }else{
                                return 0;
                        }
                }
                values.sort(compare);
                console.log(values);            //      [1, 2, 2, 5, 7, 10, 18, 40]

                //以上代码是升序,可以改下代码为降序

                function descCompare(val1,val2){
                        if(val1  < val2){
                                return 1;
                        }else if(val1 > val2){
                                return -1;
                        }else{
                                return 0;
                        }
                }
                values.sort(descCompare);
                console.log(values);            // [40, 18, 10, 7, 5, 2, 2, 1]

                var trac = ['roadmap','reslove','assign','viewtrac','tickets','newTickets'];
                trac.sort(compare);
                console.log(trac);                      // ["assign", "newTickets", "reslove", "roadmap", "tickets", "viewtrac"]
                trac.sort(descCompare);
                console.log(trac);                      // ["viewtrac", "tickets", "roadmap", "reslove", "newTickets", "assign"]

                //reverse()和sort()方法的返回值是经过排序之后的数组

                //对于数值类型或者其valueOf()方法会返回属性类型的对象类型。可使用更见的比较函数

                function numCompare(value1,value2){
                                return value2-value1;
                }
                var arr = [1,2,4,55,22,44,13,19,8,100,0];
                arr.sort(numCompare);
                console.log(arr);               //[100, 55, 44, 22, 19, 13, 8, 4, 2, 1, 0]

                // return value1-value2, 升序;  return value2-value1,降序

                /*
                 * 操作方法
                 * concat()方法基础当前的数组中的所有项创建一个新数组。
                 * 这个方法会创建当前数组的一个副本,然后将接受到的参数添加到这个副本的末尾。然后返回新构建的数组。
                 * 在没有给concat()传递参数的情况下,他只是复制当前数组并返回副本。
                */

                var colors = ['red','blue','green'];
                var copyColors = colors.concat('yellow',['black','brown']);
                console.log(copyColors);                //["red", "blue", "green", "yellow", "black", "brown"]
                console.log(colors);                    //["red", "blue", "green"] 原数组保持不变


                // slice()方法 能够基于当前数组中的一或多项创建一个新数组,但不会影响原始数组
                // 接受二个参数,一个是起始位置,一个是结束位置。返回项的起始和结束位置。
                // 接受一个参数,返回的该参数的指定位置开始到当前数组末尾的所有项。

                var names = ['green','jalen','tom','peter','ryan','jason','gergon','huchao','monkey','cat'];
                var names1 = names.slice(2,8);
                console.log(names.length);                      //10
                console.log(names1);                            //["tom", "peter", "ryan", "jason", "gergon", "huchao"]
                var names2 = names.slice(5);
                console.log(names2);                            //["jason", "gergon", "huchao", "monkey", "cat"]
                //如果参数中有一个负数,则用数组的长度加上该数来确定相应的位置。
                var names3 = names.slice(-3,-9);

                console.log(names3);                            // [] 如果结束位置小于起始位置,则返回空数组

                var names4 = names.slice(-6,9);
                var names5 = names.slice(4,9);
                console.log(names4);                            // ["ryan", "jason", "gergon", "huchao", "monkey"]
                console.log(names5)                                     // ["ryan", "jason", "gergon", "huchao", "monkey"]
                
                /*
                 * splice()方法 主要用途是向数组的中部插入项,splice始终都会返回一个数组,该数组中包含了原数组中删除的项
                   主要有三种方法。
                 * 删除——可以删除任意数量的项,接受2个参数,要删除的第一项的位置和删除项数。
                 * 插入(这词太邪恶了)——指定位置插入任意数量的项,接受3个参数:起始位置,要删除的项数,要插入的项(可以是多个)。
                 * 替换——向指定位置插入任意数量的项,并同时删除任意数量的项。接受三个参数:起始位置,要删除的项数,和要插入的任意数量的项
                */

                var colors = ['red','green','yellow','blue'];
                var removed = colors.splice(0,3);
                console.log(removed);                           // ["red", "green", "yellow"] 删除的三项
                console.log(colors);                            // ["blue"] colors中的剩余项

                var removed1 = removed.splice(2,0,'gray','light','orange');
                console.log(removed1);                          // [] 返回的删除项数为空
                console.log(removed);                           // ["red", "green", "gray", "light", "orange", "yellow"] 从第2个位置插入三项
                var removed2 = removed.splice(3,2,'java','php','python');
                console.log(removed2);                          // ["light", "orange"] 返回删除的2项
                console.log(removed);                           // ["red", "green", "gray", "java", "php", "python", "yellow"]将删除的项数替换掉。

                //Notes:其实插入和替换都一样。替换只是把第2个参数给了具体的数字,作为要替换的项数

学习笔记,记录学习的过程。