跳至主要內容

ES5基础

白日梦想家yy...大约 45 分钟

ES5基础

语法规范

  • 变量名可以字母、数字、下划线、横线、美元符;不能以数字、保留字、关键字名
  • 严格区分大小写
  • 分号是语句结束的标志
  • 驼峰命名为首字母大写,小驼峰则是第二个单词大写
  • 建议使用驼峰命名,尤其是小驼峰,见名知意
  • 不能省略关键字,声明未赋值,不会报错,但不能使用

错误排查

  • 语法错误会阻止所有代码都不执行

  • 除语法错误外的其它错误(包含自定义错误),只会阻止后续代码执行 T5ROUaGJsPM1ZAW.jpg

  • 语法错误,只要出现SyntaxError

acmAFhMw6UO8dCt.png
acmAFhMw6UO8dCt.png
  • 引用错误,只要出现ReferenceError
SFAbIBKPdJTXnUW.png
SFAbIBKPdJTXnUW.png
  • 类型错误,只要出现TypeError
S5xHrFPpK24c6su.png
S5xHrFPpK24c6su.png
  • 范围错误,只要出现RangeError
RW4fNnjwd3sSFEo.png
RW4fNnjwd3sSFEo.png
  • 自定义错误,只有Uncaught和自定义的提示文字
WsZJngAbNIu6Lq2.png
WsZJngAbNIu6Lq2.png
  • 自定义错误是程序员自己制定的错误
  • 语法:throw "提示文字"
throw "错误"
  • 如果不想阻止后续代码执行,可使用try{} catch(){}尝试执行,不会阻止后续代码执行,也叫异常捕获
try{
	尝试执行,可能出现错误的代码
}catch(err){
	捕获错误
	err具体错误信息
	具体处理错误方案
}

变量和常量

  • 可以改变的量,存储的数据可以重复动态修改,再次赋值就是修改
  • 省略关键字表示全局,加上关键字是局部

创建变量、声明和赋值

  • 代码理解思路:代码从左向右写,从右向左读代码

    • 语法:var a = 10; //Var为关键字,表示把10赋值给a;
  • 在ES5里,可以先声明后赋值

    • 例:
Var a;  //先声明一个变量a
a = 20//后赋值
  • 也可以声明多个变量后赋值,以逗号隔开,分号结束
    • 例:
Var a,b,c; //声明了三个不同的变量
a = 1;  //赋值给a
b = 2;  //赋值给b
c = 3;  //赋值给c
  • 当然也可以同时声明并赋值多个变量

    • 例:var m = 1,n = 2;
  • 如声明了未赋值,会输出Undefind,表示未定义,不会报错

    • 例:var a; console(a) //输出Undefind
  • 如省略关键字和赋值,则输出会报错(is not defind),意思提示未定义

    • 例:a; console(a) //a is not defind

常量

  • 存储固定不变的数据,一经定义就不能修改,任何尝试给常量再次赋值的操作都会报错
  • 常量使用const声明,为了区分变量,常量一般采用全大写字母表示
    • 语法:const PI = 3.14;

数据类型

  • 原始类型数据是直接存储在栈内存中,当一个变量的值赋值给另一个变量后,当改变其中一个变量的值后,另一个不受影响,因为他们在栈内存中是不同的变量,但值相同而已
  • 原始类型中,如果一个变量没有调用,计算机会自动回收该代码,以节省内存空间
    • 示例:
var a=1; //在栈内存中创建了一块新空间
var b=a; //把a的值复制了一份赋值给了b,同样也是在栈内存中创建了一块新空间
a=2;  //修改a的值
console.log(b);  //因为a和b在栈内存中分在不同的空间,所以改变a不会影响b
  • 引用类型是在堆内存中创建了一块新的空间,并且生成了一个16进制地址保存在栈内存中
  • 当一个引用类型的值赋值给另一个引用类型,并不是复制的值,而是复制的地址
  • 所以当改变a引用类型的数据时,b引用类型也在改变,他们都使用的是一个16进制地址去堆内存中访问的
  • 如果一个引用类型没有再使用,需要手动解除引用类型再栈内存中的地址,计算机才能实现自动回收
    • 图示:
kxcEfNW2yUgMQoa.jpg
kxcEfNW2yUgMQoa.jpg

原始类型

  • 数值类型(number)
  • 整型(整数)
    • 代码中如果以0开始或0x开始,计算机会默认为是八进制和十六进制的表示方式
    • 计算机会把各种进制转换为十进制进行输出
    • 建议自定义变量存储整数时不要以0开始,以免计算机误判
var a 10; //十进制表示方法
var b = 053;  //八进制表示方法,0开头前缀
var c = 0x53;  //十六进制表示方法,0x开头前缀
  • 浮点型(小数)
var a = 3.14;
console.log(a);
  • 使用幂运算进行科学计数法,表示较大或较小的数据
    • 使用字母e表示10为底(意思就是e*10的n次方)
var a2 = 1.5e5;  //表示1.5 * 10^5次方(e5)
  • 字符串类型(string)
    • 字符串有0个或多个字符组成,用单引号或双引号表示、
    • 会自动为每一位字符分配下标索引
    • 下标(索引)是从0开始,依次往后
    • charAt()和charCodeAt()方法如不指定具体下标,则表示的是最前面第一个索引(也就是0),做条件判断时常用
    • 使用charAt()方法查看指定下标字符
console.log(a.charAt(1)); //查看变量a的索引1对应的字符
  • 使用charCodeAt()查看指定下标对应字符的编码值
console.log(a.charCodeAt(1)); //查看变量a的索引1对应的字符编码
  • 布尔类型(boolean)
    • 只有俩个合法值true和false,常用于条件判断的结果或状态的标识?
    • 表示真假
var a = true;
var b = false;
  • 未定义(undefined)
    • 变量声明未赋值时为undefined
var a; //声明变量未赋值
console.log(a);  //输出未undefined
  • 空类型(NULL)
    • 属于对象类型,用于解除对象引用(解除引用类型的地址,让计算机实现自动回收无效的引用类型)
    • 语法:
var obj1 = {  
    name:"tom",  
    play:function (a,b){   
        console.log(a+b);  
    }
}
var obj2 =obj1;

//解除俩个对象栈内存地址,实现自动回收俩个对象
obj1=null;
obj2=null;

引用类型

  • 函数、对象、数组等都属于引用类型

检测数据类型

  • 使用typeof检测数据的类型
console.log(typeof a);  //检测变量a的值是什么类型

类型转换

自动类型转换(隐式转换)

  • 数值运算

    • 数值运算时,会自动把俩个数值运算,并不需要转换
  • 字符运算

    • 字符串参与加法运算:一律视为字符串的拼接,返回结果永远都是字符串
    • 字符串拼接使用 + 。
    • 非数字字符串无法转number,返回NaN(不是一个数字)
    • 字符串参与除加法以外的运算,会自动将字符串转换成数值进行运算
var a = "hello" + undefined;  //返回helloundefined,类型为string
var b = "3" - 1; //输出为2,类型为number
var c = "hello123" - 2;  //输出为NaN
  • 布尔运算
    • 布尔true代表数字1,false代表数字0
  • 布尔与数值参与运算时,会自动把布尔转为数值运算,输出结果也为数值
var a = 10 - true;  //返回为9,类型为数值
  • 布尔值和字符串参与除加法以外的运算时,会把双方转换为数值进行运算
  • 如无法转换为数值,则输出NaN
var a =3- true;  //返回2,类型为数值
var a = “hello123" - false;  //返回NaN
  • 布尔和布尔参与运算,返回为数值
var a = true - true;  //返回为0  类型为数值
  • 特殊值运算(undefined和null)
    • 特殊值参与运算时,undefined输出为NaN,null为0
var a = 1+undefined;  //输出为NaN
var b = 1+null;  //输出为1

强制类型转换

数值类型转换

  • Number方法转换
    • 转换数值类型时,字符串中含有字母无法解析
    • 布尔类型中的true代表数字1,false代表数字0
    • 示例:
console.log(Number("100")) //输出100
console.log(Number("h1"))  //输出NaN
console.log(Number("true"))  //输出NaN
console.log(Number(true))  //输出1
  • 字符串中提取数值
    • parseInt是在字符串里从左到右转换数值,如遇到无法转换的,则立即停止,返回已经转换的,
    • parseInt提取字符串中的整数部分
    • parseFloat提取字符串中的小数部分
    • parseFloat是在字符串里从左到右转换数值,如遇到无法转换的,则立即停止,返回已经转换的,会保留第一个小数点,第二个则不保留
    • 示例:
//parseInt
console.log(parseInt("100"))  //输出100
console.log(parseInt("100hello"))  //输出100
console.log(parseInt("H100"))  //输出NaN
console.log(parseInt(true))  //输出NaN
console.log(parseInt(3.5))  //输出3

//parseFloat
console.log(parseFloat(3.5))  //输出3.5
console.log(parseFloat("3.5hello"))  //输出3.5
console.log(parseFloat("h3.5"))  //输出NaN
console.log(parseFloat("3.5.6"))  //输出3.5
console.log(parseFloat("3.5true"))  //输出3.5
  • 特殊值转Number
console.log("---Number()---")
console.log(Number(undefined)); //输出NaN
console.log(Number(null)); //输出0

console.log("---parseInt()---")
console.log(parseInt(undefined)); //输出NaN
console.log(parseInt(null)); //输出NaN

console.log("---parseFloat()---")
console.log(parseFloat(undefined)); //输出NaN
console.log(parseFloat(null)); //输出NaN

转字符串

  • . 代表访问对象的属性方法,讲对象类型时详细说明
  • 使用toString方法转换字符串
  • undefin和null无法转换字符串,其他均可
    • 语法示例:
console.log(s1.toString());

转布尔

  • 非0的都输出true,包括非空字符串(空格字符串)
    • 0\0.0\undefined\null \NaN都出书false
    • 示例:
console.log(Boolean(100));
console.log(Boolean("100"));
console.log(Boolean(3.5));
console.log(Boolean(' '))
console.log(Boolean(''));
console.log(Boolean(0));
console.log(Boolean(0.0));
console.log(Boolean(undefined))
console.log(Boolean(null));
console.log(Boolean(NaN));

运算符

运算符优先级

  • 运算符优先级是一套规则。该规则在计算表达式时控制运算符执行的顺序。具有较高优先级的运算符先于较低优先级的运算符执行。例如,乘法的执行先于加法。
  • 圆括号可用来改变运算符优先级所决定的求值顺序。这意味着圆括号中的表达式会优先圆括号外的表达式优先执行
  • 从高到低排序
运算符描述
. [] ()字段访问、数组下标、函数调用以及表达式分组
++ -- - ~ ! delete new typeof void一元运算符、返回数据类型、对象创建、未定义值
* / %乘法、除法、取模
+ - +加法、减法、字符串连接
<< >> >>>移位
< <= > >= instanceof小于、小于等于、大于、大于等于、instanceof
== != === !==等于、不等于、严格相等、非严格相等
&按位与
^按位异或
|按位或
&&逻辑与
||逻辑或
?:条件
= oP=赋值、运算赋值
,多重求值

赋值运算

  • 将右侧的值赋值给左侧的变量
var a = 100;  //

算数运算符

  • / 有+ - * / %等算数运算符
console.log(5/2);/5除以2
console.log(5%2);//取余或取模运算
  • 自增和自减,对自身进行+1或-1的操作

  • 自增和自减只能与变量结合

  • 自增或自减会把变量转Number来自增或自减运算

  • 单独与变量结合

//单独与变量结合,放前或放后都可以
b++;
console.log(b);

++b;
console.log(b);
  • 与赋值运算符结合使用
    • ++或--放前放后的区别,放在变量前就先运算,放变量后就后运算
var c = 10;
var r1 = c++; //放后,先赋值后++
console.log("c:",c,"r1:",r1);//c:11,r1:10
Var r2 = ++c; //先++,后赋值
console.log("c:",c,"r2:",r2);//c:12,r2:12

复合运算符(扩展运算符)

  • +=、-=、*=、/=、%=
  • 常用于字符串拼接,左侧的变量等于左侧变量和右侧变量运算后的值
  • 语法:
var a = 1;
var b = 2;
a += b; // a = a+b

逻辑运算符

  • &&(逻辑与)、| |(逻辑或)、!(逻辑非)
  • 连接俩个表达式,检测条件是否成立,最终结果为布尔值
  • 逻辑与&&
    • 俩个表达式同时成立,则返回true
var r1 = 5>3 && 10>5;
console.log(r1);

var r2 = 5<3 && 10>5;
console.log(r2)
  • 逻辑或 | |
    • 只要有一个表达式成立,则返回true
var r3 = 5<3 || 10>5;
console.log(r3);

var r4 = 5<3 || 10<5;
console.log(r4)
  • 逻辑非 !
    • 对当前表达式结果取相反结果(如果真,就取假,如果假,就取真)
var r5 = !(5>3);
console.log(r5);

var r6 = !0;
console.log(r6);

比较运算符(关系运算符)

  • 、<、>=、<=、==、!=、===、!==、

  • 比较运算返回的结果是布尔值
  • 字符串参与比较运算时,比较的是字符串对应的unicode编码,逐位比较
  • 查询unicode编码方法为charCodeAt();方法
  • 如果NaN参与比较运算,结果一律为false
    • 示例:
r1 = 5>3;
console.log.log(r1);

r2 = "5" > 3; //5>3
r3 = "5" > true; //5>1
r4 = true >5; 1>5
r5 = true > false; //1>0
console.log(r2,r3,r4,r5);

var r6 = "hello" > 10; //NaN > 10
console.log(r6)

r1 = "2" >"10";
console.log("2".charCodeAt(),"1".charCodeAt(),r1)
  • 区分相等和全等
  1. 相等==
  • 松散比较,包含自动类型转换,只要值相等就成立,返回 true
r1 ="10" == 10;
console.log(r1) //输出true
  1. 全等===
  • 严格比较,不包含数据类型转换,只有类型一致并且值相等结果才成立,返回 true
r2 ="10" === 10;
console.log(r2) //输出false
  • 比较运算符练习,奇偶数练习
  1. 判读是否被2整除
var add = 2021;
var even = add%2 ==0;
console.log(even);
  1. 判断是否被300整除,或被4整除且不能被100整除
var add2 = 20;
var even2 = add2%400 == 0 || add2%4 == 0 && add2%100 != 0;
console.log(even2);

三目运算符

  • 三目运算符有三个表达式参与运算,?前面第一个表达式参与运算,不参与结果执行 三个以上表达式可使用三目运算符嵌套

  • 语法为:表达式1 ? 表达式2 :表达式3 如果表达式1成立,则执行表达式2,不成立则执行表达式3

  • 语法示例:

var a = 18>20 ? "YES" : "NO";
console.log(a);
  • 三目嵌套运算示例:
var num = 95;
good = num >= 90 ? "优秀" : num >= 80 ? "良好" : num >= 60 
? "及格" : "不及格";
console.log(good);

位运算符

  • 直接操作数据的二进制位,除异或运算,其他运算应用较少 将十进制的整除转换二进制后,对二进制数的每一位进行操作

  • 位与运算 &

    • 将俩个数转换为二进制后,逐位进行操作,返回1或0
    • 运算流程示例:
etQvF7TEsbZSYrx.png
etQvF7TEsbZSYrx.png
  • 位或运算 |
    • 将俩个数转换为二进制后,逐位进行操作,运算后转为十进制返回结果
    • 运算流程示例:
3GaSLdjzOwHXAi7.png
3GaSLdjzOwHXAi7.png
  • 异或运算 ^ 将俩个数转换为二进制后,逐位进行操作,运算后转为十进制返回结果
dKb9iPWVhpUJo65.png
dKb9iPWVhpUJo65.png
  • 练习:交换俩个变量的值
var a = 3, b=5;

//传统做法:定义第三个变量,保存某个变量的初始值
var c = a;
a = b; //a = 5, b = 5
b = c;
console.log(a,b);

//不借助第三方变量
a = a ^ b; //3 ^ 5 -> 6
b = a ^ b; //6 ^ 5 -> 3
a = a ^ b; //6 ^ 3 -> 5

网页基本弹框

  • 网页警告框
 alert("提示信息")
  • 带有输入框的弹框,返回输入的内容
    • 返回结构一律是字符串类型
    • 点击确定时,返回弹框中的内容
    • 如果未输入,则返回空字符串,点击取消时,直接返回结果为null
      • 示例:
var r = prompt( );

流程控制

  • 控制代码执行的顺序和次数
  • 三种结构
    • 顺序结构 代码按照书写顺序从上到下依次执行
    • 选择结构/分支结构 根据条件是否成立,选择执行某段代码
    • 循环结构 根据条件是否成立,决定是否重复执行某段代码

选择结构/分支结构

IF语句

  • 单if语句
    • 当条件满足时,执行语句块,然后执行IF语句下面的语句; 否则跳过语句块,直接执行IF语句外面的语句
4CMAS1IljvrLVEg.png
4CMAS1IljvrLVEg.png
  • 语法:
    if("条件"){ 
        console.log("执行此语句");
    }
    console.log('我是IF语句外面的语句');
  • if-else语句
    • 用于处理分支逻辑
    • 当条件满足时,执行语句块1,然后执行if-else外面的语句 条件不满足时,执行语句块2,然后执行if-else外面的语句
jYBeU9s8lkAXGfg.png
jYBeU9s8lkAXGfg.png
  • 语法:
    if ("条件"){  
        console.log("条件为真");
    }else {  
        console.log("条件为假");
    }
    console.log("我是if-else外面的语句");
  • 多重分支语句if-else-if
    • 示例练习:
dZDT9E7KlmQpY8s.jpg
dZDT9E7KlmQpY8s.jpg

switch case语句

  • 用于判断值的全等匹配(===)不会类型转换
  • 和if不一样的是,if是判断条件,switch是接收匹配全等的值
  • default用于设置所有case都匹配失败后的操作,和if语句最后的else一样
  • break是防止穿透,不加break的情况下,如果其中一个case匹配上,还是会继续输出当前case 匹配后的值,所以默认情况下,每个case下加break防止穿透
  • case后写匹配的值,需和接收变量的类型一样
    • 练习示例:
bGcIopSh2i9AqMl.jpg
bGcIopSh2i9AqMl.jpg
  • 多个case共用代码段
frpySMolHeaGd2E.jpg
frpySMolHeaGd2E.jpg

循环结构

  • 如循环结构中有switch语句,那么switch里的break只对switch本身生效,并不影响循环本身

while语句

7z1lFJIPAZcgDmG.jpg
7z1lFJIPAZcgDmG.jpg
  • 循环操作一般需要存在使循环终止的可能性,否则将成为“死循环”
  • break关键字在循环结构中代表终止循环的意思
  • continue关键字是跳过一次循环,继续下一次循环,需要在continue上一行加变量自增(i++)配合使用才能跳过循环
kgyIRhpb1WzKHNw.jpg
kgyIRhpb1WzKHNw.jpg
  • 语法示例:1~100之间偶数的和
var even = 0;
var odd = 2;
while (even<=99){  
    even++;
    if(even%2==0){    
        odd = even+odd;
    }
}
console.log(odd);

do while语句

  • 与while语句相反,先执行后判断
  • 当初始值不满足循环条件时,while循环一次都不会执行,do-while循环不管任何情况都至少执行一次

for语句

FVuNmSsILC2lJG1.jpg
FVuNmSsILC2lJG1.jpg
  • 语法执行逻辑:
ymDlF5AiVXMHJfE.jpg
ymDlF5AiVXMHJfE.jpg
  • 简写模式:
    • for循环中的表达式均可移到外面或添加三个以上,如下:
LEWnmk1K3qXugZ5.jpg
LEWnmk1K3qXugZ5.jpg
  • 多个条件表达式时,后边的表达式起作用 m2qU5zZTe38w1oC.jpg

嵌套循环练习

  • 九九乘法表:
for (var i = 1; i<=9; i++){  //最外层的for循环控制的是遍历的行数

    //内层循环的str+"",等同于放到此处
    for (var j =1,str=""; j<=i;j++){ //内层的for循环控制的是具体的操作
    
        str +=i+"*"+j+"="+i*j+" ";  
        //str = 每次i遍历的值+每次j遍历的值+字符串"="+每次算法后的空格
    }  
    
    console.log(str); //外层遍历一次,输出一次
}

函数

普通函数

  • 函数名可以作为参数传递

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

  • 功能、函数、方法、接收若干个数据,返回处理的结果。

  • 用于封装多次重复执行的代码,实现代码复用

  • 函数使用完整代码解析:

    • 形参可填写一个或多个,函数调用时,实参可填写一个和多个,填写一个时,如果形参为俩个或多个,那其他形参的值为undefined,调用结果为NaN
    • 填写多个实参代码后续整理
    • 形参也可填写一个或多个
//函数声明->保存代码段
function 函数名(形参1,形参2){
        //执行函数体
        console.log(形参1+形参2);
        return 返回值;
    }
    
//函数调用->执行函数体
    函数名字(实参1,实参2);
  • 模块化开发时,变量声明和调用可能会在不同的文件中,此时如果断点调试,只会在当前文件函数调用中调试,如需跳入内部看整体执行调试,则需在浏览器端中点击下图此处:箭头上为跳入内部调试,下为跳出内部调试
Gb3SAmE9WHnzN5o.png
Gb3SAmE9WHnzN5o.png
  • 练习示例:输出等腰三角形
//第一步找到规律
//如总行数为5,第1行空格为4,以此类推,规律:总行数-每行的行数=每一行的空格数
// * 数为奇数排列1、3、5、7、9,2倍数 * 每行的行数-1=每一行的 * 数量
//2*1-1=1,2*2-1=3,以此类推...
//第二步封装一个函数,创建循环
function xx(h){
    //循环行数h
    for (var i = 1;i<=h;i++){
        //str为*,spa为空格
        for (var j =1,str="",spa="";j<=h-i;j++){
            //空格数 = 总行数-每次循环的行数
            spa+=" ";
        }
        for (var x =1;x<=2*i-1;x++){
            // * 数量=2*每一行的行数-1
            str+="*";
        }
        //空格和 * 做拼接赋值给num做输出
        var num = spa+str;
        console.log(num);
    }
}

//第三步调用
xx(5);

return返回值

  • 函数内声明的变量,函数外无法直接访问,只能通过保存接收return返回的值,才能调用
  • switch里如果有retrun返回值,就不必再加break,俩者的作用是一样,都是阻断往后执行
  • if里面也一样,只加retrun也是起到阻断作用
  • 函数调用时,如果里面有retrun,则调用的时return返回的值
  • return用于获取函数调用后的结果,如果函数中没有retrun或者return后不加任何值,返回undefined,retrun一旦执行后,会立即结束函数,不会执行后续函数体内的代码
  • return返回值需要把值保存在变量中,才能方便后续调用
    • 示例:
function get(a,b,c){
    //比较a与b哪个最大,返回哪个
    var max=a>b ? a : b;
    //return返回max和c比较时最大的值
    return max>c ? max : c;
}

//调用函数填写实参并保存在res函数中
var res = get(5,3,6);

//输出res的值
console.log(res);

作用域

  • 作用域链:访问变量时,会经历从当前作用域到上一级作用域逐级查找的过程(就近原则)

  • 意思是变量和函数的可访问范围

  • 在函数中,不加var关键字声明的变量为全局变量,但是不推荐,严格模式不兼容,会报错

  • 全局作用域(变量)

    • 函数外部使用var关键字声明的变量为全局变量,任何位置都可以访问
  • 函数(局部)作用域(变量)

    • 函数内部使用var关键字声明的变量为局部变量,只能在当前函数内访问
  • 函数的作用域

    • 函数的可访问范围,同样也分为全局函数和局部函数,全局函数可以在任何未知访问 局部函数只能在所在作用域下访问
    • 示例:
function fn(){  
    console.log(1);
}
function foo(){  
fn();  
    //函数作用域  
    //fun是局部函数  
    function fun(){    
        console.log(2);    
    }  
    fun();
}
foo();

变量提升

  • 在ES5中,如果变量在代码后声明,代码执行不会报错,而是会输出undefind,因为ES5执行过程中,会把变量提升至执行代码前,但不赋值,然后在执行代码后赋值
  • 在ES6中不存在该问题
  • 使用function 关键字创建的函数也会和变量一样提升到所在作用域的最前边
    • 示例:
//原代码
console.log(a);
var a =1;

//ES5执行时的代码
var a;
console.log(a);
a=1;

匿名函数

  • 匿名函数不能直接在代码中写,会报错,必须用函数表达式或回调函数等方式使用

函数表达式

  • 就是省去函数名的函数,没有名称的函数,用变量接收函数的声明
    • 语法示例:
//函数声明方式
function fn(){
    //执行代码块
}
fn();

//匿名函数 - 创建变量接收匿名函数(也叫函数表达式),函数表达式不存在函数提升
//变量名存储的就是函数代码段,作用等价于函数名,同样可以使用 "变量()"调用函数
var a = function(){
    //执行代码块
}
a();

匿名函数自调用

  • 构建一个局部作用域,避免全局污染,也可以避免函数需要手动调用
    • 语法:
      • 第一个()中是具体匿名函数,第二个()中表示函数调用,传递实参
//定义匿名函数开始  (function(){
    console.log(a+b);
}) //定义匿名函数结束  (10.20); //函数自调用,传递实参

回调函数

  • 匿名函数作为实参传递,先传递匿名函数赋值给函数名,然后回来调用具体匿名函数里的代码块
    • 语法示例:
//计算俩数相加的和
function add(a,b){  
    var c = a()+b();  //实参a和实参b相加的和赋值给c  
    console.log(c);   //输出c
}
//回调
add(function (){  //赋值给形参a     
        return 2;  
    },  
    function (){  //赋值给形参b   
        return 4;  
});

全局系统内置函数

  • Number()

    • 对象值转数字
  • String()

    • 对象值转字符串
  • parseInt()

    • 字符串转整数
  • parseFloat()

    • 字符串转浮点数
  • encodeURI()

    • 字符串编码为URL,针对非英文
    • 语法:
var url = "https://search.bilibili.com/all?keyword=OBS直播间界面设置"
var str = encodeURI(url);
console.log(str)
  • decodeURI()
    • 解码某个编码的URL,针对非英文
      • 语法:
//已编码的字符串
var url = "https://search.bilibili.com/all?keyword=OBS直播间界面设置"
var str = encodeURI(url);
console.log(str)

//解码字符串
console.log( decodeURI(str) );
  • isNaN()
    • 检测是否是NaN,返回布尔值,是就返回true,不是就返回false isFinite()
    • 检测是否是有限的值或无穷大的值,返回布尔值,如果是Infinity,返回false,相反则返回true eval()
    • 执行字符串中的表达式,如果字符串中的表达式存在错误,则会报错
      • 语法:
console.log ( eval ( "parseInt ( 3.145 )" ) );

还有其它表达式后期补充,.......等

递归算法(简单理解,面试笔试多用)

function fn(){  
    console.log(1);
    fn();//函数自身调用自身
}
  • 递归执行流程:
Eg694jvwJQ7VkKZ.png
Eg694jvwJQ7VkKZ.png

对象(object)

  • 属于引用类型的数据
  • 对象是一组属性(property)和方法(method)的集合

对象分类

  1. 内置对象(ES对象):JS提供的对象
  2. 宿主对象:根据不同的执行环境划分,node.js等等...
  3. 自定义对象:用户自己创建的对象

创建对象

对象字面量创建对象

  • 使用 { } 花括号创建空对象,属性名和值之间冒号隔开,多组属性之间用逗号隔开,属性名中的引号可加可不加,如果含有特殊字符必须加
    • 语法:
mQoKui7dRjqLpse.jpg
mQoKui7dRjqLpse.jpg

内置构造函数创建对象

  • 使用new关键字创建一个空对象,然后添加属性,如果是没有属性的空对象,( )可以省略
    • 示例:
//使用new Object( )创建空对象
var obj1 = new Object( );

//若对象没有属性,是空对象,可以省略( )
var obj1 = new Object;

//给新创建的空对象添加属性
obj1.name = "John";

自定义构造函数创建对象

  • 后期第三阶段讲到

访问对象属性

  • 通过 . 连接属性名访问或新建对象中的属性,或者[ "" ]也可以,,如果属性名没有创建不存在,则不会报错,返回undefined
    • 示例:
//通过 . 连接
obje1.name="tom"  //修改或添加属性
console.log(obje1.name)  //访问

//通过 [""] 连接,属性必须要加 " " 包起来
obje1["sex"] = "女" //修改或添加属性
console.log(obje1["sex"])  //访问

//访问不存在的属性,返回undefined
console.log(obje1.id) //undefined

//如果属性名中存在关键字、非法字符、空格之类,就只能使用 [ " " ]访问或修改
obje1["book name"] = "深入分析Java";
obje1["for"] = "Evething"

遍历对象属性

  • 使用for in遍历对象属性,原理是在遍历条件中创建一个新的变量保存每一个属性的值,然后通过 "对象名[新的变量名] " 访问对象属性的值
    • 示例
//创建对象
var obj1 = new Object( );
//添加属性和值
obj1["name"] = "tom";
obj1.sex = "女";

//遍历对象属性,不包含值
//key代表创建的新变量,in代表的是从哪个对象开始遍历,in后面则是对象
//把对象每一个属性值保存至"key"变量中
for ( var key in obj1 ) {
    //如果只输出"key"变量,返回的则是属性name 和 sex,但不包含值
    console.log( key );
    //需要输出属性的值,则需要通过 "对象名[保存的变量]"来使用
    console.log( obj1[key] )
    //俩者结合则可以输出属性和值
    console.log( key+":"+obj1[key] )
}

检测对象属性是否存在

  • 第一种通过判断是否为undefined来检测属性是否存在 方法:"对象名.属性名 === undefined"
  • 第二种通过 "对象名.hasOwnProperty("属性名")" 方法检测
  • 第三种通过 in 关键字检测
  • 都是返回布尔值
    • 语法:
//如果属性为undefined,也就是属性不存在,返回true,反之则false
console.log(obj1.id === undefined);

//如果属性存在返回true,反之则false
console.log(obj1.hasOwnProperty("id"));

//如果属性存在返回true,反之则false
console.log("name" in obj1);

对象的方法

  • 对象的方法指的是绑定在对象内部的函数,只能由对象调用,就称为对象的方法
  • 调用方法:对象名.绑定函数的属性(实参)
    • 语法示例:
var obj2 = {  
    name:"tom",
    play:function (a,b){   //绑定函数的属性
        console.log(a+b); 
    }
}
obj2.play(1,2);  //对象调用绑定函数的属性,并填入实参

this关键字

  • this常用于方法或函数的内部,指代当前的调用者,当前的对象...
  • 第三阶段讲DOM操作细说

数组(Array)

  • 保存批量数据的数据结构,每个数据称为元素,存储的类型不限,变量、函数、对象、数组等等
  • 是一种有序可变的存储结构,有序是数组中的元素自动分配下标,从0开始。可变是元素、长度可变

创建数组

字面量创建数组

  • 使用 [ ]创建空数组,每个元素用逗号隔开
    • 语法:
var a = [ ];

内置构造函数创建数组

  • 使用“ new Array”创建一个空数组,然后访问或修改添加元素,如果创建数组中里面只有一个数字,则代表初始化数组场长度
    • 语法:
var b = new Array( );

访问数组元素

  • 数组中是通过下标(索引)访问或添加修改元素,下标(索引)是从0开始,也就是每一个元素对应的下标是长度减一
    • 语法:
//正常情况下的排序是1-tom,2-jerry,3-john,4-sam
//下标则是每个元素的长度减一,也就是0-tom,1-jerry,2-john,3-sam
var a = ["tom","jerry","john","sam"];
  • 通过“数组名[下标] ”来访问或添加修改元素
    • 语法:
//创建数组
var a = ["tom","jerry","john","sam"];

//访问、修改、添加元素
console.log( a[0] )  //访问第一个下标为0的元素
a[1]="locy" //修改第二个下标为1的元素
a[4]="news"  //添加第五个元素,下标为4
  • 可以随机根据不同下标添加元素,中间隔着的下标元素则为空内容
    • 例如:
//现在只有四个元素,下标为0~3
var a = ["tom","jerry","john","sam"];

a[6]="test";  //之前下标为4、5的元素内容则为空内容

数组的长度

  • 通过 "数组名.length" 方法可以获取数组的长度
  • 通过“ 数组名 [ 数组名.length ] ”可以在数组末尾(最后一位)追加元素,而不用指定下标添加元素
    • 语法:
//创建数组
var a = ["tom","jerry","john","sam"];

//获取数组长度
console.log( a.length ); 

//数组最后一位追加元素
a[a.length]="tom";

数组分类

索引数组

  • 以0以上的整数排序做下标,分为一维数组、二维数组
  • 一维数组的元素时不同类型的数据,二维数组的元素是多个一维数组
  • 一维数组的length指的是,数组的元素个数
  • 二维数组的length指的是数组内一维数组的个数

关联数组

  • 以字符串做下标,只能单独添加每一项元素,只能通过添加元素的方式实现字符串做下标

遍历数组

  • 通过for in遍历数组,和遍历对象一样
var arr1 = [    'tom','jerry','john']
for (var arrkey in arr1) {  
    console.log(arrkey+":"+arr1[arrkey]);
}
  • 对象和数组可以互相嵌套,也可以使用for in遍历
  • 如需遍历对象中的数组或数组中的对象,则可以直接在for in条件中写入需要遍历的对象或数组
    • 示例:
//创建对象或数组
var obj={
    name:'tom',
    sex:'男',
    friends:["jerry","john","jack"]
}

//在obj对象中的friends数组中添加元素
obj.friends[obj.friends.length] = "locy"

//遍历数组或对象内的指定数组或对象
for ( var objkey in obj.friends ){
    console.log ( obj.friends [ objkey ] )
}
  • 遍历数组中,做数组比较运算时,需定义变量存储最终返回的值,赋值也必须是该数组中存在的值
//求最大值
var array = [22,45,34,56,75];

//定义变量存储最大值,参与比较运算是一定要有初始值,初始值必须是数组中存在的值
//如果不给初始值,则是undefined参与比较运算,条件不会成立,没有初始值可以使用函数方法遍历
var max = array[0];

for(var k in array){
    if(array[k]>max){
        max+=array[k]
    }
}
console.log(max)

数组API

  • API:JS ( 其他多数编程语言,这里特指JS ) 中预定义好的一些函数和方法

  • toString()

    • 将数组元素转为字符串,默认按照逗号分隔,
    • 方法为:数组名.toString();
    • 语法:
//创建一个数组
var arr = [1,2,3,4,5]

//声明一个变量接收拼接转换后的元素
var arrSting = arr.toString();  //使用方法

console.log(arr,typeof arr);
  • join()
    • 将元数组元素按照指定的字符拼接起来转换为字符串,如果不加任何字符拼接,只需要 "" 即可
    • 方法为:数组名.join("")
    • 语法:
//创建一个数组
var arr = [1,2,3,4,5]

//声明一个变量接收拼接转换后的元素
var arrSting = arr.join("");  //使用方法

console.log(arr,typeof arr);
  • concat()
    • 拼接多个数组为一个数组
    • 方法为:数组名1.concat(数组名2,数组名3,...), ( )内也可只写一个
    • 语法:
//创建数组
var arr = [1,2,3,4,5]
var arr2 = [1,2,3,4,5]
var arr3 = [1,2,3,4,5]

//声明一个变量接收拼接后的元素
var arrSting = arr.concat(arr2,arr3);  //使用方法

console.log(arr,typeof arr);
  • slice()
    • 截取数组指定范围内的元素,start这里代指开始下标,end代指结束的下标,截取范围不包括end结束的下标,如果是负数表示倒数,如果end为空,则表示截取到最后
    • 数组索引,只能在API中使用负数索引
    • 方法为:数组名.slice(strat,end)
    • 语法:
//创建一个数组
var arr = [1,2,3,4,5]

//声明一个变量接收截取后的数组
var array = arr.slice(1,3);  //使用方法,1,3表示数组元素开始和结束下标

console.log(array,typeof array);
  • reverse()
    • 翻转数组中的元素,也就是根据数组索引颠倒数组中元素的排序
    • 方法为:数组名.reverse()
    • 语法:
//创建一个数组
var arr = [1,2,3,4,5]

//声明一个变量接收翻转后的数组元素
var array = arr.reverse();  //使用方法

console.log(array,typeof array);
  • sort()
    • 对数组中的元素进行排序,可以是字符串,默认()内没有任何值是按照Unicode码进行从小到大排序
    • 如果对数字进行排序,则可以在()内定义回调函数,sort()方法会自动传递实参进行排序
    • 方法为:数组名.sort()
  • 默认语法:
var str = ["一","das","哈哈"]  //可以是字符串,数字等
console.log(str.sort());  //默认Unicode码排序
  • 数字排序语法:
var num = [4,23,12,1,7,56];  //定义一个元素为数字的数组

//正序排列
num.sort(function (a,b){
    retrun a-b;  //如果a(实参)-b(实参) >0,则是正序
})

//倒序排列
num.sort(function (a,b){
    retrun b-a;  //如果b(实参)-a(实参) <0,则是倒序
})
  • splice()
    • 删除数组指定范围内的元素,删除的同时也可新增元素,新增的元素会插入在删除的元素位置上,索引位置可以给负数,表示倒数
    • 方法为:数组名.splice(start,count,val1,va2...)
    • start代指开始的元素索引位置,count代指删除几个元素,val代指新增插入的新元素
    • 如果只填入一个数值,则表示从指定的元素索引位置,一直删除到最后
    • 如果输入俩个数值,则表示从指定的元素索引位置,删除指定数量的元素
    • 如果输入俩个以上数值,则从第三个数值开始就表示插入的新元素
    • 如果从指定的元素索引位置,删除到最后并新增元素,count则可以用“数组名.length”表示
    • 语法:
//定义一个数组
var arr = [4,23,12,1,7,56]

//一个数值
arr.splice(1,3)  //从索引“1”开始,删除“3”个元素

//俩个数值
arr.splice(3)  //从索引“3”开始,删除到最后

//俩个以上数值
arr.splice(1,3,45,123) //从索引“1”开始,删除“3”个元素,并在删除的位置上新增“45”、“123”俩个元素

//指定位置开始,删除到最后并新增
arr.splice(1,arr.length,34,56,76)  //从索引“1”开始,删除到数组最后的元素,并在删除的位置上新增“35”、“56”、“76”三个元素
  • push()
    • 数组末尾增加一个或多个元素
    • 方法为:数组名.push()
    • 语法:
//定义一个数组
var arr = [4,23,12,1,7,56]

//数组末尾增加元素
arr.push(32,56,17)
  • pop()
    • 数组末尾删除最后一个元素,只能删除最后一个
    • 方法为:数组名.pop()
    • 语法:
//定义一个数组
var arr = [4,23,12,1,7,56]

//数组末尾删除元素
arr.pop()
  • unshift()
    • 数组头部增加一个或多个元素
    • 方法为:数组名.unshift()
    • 语法:
//定义一个数组
var arr = [4,23,12,1,7,56]

//数组头部增加元素
arr.unshift(32,56,17)
  • shift()
    • 数组头部删除第一个元素,只能删除第一个
    • 方法为:数组名.shift()
    • 语法:
//定义一个数组
var arr = [4,23,12,1,7,56]

//数组头部删除元素
arr.shift()

字符串

特点

  • 字符串可以有0个或多个字符组成,会给每一位字符分配下标,是一种有序不可变的存储结构,用“”包含字符表示
  • 可以和数组一样,使用[ ]访问指定索引下的字符,但是不能对字符串进行,增加、删除、修改操作,不会报错,但是操作无效
  • 和其他类型一样,可以由字面量创建,也可以使用构造函数“new String”创建
  • 字面量必须要加“”号,构造函数方式如果遇到纯数字,则不用加“”号,其它字符则需要
    • 语法:
//字面量方式
var a = "hello";

//构造函数方式
var str = new String("hello")

//访问指定索引下的字符
console.log(str2[3])

转义字符

  • \ 表示可以把编程中一些特殊含义的字符进行转义输出,在前面添加 " \"\" "
  • \n 是换行符,对字符串的某个位置进行换行 "字符\n串"
  • \t 是制表符,也就是tab键,对字符串头部位置进行tab缩进 "\t字符串"
  • ......等

字符串API

  • charAt()
    • 获取指定下标的字符,省略下标表示获取第一个
    • 方法:字符串名.charAt(下标)
    • 语法:
//创建字符串
var str = "hello"

//获取指定下标的字符
console.log(str.charAt(3))
  • charCodeAt()
    • 获取指定下标的字符对应的Unicode编码,省略下标表示获取第一个
    • 方法:字符串名.charCodeAt(下标)
    • 语法:
//创建字符串
var str = "hello"

//获取指定下标的字符对应的Unicode编码
console.log(str.charCodeAt(3))
  • toUpperCase()
    • 把字符串中的小写转换为大写,但对原字符串不变,不能指定下标转换,转换的是字符串全部的小写字符
    • 方法:字符串名.toUpperCase()
    • 语法:
//创建字符串
var str = "hello"

//转换小写字母为大写
console.log(str.toUpperCase())
  • toLowerCase()
    • 把字符串中的大写转换为小写,但对原字符串不变,不能指定下标转换,转换的是字符串全部的大写字符
    • 方法:字符串名.toLowerCase()
    • 语法:
//创建字符串
var str = "hello"

//转换小写字母为小写
console.log(str.toLowerCase())
  • indexOf()
    • 查找字符对应的下标位置,str代指需要查找下标的字符,start代从指定下标位置开始查找,可以只写一个,代表查找的字符,默认从第一个开始,如果字符写入俩个,则只会查找第一个字符对应的下标,如果找不到,则会返回-1
    • 方法:字符串名.indexOf(str,start)
    • 语法:
//创建字符串
var str = "hello"

//从下标0开始查找字符 "el",找到"e"对应的下标就结束,不会找"l"
console.log(str.indexOf("el"))
  • lastIndexOf()
    • 查找字符最后一次出现的下标位置,str代指需要查找下标的字符,如果字符写入俩个,则只会查找第一个字符,如果找不到,则会返回-1
    • 方法:字符串名.lastIndexOf(str)
    • 语法:
//创建字符串
var str = "hello"

//找到"e"对应的最后一次出现的下标位置就结束,不会找"l"
console.log(str.lastIndexOf("el"))
  • slice()
    • 截取字符串中的字符,根据索引截取字符串中指定范围内的字符
    • start这里代指开始下标,end代指结束的下标,截取范围不包括end结束的下标,如果下标是负数表示倒数,如果end为空,则表示截取到最后,只能在API中使用负数索引,如果start索引大于end索引,则无法截取
    • 方法:字符串名.slice(start,end)
    • 语法:
//创建字符串
var str = "hello"

//截取开始索引  '1'  开始到结束索引  '3'  包含的字符,但不包含结束索引
console.log(str.slice(1,3));
  • substr()
    • 截取字符串中的字符,根据长度截取字符串中指定范围内的字符
    • start这里代指开始下标,count代指截取的长度,如果下标是负数表示倒数,如果count为空,则表示截取到最后,只能在API中使用负数索引
    • 方法:字符串名.substr(start,count)
    • 语法:
//创建字符串
var str = "hello"

//从索引‘1’开始截取3个字符
console.log(str.substr(1,3))
  • substring()
    • 截取字符串中的字符,根据索引截取字符串中指定范围内的字符
    • start这里代指开始下标,end代指结束的下标,截取范围不包括end结束的下标,如果end为空,则表示截取到最后,如果start索引大于end索引,俩者位置则会自动交换,无法使用负数,会自动转为0(空字符串),无法截取
    • 方法:字符串名.substring(start,end)
    • 语法:
//创建字符串
var str = "hello"

//自动调换开始与结束索引位置,然后截取第二位到第三位的字符,不包含结束索引
console.log(str.substring(4,2))
  • split()
    • 将字符串按照指定的字符切割为数组,此处sep代指指定的字符,必须是字符串中存在的字符,如果字符存在开头或结尾,数组中会存储空字符串,如果分割的字符不存在,则会把整个字符串转换为一整个数组元素
    • 方法:字符串名.split(sep)
    • 语法:
//创建字符串
var str = "123455@qq.com"

//将字符串根据字符串中的"@"切割转换为数组
console.log(str.split("@")) //输出数组元素为123455和qq.com俩个元素,不包含@字符

支持匹配模式的字符串API

  • 用于查找、替换字符串,一般配合正则进行模式匹配

  • 正则语法规则是在 /规则语法/ ig 填入,后面的ig代表,不区分大小写进行全局查找,i代表不区分大小写,g代表全局查找,俩个都可以单独写

  • search()

    • 查找字符串中满足条件中的第一个字符,并返回所在的下标,找不到返回-1
    • 方法:字符串名.search(/查找的字符/i)
    • 语法:
//创建字符串
var str = "heEllo"

//查找符合 "e" 的字符,不区分大小写,并返回所在下标
console.log(str.search(/e/i))
  • match()
    • 查找字符串中满足条件中的所有字符,转换成数组并返回,找不到返回null
    • 方法:字符串名.match(/查找的字符/ig)
    • 语法:
//创建字符串
var str = "china+China+CHINA+chinA"

//查找符合 "china" 的字符,全局查找,不区分大小写,转换成数组并返回
console.log(str.match(/china/ig))
  • replace()
    • 查找字符串中满足条件中的所有字符,替换成指定字符后转换成数组并返回
    • 方法:字符串名.replace(/查找的字符/ig,"替换的字符")
    • 语法:
//创建字符串
var str = "china+China+CHINA+chinA"

//查找符合 "china" 的字符,全局查找,不区分大小写,替换成“中国”后转换成数组并返回
console.log(str.replace(/china/ig,"中国"))

Math对象API

  • Math对象不需要创建,可以直接使用

圆周率

  • Math.PI可以直接输出圆周率 console.log(Math.PI)

取整

  • Math.ceil
    • 向上取整,表示不管小数位是多少,整数位都+1
console.log(Math.ceil(3.23123));
//输出为4
  • Math.floor
    • 向下取整,表示舍弃小数位,只保留整数位
console.log(Math.ceil(3.23123));
//输出为3
  • Math.round
    • 四舍五入取整,逢小数点第一位是5便+1
console.log(Math.round(3.23123));
//输出为3

取大小值

  • 取一组数字的最大最小值

  • Math.max(n1,n2,n3,...)

    • 取最大值
console.log(Math.max(1, 3, 4, 545, 43, 23));
  • Math.min(n1,n2,n3,...)
    • 取最小值
console.log(Math.max(1, 3, 4, 545, 43, 23));

取绝对值

  • 返回绝对值,X必须是数值或者数学运算
console.log(Math.abs(1));  //1
console.log(Math.abs(-1));  //1
console.log(Math.abs(6 / 2));  //3
console.log(Math.abs(null));  //0
console.log(Math.abs("hello"));  //NaN

Math.random()

  • 取随机数,不需要使用new来创建,可以直接使用
  • 随机生成小数
    • Math.random默认就是生成0~1之间的小数
console.log(Math.random());
  • 随机生成整数
    • 使用Math.random方法配合Math.floor随机生成整数
    • Math.random*字符或数组名.length,可以根据当前字符或数组的长度随机生成随机整数
    • 语法示例:
//定义一个字符串
var str = "hello"

//根据str的字符长度生成随机数,并用Math.floor取整
console.log(Math.floor(Math.random() * str.length));
  • 随机验证码练习
//生成验证码函数
function create(n) {  //create(验证码长度)形参
    //验证码数据源  
    var str = "asdasdfsdfjdlgjdfigjkf12345n345647566";  
    
    //循环次数  
    for (var i = 0,code = "";i<n;i++){
    //根据str长度随机获取索引,再通过Math.floor转换为整数
    var num = Math.floor(Math.random() * str.length);  
    
    //把每次随机索引所对应的字符取出赋值给code
    code+=str[num];
    
    }
    //返回给外界使用  
    return code; 
}

//获取验证么并验证
function ver(){  
    //获取固定长度的随机生成的验证码
    var codenum = create(4);  //4为create(验证码长度)实参
    
    //提示用户输入并验证 
    var res = prompt("输入验证码:"+codenum);
    
    //判读输入是否非空,非空则进入内层判断
    if (res) {
        //把随机生成的验证码和输入的验证码全等比较判断    
        if(res.toUpperCase()==code.toUpperCase()){//值全等后,提示正确       
             alert("Yes")
        } else {
            //值不全等后,提示错误
            alert("No")
            //重新执行函数再次输入验证码
            ver();
        }
    }else {
       //输入为空值后提示错误
       alert("未输入")
       //并重新执行函数再次输入验证码
       ver();
    }
}

//调用函数
ver();

Math.pow(次方)

  • 次方计算,计算X的Y次幂
  • 语法:Math.pow(x,y)
console.log(Math.pow(5, 4));

Data对象

  • 只能使用构造函数创建Date对象

Date创建方法

  • 获取系统日期时间
    • 直接使用构造函数关键字Date创建,并不加任何值,代表获取当前系统日期及时间
f7x1YIztyLujaT8.png
f7x1YIztyLujaT8.png
  • 从左到右依次为星期、月份、日期、年份、时、分、秒、时区
var date1 = new Date();
console.log(date1);
  • 传递参数,指定创建日期对象
  • 指定日期字符串创建对象,年月日必填,时分秒选填
var date2 = new Date("2022-2-21");
var date3 = new Date("2022-2-21 21:00:32")
console.log(date2);
console.log(date3);
  • 分别传入年月日时分秒
    • 从左到右分别取值为年、月、日、时、分、秒
    • 月份取值范围是011对应现实中的112
var date4 = new Date(2021,3,29,22,35,48)
console.log(date4);
  • 使用时间戳创建日期对象
    • 时间戳是指距离计算机元年的毫秒数
    • 计算机元年为:1970-1-1 00:00:00,中国时区为8:00:00
var  date5 = new Date(1000);
console.log(date5)

Date对象的API

  • 获取年月日
  1. 获取年份
console.log(date2.getFullYear());
  1. 获取月份,实际使用中需要手动+1再显示
console.log(date2.getMonth());
  1. 获取日
console.log(date2.getDate());
  • 获取时分秒、毫秒
  1. 获取时
console.log(date2.getHours());
  1. 获取分
console.log(date2.getMinutes());
  1. 获取秒
console.log(date2.getSeconds());
  1. 获取毫秒
console.log(date2.getMilliseconds());
  • 获取星期
    • 获取星期的范围是0~6,0代表星期日
    • 西方国家以每周的星期日为每个星期的第一天
console.log(date2.getDay());
  • 获取时间戳
console.log(date2.getTime());
  • 转换本地字符串格式
  1. 转换年月日时分秒
console.log(date2.toLocaleString());
  1. 单独转换年月日
console.log(date2.toLocaleDateString());
  1. 单独转换时分秒
console.log(date2.toLocaleTimeString());
  • 设置日期对象的年月日时分秒
    • 设置中,如果值超出设置范围,系统会自动推算
    • 月份范围0~11
    • 日期范围按现实中的日期范围设置
    • 时范围0~23,设置24时会自动归0
    • 分、秒范围是0~59,设置60自动进1
  1. 设置年,也可同时设置月份和日期
console.log(date2.setFullYear(2022));
console.log(date2.setFullYear(2022,3,21));
  1. 设置月
    • 取值范围是011对应现实中的112
date2.setMonth(5)
console.log(date2);
  1. 设置日
date2.setDate(31)
console.log(date2);
  1. 设置时
date2.setHours(21)
console.log(date2);
  1. 设置分
date2.setMinutes(47)
console.log(date2);
  1. 设置秒
date2.setSeconds(58)
console.log(date2);
  1. 设置毫秒
date2.setMilliseconds(3)
console.log(date2);
  1. 使用时间戳修改日期对象
date2.setTime(3000)
console.log(date2);

Number对象

  • 数值类型也可使用构造函数关键字创建
  • 加new关键字创建的数值,会自动转为数值,类型为对象类型
  • 不加new关键字创建的对象,会自动转为数值,类型式数值类型
var n1 = new Number(true);
console.log(n1,typeof n1) //数字1  object类型

var n2 = Number(true)
console.log(n2,typeof n2) //数字1  number类型
  • 如创建数值类型时,填入布尔值或纯数字的字符串,会自动隐式转换
var num = Number(true);
var num2 = Number("1");
console.log(num+num2);

数值API

  • toString()
    • 数字转换字符串,转换进制
    • 可转换为字符串,也可单独转换为指定进制数
    • base代指进制,如base值不填写,则默认转换为字符串
    • 语法:数值名.toString(base)
var num3 = 12;
console.log(num3.toString());  //转换字符串
console.log(num3.toString(2));  //转换进制
  • toFixed()
    • 保留小数点后面的位数
    • 可保留小数点后面具体多少位,一般常用2位
    • n代指位数
    • 语法:数值名.toFixed(n)
var num3 = 12.323213;
console.log(num3.toFixed(2));
  • 更多API

Boolean对象

  • 也可使用构造函数创建
  • 空对象和空数组也会自动转换为true
  • 构造函数无法将部分非布尔类型隐式转换,可使用 !! 将非布尔类型转换为布尔类型,如:!!undefined,!!null,!!NaN
  • 加new关键字创建的,会自动转为布尔值,返回是对象类型
  • 不加new关键字创建的,会自动转为布尔值,返回时布尔类型
var bo1 = new Boolean(3);
console.log(bo1,typeof bo1); //转为true,为object类型

var bo2 =Boolean(5);
console.log(bo2,typeof bo2);  //转为true,为boolean类型

var bo3 = Boolean({})  //空对象
console.log(bo3,typeof bo3);  //转为true,为boolean类型

var bo4 = Boolean([])  //空数组
console.log(bo4,typeof bo4);  //转为true,为boolean类型

布尔API

  • toString()
    • 布尔转字符串
var b6 = Boolean(true)
var str  = b6.String();
console.log(str,typeof str)
  • 更多......
上次编辑于:
贡献者: mygit