JavaScript基础—对象

概论

对象定义.png

对象基础

创建对象

利用字面量创建对象:

        var obj = {};  // 创建了一个空的对象
        var obj1 = {
            name: 'Omew',
            age: 18,
            sex: 'female',
            sayHi: function () {         // 这里只能是匿名函数
                console.log('Hello~');
            }
        }

使用对象

        console.log(obj1.name);    //  Omew
        console.log(obj1.age);      //  18
        console.log(obj1['sex']);    //   female
        obj1.sayHi();                     //   Hello~

利用new Object创建对象

        var obj2 = new Object();    // 创建了一个空对象
        obj2.uname = 'Kana',            // 追加属性
        obj2.uage = 16,
        obj2.sex = 'female',
        obj2.greeting = function () {    // 追加方法
                 console.log('Domo~');
             }

使用对象方式与上面完全一致

利用构造函数创建对象
此方法可以一次创建多个对象
构造函数就是把对象里面的一些相同的属性和代码抽象出来并封装到函数里面

        function Star(uname, age, sex) {    // 构造函数名首字母大写
            this.uname = uname;
            this.age = age;
            this.sex = sex;     // 构造函数无需return即可返回结果
            this.sing = function (song) {
                console.log(song);
            }
        }
        
        var star1 = new Star('Liu',18,'male');   // 调用构造函数(必须使用new关键字)创建对象
        console.log(typeof star1);    // Object
        console.log(star1.uname);      // Liu
        console.log(star1['age']);     // 18
        star1.sing('Rain...')

        var star2 = new Star('Zhang',19,'male');
        console.log(star2.uname);

构造函数与对象的关系:


构造函数与对象的关系.png

new关键字的执行过程:

  1. 在内存中创建一个新的空对象;
  2. 让this指向这个新的对象;
  3. 执行构造函数里面的代码,给这个新的对象添加属性和方法;
  4. 返回这个新对象(所以构造函数里面不需要return)

如何遍历一个对象?

        // 对象的遍历
        // 对象内部属性是无序的,故无法用传统的for循环进行遍历
        // for in
        for (var k in obj1){
            console.log(k);     //  遍历属性名
            console.log(obj1[k]);    //  遍历属性值
        }

内置对象:


内置对象.png

一般情况下建议查阅MDN/W3C文档

内置对象:数学

Math对象(非构造函数,无需new关键字调用,可直接使用)

        console.log(Math.PI);     // 内置对象属性,圆周率
        console.log(Math.max(1,5,6,8,4,3));    // 内置对象方法,最大值
        console.log(Math.abs(-56));    // 绝对值

Math内置取整方法

        console.log(Math.floor(1.1));   // 向下取整数
        console.log(Math.floor(1.9));

        console.log(Math.ceil(1.2));    // 向上取证

        console.log(Math.round(1.5));   // 四舍五入

Math内置随机函数

        // Math.random()返回一个区间[0,1)的随机浮点数
        console.log(Math.random());

返回一个区间内的随机整数,并包含边界

        function getRandomNumber(min,max) {
            return Math.floor(Math.random() * (max - min + 1)) + min
        }
        console.log(getRandomNumber(1,100));

内置对象:日期

Date对象(只能通过调用Date构造函数来创建日期对象)

        var arr = new Array();   // 必须使用new关键字的几种对象类型
        var obj = new Object();
        var day = new Date();  // 若没有参数,即输出当前时间
        console.log(day);       //    "2021-10-19T03:44:00.755Z"

向 Date() 中添加参数

        var day1 = new Date(2021,5,1);    // 实际输出为6月,因为月份计数是从0开始的
        console.log(day1);         //  "2021-05-31T16:00:00.000Z"
        var day2 = new Date('2021-5-1 8:8:8')
        console.log(day2);         //   "2021-05-01T00:08:08.000Z"

日期格式化

        console.log(day.getFullYear());  // 返回当前年份
        console.log(day.getMonth() + 1);     // 返回当前月份(0-11月)
        console.log(day.getDate());     // 返回几号
        console.log(day.getDay());      // 返回星期几(星期天为0)
        console.log(`Today is ${day.getFullYear()}.${day.getMonth() + 1}.${day.getDate()}`);

时间格式化

        console.log(day.getHours());
        console.log(day.getMinutes());
        console.log(day.getSeconds());
        function getTime() {         // 时间格式封装函数
            var h = day.getHours();
            h = h < 10 ? '0' + h : h;
            var m = day.getMinutes();
            m = m < 10 ? '0' + m : m;
            var s = day.getSeconds();
            s = s < 10 ? '0' + s : s;
            var time = `${h}:${m}:${s}`
            return time;
        }

        console.log(getTime());

获取日期的总的毫秒数(时间戳)
计算机预制起始时间统一为 1970 年 1 月 1 日

        console.log(day.valueOf());   // 返回现在距离1970年1月1日的毫秒数
        console.log(day.getTime());   // 同上

简单写法:

        var  date1 = +new Date();
        console.log(date1);

或直接写成:

        console.log(Date.now());    // H5新增方法

倒计时案例
倒计时并不能直接用显示的时间相减
这里采用时间戳相减得到剩余时间毫秒数
再将毫秒数转换为显示的时间格式

        function countDown(time) {
            var nowTime = +new Date();    // 返回当前时间的时间戳
            var deadLine = +new Date(time);   // 返回指定时间的时间戳
            var times = (deadLine - nowTime) / 1000; // time是剩余时间的时间戳(单位是秒)

            var min = parseInt(times / 60 % 60);
            min = min < 10 ? '0' + min : min;
            var hour = parseInt(times / 60 / 60 % 24);
            hour = hour < 10 ? '0' + hour : hour;
            var day = parseInt(times / 60 / 60 / 24);
            var sec = parseInt(times % 60);
            sec = sec < 10 ? '0' + sec : sec;

            var countTime = `${day}day  ${hour}:${min}:${sec}`;
            return countTime;

        }

        console.log(countDown('2022-1-1 00:00:00'));

内置对象:数组

数组对象

        var arr = [];    // 利用数组字面量创建空数组
        var arr1 = new Array(3);    // 创建的还是一个空数组,里面有3个空的数组元素
        console.log(arr1);
        var arr2 = new Array(1,2,3);  
        console.log(arr2);   // [1,2,3]

检测是否为数组

利用 instanceof 运算符

        console.log(arr1 instanceof Array);   // true
        console.log(arr instanceof Array);    // true
        var obj = new Object;
        console.log(obj instanceof Array);    // false

利用内置方法 Array.isArray() IE9以上版本支持

        console.log(Array.isArray(arr1));    // true

添加或删除数组元素

push() 在数组末尾追加元素

        console.log(arr2.push(4,'apple'));   // push()操作完毕之后,会返回新数组长度
        console.log(arr2);

unshift() 在数组开头追加元素

        console.log(arr2.unshift('head',0));
        console.log(arr2);

pop() 删除数组末尾的一个元素

        var arr3 = arr2;
        console.log(arr3.pop());  // pop()操作完毕之后也会返回值,返回值为被删除的元素
        console.log(arr3);

shift() 删除数组开头的一个元素

        console.log(arr3.shift());
        console.log(arr3);

翻转数组

        console.log(arr3.reverse());

排序

        var arr4 = [3, 7, 5, 9, 6, 2, 1]
        arr4.sort();
        console.log(arr4);    //   1,2,3,5,6,7,9

当数组中包含两位数以上的元素时,仅仅使用 sort() 不会带给你想要的结果:

        var arr5 = [1, 15, 6, 8, 22, 54, 5, 9, 96, 72]
        console.log(arr5.sort());   //  [1, 15, 22, 5, 54, 6, 72, 8, 9, 96]

造成这种情况的原因是 sort() 仅仅是按照首个字符大小进行排序
如果需要按照数值大小排序,可以这样操作:

        arr5.sort(function (a, b) {
            return a - b;  // 升序排列
            // return b - a;   降序排列
        });
        console.log(arr5);

返回数组元素索引号

如果数组内有相同元素,则返回第一个元素的索引号
如果数组内没有对应元素,则返回-1

        var colors = ['red', 'blue', 'yellow', 'green'];
        console.log(colors.indexOf('yellow'));   // 2
        console.log(colors.indexOf('black'));   // -1  

同样返回数组元素的索引号,区别是从后往前查找

        console.log(colors.lastIndexOf('green'));    // 4

实例,数组去重

算法:遍历旧数组,取得旧数组的元素到新数组里去查询,如果该元素在新数组里没有出现过,则添加进去,反之则不添加

        function uniqueArr(arr) {
            var newArr = [];
            for(var i = 0; i < arr.length; i++){
                if (newArr.indexOf(arr[i]) == -1){
                    newArr.push(arr[i]);
                }
            }
            return newArr;
        }

        var demo = ['a', 'z', 'h', 'z', 'b', 'a', 'k', 'z', 'h'];
        console.log(uniqueArr(demo));    // ["a", "z", "h", "b", "k"]

实例,数组转换为字符串

        var arr = [1, 2, 3];
        console.log(arr.toString());  // 1,2,3

        var arr1 = ['apple', 'orange', 'banana'];
        console.log(arr1.join());    // apple,orange,banana
        console.log(arr1.join(' & '));   // apple & orange & banana

内置对象:字符串

字符串对象

根据字符返回位置

        var str = 'this is a para but contain nothing interesting...'
        console.log(str.indexOf('s'));   // 3 
                                                       // 仅返回该字符首次出现的位置

indexOf() 可以添加第二个参数作为起始位置,即从给定的起始位置开始查找

        console.log(str.indexOf('s', 4));    // 6

同样地,也有 lastIndexOf() 方法,可以从后向前查找,这里不再赘述

实例,查找字符串内某个字符重复出现的位置和次数

算法:先查找第一个字符串的位置
只要 indexOf() 的值不是 -1 ,就继续查找下去
indexOf() 方法只能查找一个元素,所以每一次查找完毕后,都要从 当前索引 + 1 的位置开始继续查找

        function  getSameChara(str,le) {
            var index = str.indexOf(le);
            var num = 0;
            var arr = [];
            while(index != -1){
                arr.push(index);
                num++;
                index = str.indexOf(le,index + 1);
            }
            return [arr,num]
        }

        console.log(getSameChara(str,'i'));

根据索引位置返回字符

charAt() 方法返回字符

        var str = 'omewspg'
        console.log(str.charAt(5));   // p

遍历所有字符

        var arr1 = [];
        for(i = 0; i < str.length; i++){
            arr1.push(str.charAt(i));
        }
        console.log(arr1);     // ["o", "m", "e", "w", "s", "p", "g"]

charCodeAt() 方法返回字符ASCII码

        console.log(str.charCodeAt(5));   // 112

str[index] H5新增方法,同样用来返回字符

        console.log(str[5]);   // p

实例,统计出现次数最多的字符

算法: 利用charAt()遍历字符串
将字符串存的每个字符储为对象的属性,如果遍历到重复的字符串,则该属性+1
遍历对象,得到属性值最大的属性与该字符

        var str = 'this is a para but contain nothing interesting...'
        var obj = {};
        for (var i = 0; i < str.length; i++){
            var chars = str.charAt(i);
            if(obj[chars]){     // 通过中括号+变量的方式来追加属性,点表示法做不到这一点
                obj[chars] ++;
            }else{
                obj[chars] = 1;
            }
        }
        console.log(obj);
        // 遍历对象
        var max = 0;
        var ch = '';
        for(var k in obj){
            if(obj[k] > max){
                max = obj[k];
                ch = k;
            }
        }
        console.log(max);
        console.log(ch);

字符串操作方法

拼接

        var str1 = 'omew';
        console.log(str1.concat('spg'));   // 效果类似于 + 号

截取

        var str2 = 'this is a para...'
        console.log(str2.substr(5,2));   // 第一个参数表示起点索引号;第二个参数表示取几个字符

        console.log(str2.slice(5,7));   // 第一个参数表示起点索引号;第二个参数表示截止索引号(该索引对应字符无法取得)
                                        // 上面两个例子的输出都是 is

替换

        console.log(str2.replace('para','apple'));   // 将首个para字符替换为apple

如果需要替换所有相同字符,可以使用循环操作

        while(str2.indexOf('a') !== -1){
            str2 = str2.replace('a','*');
        }
        console.log(str2);

字符串转换为数组 split() (数组转换为字符串 join)

        var str3 = 'car&plane&boat'
        console.log(str3.split('&'));    // ["car", "plane", "boat"]

字符串的不可变性

字符串的不可变性.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容