十一.JavaScript内置对象

一、内置对象

  • JavaScript 中的对象分为3种:自定义对象 、内置对象、 浏览器对象

  • 前面两种对象是JS 基础 内容,属于 ECMAScript; 第三个浏览器对象属于我们JS 独有的, 我们JS API 讲解

  • 内置对象就是指 JS 语言自带的一些对象,这些对象供开发者使用,并提供了一些常用的或是最基本而必要的功能(属性和方法)

  • 内置对象最大的优点就是帮助我们快速开发

  • JavaScript 提供了多个内置对象:Math、 Date 、Array、String等

二、查文档

2.1 MDN

学习一个内置对象的使用,只要学会其常用成员的使用即可,我们可以通过查文档学习,可以通过MDN/W3C来查询。

Mozilla 开发者网络(MDN)提供了有关开放网络技术(Open Web)的信息,包括 HTML、CSS 和万维网及 HTML5 应用的 API。

MDN: https://developer.mozilla.org/zh-CN/

2.2 如何学习对象中的方法

  1. 查阅该方法的功能

  2. 查看里面参数的意义和类型

  3. 查看返回值的意义和类型

  4. 通过 demo 进行测试

三、Math对象

3.1 Math概述

Math 对象不是构造函数,它具有数学常数和函数的属性和方法。跟数学相关的运算(求绝对值,取整、最大值等)可以使用 Math 中的成员。

Math.PI                 // 圆周率,后不带括号
Math.floor()            // 向下取整
Math.ceil()             // 向上取整
Math.round()            // 四舍五入版 就近取整   注意 -3.5   结果是  -3 
Math.abs()              // 绝对值
Math.max()/Math.min()   // 求最大和最小值 

注意:上面的方法必须带括号

3.2 随机数方法 random()

random() 方法可以随机返回一个小数,其取值范围是 [0,1),左闭右开 0 <= x < 1

得到一个两数之间的随机整数,包括两个数在内

function getRandom(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min; 
}

四、日期对象

4.1 Date概述

  • Date 对象和 Math 对象不一样,他是一个构造函数,所以我们需要实例化后才能使用

  • Date 实例用来处理日期和时间

4.2 Date()方法的使用

4.2.1 获取当前时间必须实例化

var now = new Date();
console.log(now);   //Mon Nov 16 2020 16:20:29 GMT+0800 (中国标准时间)

4.2.2 Date()构造函数的参数

如果括号里面有时间,就返回参数里面的时间。例如日期格式字符串为‘2019-5-1’,可以写成new Date('2019-5-1') 或者 new Date('2019/5/1')

  • 如果Date()不写参数,就返回当前时间

  • 如果Date()里面写参数,就返回括号里面输入的时间

4.3 日期格式化

我们想要 2019-8-8 8:8:8 格式的日期,要怎么办?

需要获取日期指定的部分,所以我们要手动的得到这种格式。

日期格式化.png

示例:

var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var dates = date.getDate();
var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
var day = date.getDay();
console.log('今天是:' + year + '年' + month + '月' + dates + '日' + arr[day]);
//今天是:2020年11月16日星期一


function getTime(){
    var time = new Date();
    var h = time.getHours();
    h = h < 10 ? '0' + h : h;
    var m = time.getMinutes();
    m = m < 10 ? '0' + m : m;
    var s = time.getSeconds();
    s = s < 10 ? '0' + s : s;
    return h + ':' + m + ':' + s;
}
console.log(getTime());  //16:44:05

4.4 获取日期的总的毫秒形式

Date 对象是基于1970年1月1日(世界标准时间)起的毫秒数

我们经常利用总的毫秒数来计算时间,因为它更精确

// 实例化Date对象
var now = new Date();
// 1. 用于获取对象的原始值
console.log(date.valueOf());     //1605516760854
console.log(date.getTime());     //1605516760854
// 2. 简单写可以这么做
var now = + new Date();
// 3. HTML5中提供的方法,有兼容性问题
var now = Date.now();

案例:倒计时效果

案例分析

①核心算法:输入的时间减去现在的时间就是剩余的时间,即倒计时 ,但是不能拿着时分秒相减,比如 05 分减去25分,结果会是负数的。

②用时间戳来做。用户输入时间总的毫秒数减去现在时间的总的毫秒数,得到的就是剩余时间的毫秒数。

③把剩余时间总的毫秒数转换为天、时、分、秒 (时间戳转换为时分秒)

转换公式如下:

  • d = parseInt(总秒数/ 60/60 /24); // 计算天数

  • h = parseInt(总秒数/ 60/60 %24) // 计算小时

  • m = parseInt(总秒数 /60 %60 ); // 计算分数

  • s = parseInt(总秒数%60); // 计算当前秒数

代码示例:

function countDown(time){
    var nowTime = + new Date(); //返回的是当前时间总的毫秒数
    var inputTime = + new Date(time); //返回的是用户输入时间总的毫秒数
    var times = (inputTime - nowTime) / 1000; //times是剩余时间总的秒数
    var d = parseInt(times/60/60/24); 
    d = d < 10 ? '0' + d : d;
    var h = parseInt(times/60/60%24);
    h = h < 10 ? '0' + h : h;
    var m = parseInt(times/60%60);
    m = m < 10 ? '0' + m : m;
    var s = parseInt(times%60);
    s = s < 10 ? '0' + s : s;
    return d + '天' + h + '时' + m + '分' + s + '秒';
}
console.log(countDown('2020-11-16 20:00:00'));

五、数组对象

5.1 数组对象的创建

创建数组对象的两种方式

  • 字面量方式
var arr = [1,2,3];
  • new Array()
var arr1 = new Array();   //创建了一个空的数组
var arr1 = new Array(2);  //创建了一个长度为2的数组

5.2 检测是否为数组

  • instanceof 运算符,可以判断一个对象是否属于某种类型

  • Array.isArray()用于判断一个对象是否为数组,isArray() 是 HTML5 中提供的方法

var arr = [1, 23];
var obj = {};
console.log(arr instanceof Array); // true
console.log(obj instanceof Array); // false
console.log(Array.isArray(arr));   // true
console.log(Array.isArray(obj));   // false

5.3 添加删除数组元素的方法

添加删除数组元素的方法.png
var arr = [1,2,3];
//1.使用push()
console.log(arr.push(4, 'linus'));  //返回 5
console.log(arr); //[1,2,3,4,'linus']

//2.使用pop()
console.log(arr.pop()); // 返回linus
console.log(arr); //[1,2,3,4]

//3.使用unshift()
console.log(arr.unshift('one'));  //返回5
console.log(arr); //['one',1,2,3,4]

//4.使用shift()
console.log(arr.shift('one'));  //返回one
console.log(arr); //[1,2,3,4]

案例:筛选数组

有一个包含工资的数组[1500, 1200, 2000, 2100, 1800],要求把数组中工资超过2000的删除,剩余的放到新数组里面

var arr = [1500, 1200, 2000, 2100, 1800];
var newArr = [];
for (var i = 0; i < arr.length; i++) {
    if (arr[i] < 2000) {
        newArr.push(arr[i]);
    }
}
console.log(newArr);

5.4 数组排序

方法名 说明 是否修改原数组
reverse() 颠倒数组中元素的顺序,无参数 该方法会改变原来的数组,返回新数组
sort() 对数组的元素进行排序 该方法会改变原来的数组,返回新数组
//1.翻转数组
var arr = [1,2,3,4,5];
arr.reverse();
console.log(arr); //[5,4,3,2,1]


//2.数组排序(冒泡排序)
var arr1 = [1, 64, 9, 6];
arr1.sort(function(a, b) {
    return b - a;      // 降序
    // return a - b;   // 升序
});
console.log(arr1);//[64,9,6,1]

5.5 数组索引方法

方法名 说明 返回值
indexOf() 数组中查找给定元素的第一个索引 如果存在返回索引号 如果不存在,则返回-1
lastIndexOf() 在数组中的最后一个的索引 如果存在返回索引号 如果不存在,则返回-1
//1.使用indexOf()
var arr = ['a','b','c','d','c'];
console.log(arr.indexOf('c')); //2
console.log(arr.indexOf('f')); //-1
//2.使用lastIndexOf()
console.log(arr.lastIndexOf('c')); //4

案例:数组去重

有一个数组[‘c’, ‘a’, ‘z’, ‘a’, ‘x’, ‘a’, ‘x’, ‘c’, ‘b’],要求去除数组中重复的元素。

案例分析

①目标:把旧数组里面不重复的元素选取出来放到新数组中,重复的元素只保留一个,放到新数组中去重。

②核心算法:我们遍历旧数组,然后拿着旧数组元素去查询新数组,如果该元素在新数组里面没有出现过,我们就添加,否则不添加。

③我们怎么知道该元素没有存在? 利用 新数组.indexOf(数组元素) 如果返回时 -1 就说明 新数组里面没有改元素

代码示例

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

5.6 数组转换为字符串

方法名 说明 返回值
toString() 把数组转换成字符串,逗号分隔每一项 返回一个字符串
join('分隔符') 方法用于把数组中的所有元素转换为一个字符串 返回一个字符串
//1.toString() 将我们的数组转换为字符串
var arr = [1,2,3];
console.log(arr.toString()); //1,2,3
//2.join(分隔符)
var arr1 = ['green','blue','red'];
console.log(arr1.join()); //green,blue,red
console.log(arr1.join('-')); //green-blue-red

5.7 数组截取

数组截取.png

slice() 和 splice() 目的基本相同

// 1.使用concat()
var arr = [1,2,3,4];
var arr1 = [5,6,7,8];
console.log(arr.concat(arr1)); // [1, 2, 3, 4, 5, 6, 7, 8]

// 2.使用slice()
var arr1 = [1,2,3,4,5,6,7,8];
console.log(arr1.slice(2,6)); // [3, 4, 5, 6]

//3.使用splice()
var arr2 = [1,2,3,4,5,6,7,8];
console.log(arr2.splice(2,3)); //[3, 4, 5]

六、字符串对象

6.1 基本包装类型

为了方便操作基本数据类型,JavaScript 还提供了三个特殊的引用类型:String、Number和 Boolean。

基本包装类型就是把简单数据类型包装成为复杂数据类型,这样基本数据类型就有了属性和方法。

// 下面代码有什么问题?
var str = 'andy';
console.log(str.length);

按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但上面代码却可以执行,这是因为 js 会把基本数据类型包装为复杂数据类型,其执行过程如下 :

// 1. 生成临时变量,把简单类型包装为复杂数据类型
var temp = new String('andy');
// 2. 赋值给我们声明的字符变量
str = temp;
// 3. 销毁临时变量
temp = null;

6.2 字符串的不可变

指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。

var str = 'abc';
str = 'hello';
// 当重新给 str 赋值的时候,常量'abc'不会被修改,依然在内存中
// 重新给字符串赋值,会重新在内存中开辟空间,这个特点就是字符串的不可变
// 由于字符串的不可变,在大量拼接字符串的时候会有效率问题
var str = '';
for (var i = 0; i < 100000; i++) {
    str += i;
}
console.log(str); // 这个结果需要花费大量时间来显示,因为需要不断的开辟新的空间

6.3 根据字符返回位置

字符串所有的方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串。

根据字符返回位置.png

案例:返回字符位置

查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数

案例分析

①核心算法:先查找第一个o出现的位置

②然后 只要indexOf 返回的结果不是 -1 就继续往后查找

③因为indexOf 只能查找到第一个,所以后面的查找,利用第二个参数,当前索引加1,从而继续查找

代码示例

var str = "abcoefoxyozzopp";
    var index = str.indexOf('o');
    var num = 0;
    while(index !== -1){
        console.log(index); //3 6 9 12
        num++;
        index = str.indexOf('o',index+1); 
    }
console.log('o出现的次数是:' + num + '次'); // o出现的次数是:4次

6.4 根据位置返回字符

根据位置返回字符.png
var str = 'codetomato';
// 1.使用charAt(index)
console.log(str.charAt(3)); // e
// 2.使用charCodeAt(index)
console.log(str.charCodeAt(0)) // 99
// 3.使用str[index]
console.log(str[0]); //c

案例:核心算法

判断一个字符串 'abcoefoxyozzopp' 中出现次数最多的字符,并统计其次数。

案例分析

①核心算法:利用 charAt() 遍历这个字符串

②把每个字符都存储给对象, 如果对象没有该属性,就为1,如果存在了就 +1

③遍历对象,得到最大值和该字符

代码示例

var str = 'abcoefoxyozzopp' ;
var o = {};
for(var i = 0; i < str.length; i++){
    var chars = str.charAt(i);  //chars 是字符串的每一个字符
    if(o[chars]){ // o[chars] 得到的是属性值
        o[chars]++;
    } else {
        o[chars] = 1;
    }
}
console.log(o);

//遍历对象
var max = 0;
var ch = '';
for (var k in o) {
    // k 得到是 属性名
    // o[k] 得到的是属性值
    if (o[k] > max) {
        max = o[k];
        ch = k;
    }
}
console.log(max);
console.log('最多的字符是' + ch);

6.5 字符串操作方法

字符串操作方法.png
//1. 使用concat(str1,str2,str3...)
var str1 = 'code';
var str2 = 'tomato';
console.log(str1.concat(str2)); //codetomato

//2. 使用substr(start,length)
var str = 'codetomato';
console.log(str.substr(4,4)); //toma

//3. 使用slice(start,end)
var str = 'codetomato';
console.log(str.slice(4,7));  //tom

//4.使用substring(start,end)
var str = 'codetomato';
console.log(str.substring(4,7));  //tom

6.6 replace()方法

replace() 方法用于在字符串中用一些字符替换另一些字符。

其使用格式如下:

//replace(被替换的字符串, 要替换为的字符串); 只会替换第一个字符
var str = 'codetomato';
console.log(str.replace('o','*')); //c*detomato

//要求把里面的多有 o 替换为 *
while(str.indexOf('o') !== -1){
    str = str.replace('o','*');
}
console.log(str); //c*det*mat*

6.7 split()方法

split()方法用于切分字符串,它可以将字符串切分为数组。在切分完毕之后,返回的是一个新数组。

例如下面代码:

var str = 'a,b,c,d';
console.log(str.split(','));   // 返回的是一个数组 [a, b, c, d]
var str1 = 'a-b-c-d';
console.log(str.split('-'));   // 返回的是一个数组 [a, b, c, d]

6.8 字符串大小写转换

方法名 说明
toUpperCase() 转换大写
toLowerCase() 转换小写

代码示例:

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

推荐阅读更多精彩内容