Javascript基础

JS总结

1.JS概述

(1)历史

1995年,JS最早出现在Netscape的浏览器中

1996年,IE3中也可以出现了JS,称作JScript

1997年,JS被提交给了ECMA组织,制定了JS的标准规范ECMAScript

2009年,JS遵循CommonJS规范,开始向服务器端发展

(2)现状

JS就可以运行在客户端浏览器,也可以运行在服务器端

(3)特点

解释型语言,编译一行执行一行

弱类型语言

基于对象

跨平台

(4)应用场景

开发浏览器端的交互效果,进行服务器端开发,例如:创建WEB服务器、访问数据库、调用其它的服务器...

2.开发环境

(1)浏览器端

每个浏览器都有自带的一套JS解释器执行JS代码

世界上5大浏览器:谷歌、火狐、edge、Safari、欧朋

内核

(2)服务器端

Node.js

下载地址:https://nodejs.org

在命令行cmd下输入 node -v 查看到版本号

(3)运行JS

浏览器端

创建01.html和01.js,将js文件嵌入到html

  <script src="01.js"></script>  

Node.js

node 拖拽要运行的文件 回车

3.JS的语法规范

区分大小写

每行代码结束的分号可以省略

分为单行注释(//)和多行注释(/* */)

4.变量

存储数据的容器

(1)声明变量

 var x=1; 

 var a=1,b=2;

使用关键字var来声明变量,也可以一次声明多个变量

(2)变量的命名规则

可以由字母、数字、下划线、美元符号组成,不能以数字开头,不能使用关键字

语义化(可读性)

用户名 user_name userName yongHuMing

密码 password

(3)变量的赋值

变量声明后未赋值则为undefined(未定义)

变量声明后可以被重新赋值,并且赋不同类型的值,这是弱类型语言的特点

练习:声明多组变量分别保存商品的单价和数量,声明变量暂时为空,用于保存总价,计算总价并打印结果。

5.常量

和变量一样用于存储数据的容器,声明后必须赋值,不允许重新赋值

const pi=3.14;

6.数据类型

分为原始类型和引用类型

原始类型分为数值型、字符串型、布尔型、未定义型、空

(1)数值型

整型

10进制

1 2 3 .... 7 8 9 10 11 ... 15 16

8进制

1 2 3 ... 7 10 11 12

16进制

1 2 3 ... 7 8 9 a ... f 10

8进制以0开头的数字,例如012

16进制以0x开头的数字,af代表1015,不区分大小写

浮点型

3141.5E-1

314.15

31.415E+1

3.1415E+2

typeof 检测数据类型

(2)字符串型

被引号包含的数据,不区分单双引号

查看任意一个字符的Unicode码

'a'.charCodeAt()

(3)布尔型

只有两个值,分别是true和false,代表真和假

通常用于保存只有两个状态的数据,例如是否登录、是否在线... 一些运算符的结果也是布尔型

(4)未定义型

只有一个值是undefined,代表一个空值,例如声明了变量未赋值为undefined

(5)空

只有一个值是null,类型是object,常结合对象一起使用

7.数据类型转换

分为隐式转换和强制转换

1)隐式转换

在运算过程中自动产生的数据转换

(1)数字+字符串 数字转换为字符串

1 + '2' // '12'

(2)数字+布尔型 布尔型转换数值 true -> 1 false -> 0

  var a = 2 + true //3

  var b = 2 + false //2

(3)布尔型+字符串 布尔型转为字符串

  var c = true + '5' //'true5'

加号(+)的作用 执行数字之间的加法运算 执行字符串之间的拼接

NaN:Not a Number(不是一个数字) 在将一个数据转换为数值型时候,没有成功得到一个数字就会返回NaN NaN和任意数字执行运算,结果还是NaN

所有的隐式转换为数字都是会自动调用函数Number完成的

2)强制转换

(1)强制转换为数值型

Number()

Number('1') //1 Number(true) //1 Number(false) //0 Number(undefined) //NaN Number(null) //0 Number('1a') //NaN

(2)强制转换为整型

parseInt()

强制将字符串和小数转为整型

parseInt('3.94') //3   
parseInt('6.18a') //6  
parseInt('a6.18')  //NaN  
parseInt(5.9) //5  

undefined null true false都是返回NaN

(3)强制转换为浮点型

parseFloat()

强制将字符串转换为浮点型

parseFloat('3.14') //3.14 parseFloat('6.18a') //6.18 parseFloat('6a') //6 parseFloat('a6.18') //NaN

(4)数值和布尔型强制转字符串

toString()

  var  num = 5;  num.toString() //'5'  

8.运算符

表达式:由数据本身或者由运算符连接的操作数据组成的形式称作表达式

运算符分为算术运算符、比较运算符、逻辑运算符、位运算符、赋值运算符、三目运算符

(1)算术运算符

+ - * / % ++ --

% 取余

++ 自增,在原来的基础之上加1

-- 自减,在原来的基础之上减1

(2)比较运算符

> < >= <= ==(等于) !=(不等于) =(全等于) !(不全等于)

等于:只是比较两者的值是否相同,可能会发生隐式转换

全等于:同时比较类型和值,都相同结果才是true,否则false

不等于:比较值是否不相同

不全等于:同时比较类型和值,有一个不等为true,否则false

3>'10' 数字和字符串比较,字符串转为数值

'3'>'10' 字符串比较,比较的是首个字符的Unicode码

'3' -> 51 '1' -> 49

var a = 3>'10a' //false

var b = 3<'10a' //false

var c = 3=='10a' //false

NaN和任何值比较(> < >= <= == ===)结果都是false NaN == NaN //false

(3)逻辑运算符

&& || !

&& 逻辑与,关联的两个条件都为true,结果是true,否则false

|| 逻辑或,关联的两个有一个为true,结果是true,否则false

! 逻辑非,取反

短路逻辑

逻辑与,如果第一个条件是false,就不再执行第二个条件

逻辑或,如果第一个条件是true,就不再执行第二个条件

练习:以下程序运行是否会报错

  var  a = 3;  a  > 1 && console.log(num);  a  < 5 || console.log(num);  

短路逻辑关注点在于是否会执行第二个表达式。

练习:声明变量保存一个人的年龄,使用短路逻辑,如果满18岁打印‘成年人’

(4)位运算符

模拟计算机底层的运算,先把数据转为2进制,然后进行运算;当运算完以后再把结果转回成10进制。

& 按位与,上下两位都是1结果是1,否则是0

| 按位或,上下两位含有1结果是1,否则是0

^ 按位异或,上下两位不同是1,相同是0

>> 按位右移,删除最后的位数,在原来基础之上除以2再取整,例如7>>1 执行 parseInt(7/2)

<< 按位左移,在末尾补0,在原来的基础之上乘以2,例如3<<1 执行3*2

(5)赋值运算符

= += -= *= /= %= ... 运算赋值:先执行运算,再执行赋值

(6)三目运算符

一目运算符:由一个运算符连接的一个操作数据或者表达式 ! ++ --

二目运算符:由一个运算符连接的两个操作数据或者表达式

三目运算符:由两个运算符连接的三个操作数据或者表达式

条件表达式 ? 表达式1 : 表达式2

如果条件表达式为true,执行表达式1

如果条件表达式为false,执行表达式2

9.浏览器端函数

alert() 弹出警示框

prompt() 弹出提示框(输入框),需要使用变量保存用户输入的值,类型是字符串型,如果点击取消返回null

10.流程控制

1.判断

(1)if语句

image

if(age >= 18){
    console.log('成年人')
}

以下5种情况隐式转换为布尔型为false:0 NaN '' undefined null

(2)if-else语句

image

var age = 19;
if(age >= 18){
    console.log('成年人')
}else{
    console.log('未成年');
}

(3)if-else嵌套

image

var n = 1;
if(n === 1){
    console.log('非洲');
}else if(n === 2){
    console.log('印度');
}else if(n === 3){
    console.log('日本');
}else{
    console.log('??');
}

(4)switch-case

image

var n = 2;
switch(n){
    case 0:
        console.log('星期日');
        break;
    case 1:
        console.log('星期一');
        break;
    case 2:
        console.log('星期二');
        break;
    case 3:
        console.log('星期三');
        break;
    case 4:
        console.log('星期四');
        break;
    case 5:
        console.log('星期五');
        break;
    case 6:
        console.log('星期六');
        break;
    default:
        console.log('错误的星期');    
}

表达式在和case后的值比较的时候,用的是全等于(===)

对比if-else和switch-case

if-else可以进行各种条件的比较,switch-case只能进行全等于的比较

switch-case的代码结构更为清晰,执行效率更高

2.循环

(1)while循环

image

while (true) {
    console.log(i);
    if(i === 10){
        break; //break: 在循环体中使用,用于跳出循环,不再执行任何循环中的代码
    }
    i++;
}

(2)do-while循环

image

var a = 1;
do {
    console.log(a);
    a++;
} while (a <= 10);

(3)for循环

image

for (let k = 1; k <= 100; k++) {
    if (k % 3 ===0 || k % 4 === 0) {
        continue; //continue:跳过后续循环体代码,还会往后继续执行  break:跳出循环,结束循环的执行
    }
    console.log(k);
}

(4)循环嵌套

var x = 0;
while (x < 5) {
    for (var index = 0,star = ''; index < 5; index++) {
        star += '*';
    }
    console.log(star); 
    x++;
}
//循环嵌套
//在一个循环体的内部出现了另一个循环
//任意两个循环之间都可以相互嵌套

11.函数

函数分为系统函数和自定义函数

Number()/parseInt()/parseFloat()/alert()/prompt()

1.函数

函数:是一个功能体,需要提供若干个数据,返回处理的结果 —— 用于封装重复执行的代码、**

(1).创建函数

function laba() {
    console.log('1');
    console.log('2');
}

laba();//调用

(2)创建带有参数的函数

function getSum(a,b) {
    console.log(a+b);
}
getSum(1,2);//调用

创建函数时的参数称作形参,调用函数时的参数称作实参,实参会赋值给形参,实参的数量可以和形参的数量不匹配,如果形参未被赋值则为undefined

(3)创建带有返回值的函数

function getSum(a,b) {
    return a+b;
}
var n = getSum(1,2);
console.log(n);//调用

如果函数中没有写return或者return后没有任何值,则返回undefined 一旦执行return,就会跳出函数的执行

对比return和break

return用于函数中,跳出函数的执行

break用于循环和switch-case,跳出循环或者switch-case语句

2.变量的作用域

(1)全局变量:

全局作用域(函数以外)声明的变量就是全局变量,可以在任意的作用域下访问到

(2)局部变量:

函数作用域下声明的变量就是局部变量,只能在当前的作用域下访问到

在函数内不加var声明的变量是全局变量,后期在严格模式下报错,不推荐

//全局作用域
//全局变量
var a = '北京城管';
function shi(params) {
    //函数作用域
    //局部变量
    var b = '石景山城管';
    console.log(a);
}
shi();
//console.log(b);

var n1 = 6;
function fn() {
    //函数内不用var声明的变量 是全局变量
    n = 2;
    //访问到全局变量 可以重新赋值
    n1 = 8;
}
fn();

(3)变量提升:

程序执行前,会将var声明的变量提升到所在作用域的最前边,只是提升声明,赋值不提升

//变量提升 程序执行前 会将var 声明的变量提升到所在作用于的最前面,只提升声明 赋值不提升。
var a
console.log(a);
var a = 1;

function fn() {
    console.log(b);
    var b = 2;
}
fn();
//console.log(b); // b is not defined

3.函数的作用域

(1)全局函数:

在全局作用域下创建的函数,可以在任意的作用域访问

(2)局部函数:

在函数作用域下创建的函数,只能在当前的作用域访问

(3)函数提升:

程序执行前,会将函数整体提升到所在作用域的最前边

//全局函数
function fun1() {
    //局部函数
    function fun2() {
        console.log(1);
    }
    fun2();
}
fun1();
//fun2(); //fun2 is not defined

//函数提升 程序执行前 会将函数整体提升到所在作用域的最前面
foo();
function foo() {
    console.log(4);
}

4.递归

是一个函数的内部调用自身这个函数,本身是一个死循环

递归一直运行会产生内存泄漏,造成系统崩溃

如何使用:

要有边界条件,结合着return使用

JS属于单线程运行逻辑,无法充分利用CPU内核,递归对CPU消耗比较大,JS不适合深层次的递归嵌套。

//打印第三次 结束
var count = 0;
function say() {
    console.log('从前有座山');
    count++;
    if (count === 3) {
        return 3;
    }
    //递归
    //把返回的结果 传给上一次调用
    return say();
}
console.log(say());

//斐波那契数列
function fib(x) {
    if(x === 1 || x === 2){
        return 1;
    }
    
    return fib(x-1) + fib(x-2);
}
console.log(fib(3));


//1-n 整数和
function sum(n) {
    if(n === 1){
        return 1;
    }
    return n+sum(n-1);
}
console.log(sum(100));

5.匿名函数

(1)创建函数

//匿名函数
//变量名称就是函数名称
var fun = function(){
    console.log('ok');
}

fun();

对比函数名称函数名称()

函数名称():调用函数,得到函数的返回值

函数名称:本质上就是一个变量,保存了一个函数

对比函数声明函数表达式创建函数的区别

函数声明存在函数提升,可以先写调用再写创建;

函数表达式只是变量声明提升,必须先写创建再写调用

(2)匿名函数自调用

目的是为了防止全局污染

(function(a){
  var num = 4;
  console.log(num,a);
})(20);//传参

(3)回调函数

将函数作为参数来传递到另一个函数

function a(x){
  console.log('1');
  console.log('2');
  //x=b
  //x=function(){}
  //传递的函数需要通过形参来接收,通过形参来调用
  x();//相当于dong() // (function(){})()
}
function b(){
  console.log('3');
  console.log('4');
}
//把函数dong作为实参传递,dong就是回调函数
a(b);
//把匿名函数作为实参传递
a(function(){
  console.log('5');
});

6.系统函数

(1)isNaN()

判断一个值是否为NaN,会隐式转换为数值型,是NaN -> true 不是NaN -> false

var a = '2';
console.log( isNaN(a) );

(2)isFinite()

判断一个值是否为有限值,只有Infinity是无限值,其它都是有限值 2/0 -> Infinity

console.log(-2/0);//Infinity 无限值
console.log(2/3);
//是否为有限值
console.log( isFinite(2/0) );//false
console.log( isFinite(2/3) );//true

(3)eval()

执行字符串表达式

var str = 'parseInt(5.5)';
console.log(str);//parseInt(5.5)
console.log( eval(str) );//5

12.对象

是一组属性和方法的集合 万物皆对象

一部手机,属性有颜色、品牌、CPU、内存... 方法有打电话、发短信、玩游戏、看视频、办公...

1.JS中的对象

  • 自定义对象:用户自己创建的对象
  • 内置对象:JS提供的对象
  • 宿主对象:根据不同的执行环境划分

2.自定义对象创建方式

  • 对象字面量
  • 内置构造函数
  • 自定义构造函数

3.对象字面量

{ 属性名1: 属性值1, 属性名2: 属性值2.... }

属性名的引号可以省略,如果含有特殊字符必须添加

//对象字面量
var phone = {
  brand: '华为',
  color: '黑色',
  'size': 6.18,
  'made-in': '中国'
};

4.访问属性

  • 对象.属性名

  • 对象['属性名']

  • 如果访问没有的属性,则返回undefined

    //访问属性
    console.log(laptop.lid);
    console.log(laptop['is-onsale']);
    console.log(laptop['price']);
    console.log(laptop.memory);
    

5.内置构造函数

new Object() 创建一个空对象,需要单独的添加每个属性

//内置构造函数
var emp = new Object();
//需要单独添加属性
emp.eid = 1;
emp.ename = '涛哥';
emp['sex'] = '男';

6.遍历属性

var student = {
  sid: 1,
  name: 'dong',
  sex: '男',
  score: 82
};
//遍历   键值对
for(var k in student){
    //k代表属性名
  console.log(k,student[k]);
}

7.检测属性是否存在

  • 对象.属性名 === undefined 存在 -> false 不存在 -> true

  • 对象.hasOwnProperty('属性名') 存在 -> true 不存在 -> false

  • '属性名' in 对象 存在 -> true 不存在 -> false

    //检测属性是否存在 对象.属性名 === undefined 存在 false 
    var person = {
        name : 'x',
        sex : '1'
    };
    
    console.log(person.age === undefined);
    //检测属性是否存在 对象.hasOwnProperty('属性名') 存在 true 
    console.log(person.hasOwnProperty('age'));
    
    //检测属性是否存在 '属性名' in 对象 存在 true 
    console.log('age' in person);
    

8.对象中的方法

方法对应的是一个函数

var person = {
    name : 'hui',
    //成员方法
    play : function(){
        //this 指代调用方法的对象
        console.log(this.name + 'tai');
    },
    play2 : function(a,b){
        return a + b;
    }
};
console.log(person);
person.play();
console.log(person.play2(1,2));

13.数据的存储

  • 原始类型,将数据直接存储在栈内存;

  • 引用类型,将数据存储在堆内存中,然后自动生成一个16进制地址,然后将地址保存在栈内存

image

//原始类型
var a = 1;
//把a的值拷贝一份,再赋给b
//a和b都是独立的
var b = a;
a = 2;
//console.log(a,b);

var ming = {
  color: '绿色',
  size: 'XL'
};
var hong = ming;
hong.color = '红色';
ming.size = 'XXL';
console.log(ming);
console.log(hong);
//两个对象比较的是地址
console.log(ming === hong);

var p1 = {price: 5000};
var p2 = {price: 5000};
console.log(p1 === p2);

//var fn1=function(){}
function fn1(){
  console.log(1);
}
//两者指向同一个函数
var fn2=fn1;
//fn1 = 2;
console.log(fn2);
console.log(fn1);
//引用类型的数据,如果没有被任何地址所指向就会自动销毁
//null 空地址,没有指向任何堆内存的数据
//如果赋值为null,用来销毁一个引用类型的数据
fn1=null;
fn2=null;

14.数组

就是一组数据的集合

1.字面量创建数组

[ 元素1, 元素2 ... ]

//创建数组
//字面量
var arr = ['a','b',20,true,null,{}];
//console.log(arr);

2.访问数组元素

数组[下标]

下标:自动为每个元素添加的编号,从开始的整数

如果访问不存在的元素,则结果为undefined

var title = [
  '华为',
  '小米Air',
  '戴尔燃'
];
//下标:自动为每个元素添加的编号,从0开始的整数
console.log( title[3] );//undefined
title[0] = '荣耀';
title[3] = '联想';
title[6] = '苹果';

3.数组的长度

数组.length 获取数组元素的数量

在数组末尾添加元素 数组[ 数组.length ] = 值

var country = ['瓦坎达','日本','印度','土耳其'];
//用长度作为下标
country[ country.length ] = '美国';
country[ country.length ] = '英国';
country[ country.length ] = '德国';
//获取数组长度
console.log( country.length );
console.log(country);

4.内置构造函数创建数组

new Array(元素1,元素2,...)

new Array(4) 创建数组,初始化长度为4,可以添加更多个元素

//构造函数
var arr = new Array('阿里巴巴','腾讯','京东');
var arr2 = new Array(4);

5.数组的分类

索引数组:以0及以上的整数作为下标

关联数组:以字符串作为下标,只能单独的添加元素

关联数组不能使用length属性获取数组的长度

//索引数组
//关联数组:以字符串作为下标
var arr = [];
arr['id'] = 9;
arr['title'] = '标题1';
arr.ctime = '2021-6-15';
console.log(arr);

6.遍历数组元素

依次访问数组中的每个元素

for-in for(var k in 数组)
循环 —— 推荐用法 for(var i=0;i < 数组的长度;i++)
var arr = ['a','b','c','d'];
//遍历
for(var k in arr){
  //k 下标
  //arr[k] 元素
  console.log(k,arr[k]);
}

//练习:使用for循环遍历数组,0~3循环
var arr = ['a','b','c','d','e','f','g'];
for(var i = 0;i < arr.length;i++){
  //i 下标
  //arr[i]  元素
  console.log(i, arr[i]);
}

7.API

应用程序编程接口:JS中预定义的函数或者对象下的方法

toString() 将数组转为字符串

var arr = ['a','b','c'];
//数组转为字符串
console.log( arr.toString() );//'a,b,c'

join('-') 将数组转为字符串,默认用逗号分割元素,可以指定分割符号

var arr = ['a','b','c'];
console.log( arr.join('-') );

concat(arr2,arr3...) 拼接多个数组,arr2,arr3代表要拼接的数组

var arr1 = ['a','b','c'];
var arr2 = ['d','e','f'];
var arr3 = ['g','h','i'];
//拼接多个数组
console.log( arr1.concat(arr2,arr3) );

API:https://www.w3school.com.cn/jsref/jsref_obj_array.asp

8.二维数组

对数据进行二次分类

//二维数组
var arr3 = [
    ['a','b','c'],
    ['d','e','f'],
    ['g','h','i']
];
console.log(arr3[2][1]);

15.字符串对象

1.包装对象:

目的是为了让原始类型的数据像引用类型的数据一样,具有属性和方法,一共三种包装对象,字符串对象,数值对象,布尔对象

new String() 将数据强制转换为字符串,返回对象

String() 将数据强制转换为字符串,返回字符串

var str1 = '1';//自面量
//构造函数
var str2 = new String(1);
var str3 = String(1);
console.log(str1);
console.log(typeof str2,str2);
console.log(typeof str3,str3);

var arr = null;
//将特定的数据转
console.log(arr.toString());
//不限数据类型
console.log(String(arr));

2.转义字符

转换字符本身的意义

' 将具有特殊意义单引号转为普通引号

\n 将普通的字符n转义为换行符

\t 将普通的字符t转义为制表符(tab键效果)

//转义字符\
console.log('It\'s a dog');
//换行符
console.log('a\nd');

//tab
console.log('a\td');
console.log('C:\\Users\\web');

3.API

https://www.w3school.com.cn/jsref/jsref_obj_string.asp

var str = 'javascript';
//获取字符串长度
console.log(str.length);
//通过下标找字符
console.log(str.charAt(8));
console.log(str.charAt(4),str[4]);
//遍历字符串 查a出现次数
var count = 0;
for (let i = 0; i < str.length; i++) {
    if (str[i] === 'a') {
        count++
    }
    
}
console.log(count);
//查找满足条件的第一个
console.log(str.indexOf('s'));
//查找满足条件的最后一个
console.log(str.lastIndexOf('a'));

//邮箱 没有@ 打印非法邮箱  或合法邮箱
var email = 'liu0320@163.com';
var flg = email.indexOf('@')
if (flg === -1) {
    console.log('非法邮箱');
} else {
    console.log('合法邮箱');
}

//英文字母大小写转化
var str2 = 'JavaScript';
console.log(str2.toUpperCase());
console.log(str2.toLowerCase());

//截取字符串
console.log(str2.slice(4));
console.log(str2.slice(4,7));
console.log(str2.slice(-3,-1));

//分别截取出 邮箱的用户名  域名
var index = email.indexOf('@')
console.log(email.slice(0,index));

console.log(email.slice(index+1));

//substr
console.log(str2.substr(0,2));
console.log(str2.substr(-3,2));
//身份证号码 出生年月  性别(倒数第二) 奇数男 偶数女 
// xxxx年 xx月 xx日 性别x
var id = '210682199511230029' 
var birthday = id.substr(6,4) + '年' + id.substr(10,2) + '月' + id.substr(12,2) + '日';
var sex = id.substr(-2,1);
 if (sex % 2 === 0) {
     sex = '女';
 } else {
     sex = '男';
 }
sex = sex % 2 ? '男' : '女'
console.log(birthday + '性别:' + sex);

//数组转字符串
var arr = ['a','b','c']; 
console.log(arr.join('-'));

//字符串转数组
var str3 = 'a-b-c';
console.log(str.split('-'));

//获取后缀名
var img = 'abx.123.tt.jpeg';
var arr = img.split('.');
console.log(arr[arr.length-1])

//反转字符串
var arr2 = str.split('');
console.log(arr2.reverse().join(''));

16.Math对象

不需要创建,可以直接使用API

https://www.w3school.com.cn/jsref/jsref_obj_math.asp

console.log(Math.PI);
//绝对值
console.log(Math.abs(-1));
//向上取整
console.log(Math.ceil(5.1));
console.log(Math.ceil(-5.1));
//向下取整
console.log(Math.floor(5.9));
console.log(Math.floor(-5.9));
//四舍五入取整
console.log(Math.round(3.5));
//获取一组数字的最大值
console.log(Math.max(23,9,78,6,45));
//获取一组数字的最小值
console.log(Math.min(23,9,78,6,45));
//计算x的y次方
console.log(Math.pow(5,3));
//随机
console.log(Math.random());

var arr3 = ['a','b','c','d','e','f','g','h'];
//0 - 9之间的随机整数
var n = Math.floor(Math.random()*8);
console.log(arr3[n]);

17.Date对象

用于对日期时间的存储和计算

1.创建

  • new Date('2021/6/17 10:20:30')
  • new Date(2021,5,17,10,20,30) 月份范围0~11 代表1~12月
  • new Date(1683036000000) 存储距离计算机元年的毫秒数对应的日期时间
  • new Date() 存储当前操作系统的时间
//创建时间对象
var d1 = new Date('2021/6/17 10:20:45');
console.log(d1);
//月份 0-11  对应 1- 12
var d2 = new Date(2021,5,17,10,20,30);
console.log(d2);
//距离计算机元年的毫秒数对应的日期时间
var d3 = new Date(1608336000000);
console.log(d3);
//获取当前系统时间
var d4 = new Date();
console.log(d4);

2.获取

  • getFullYear/getMonth/getDate
  • 月份范围0~11 对应1~12月
  • getHours/getMinutes/getSeconds/getMilliseconds(毫秒)
  • getTime 获取距离计算机元年毫秒数
  • getDay 获取星期 范围0~6 对应星期日~星期六
//获取
console.log(d1.getFullYear());
console.log(d1.getMonth()+1);
console.log(d1.getDate());
console.log(d1.getHours());
console.log(d1.getMinutes());
//获取距离计算纪元年毫秒数
console.log(d1.getTime());

//星期 0-6 星期日-星期六
console.log(d1.getDay());

3.转为本地字符串格式

存在兼容性问题,用于测试

  • toLocaleString() 获取完整的
  • toLocaleDateString() 获取日期部分
  • toLocaleTimeString() 获取时间部分
//转为本地字符串格式
var d = new Date();
console.log(d.toLocaleString());
console.log(d.toLocaleDateString());
console.log(d.toLocaleTimeString());

4.修改

  • setFullYear()/setMonth()/setDate()
  • setHours()/setMinutes()/setSeconds()/setMilliseconds()
  • setTime() 设置距离计算机元年毫秒会,产生具体的日期时间
//修改
var d2 = new Date('2021/6/17 14:35:40');
//修改年份
d2.setFullYear(2024);
//修改月 0 - 11
d2.setMonth(12);
//日期
d2.setDate(27);
//星期不许修改
d2.setHours(17);
d2.setTime(1932878450000);

18.Number对象

  • new Number() 将数据转为数值型,返回对象
  • Number() 将数据转为数值型,返回数值
  • toFixed(n) 强制保留小数点后n位
  • toString(n) 强制转为字符串,可以通过n设置进制
//字面量
var n1 = 1;
//number 对象
var n2 = new Number(n1);

var n3 = Number(true);
console.log(n1,typeof n1)
console.log(n2,typeof n2)

console.log(n1+2,n2+2)

console.log(n3);

//保留小数点后n位
var n = 2*3.14*5;
console.log(n.toFixed(2));
//强转字符串 可以设置进制
var num = 12;
console.log(num.toString(2));

19.Boolean对象

  • new Boolean() 将数据转为布尔型,返回对象
  • Boolean() 将数据转为布尔型,返回布尔型数据
var b1 = true;
//false : 0 NaN '' undefined null
var b2 = new Boolean(0); //返回对象

var b3 = Boolean(5);//返回boolean

var b4 = new Boolean([]);
var b5 = new Boolean({});

console.log(b1);
console.log(b2);
console.log(b3);
console.log(b4);
console.log(b5);
//隐式转换为boolean
console.log(!!{});

20.错误处理

1.常见的错误

  • 语法错误(SyntaxError):出现了中文符号,缺少括号等
  • 引用错误(ReferenceError):使用了未声明的变量
  • 类型错误(TypeError):函数或者对象下的方法找不到
  • 自定义错误:程序员自己指定的错误 throw 错误内容

2.错误处理

//错误处理 出现错误不影响后面代码的执行
var age = 75;
try {
    if(age > 60 || age < 18){
        //自定义错误
        throw '非法年龄';
    }
} catch (error) {
    //捕获错误 try出错才会执行
    //error会保存错误信息
    console.log(error);
    age = 20;
}

console.log(age)

posted on 2021-06-21 19:18  你的打法欠考虑  阅读(107)  评论(0)    收藏  举报

导航