JavaScript基础

JS语法规范

  • 区分大小写
  • 每行代码结束的分号可以省略
  • 分为多行注释(//)和多行注释(/**/)

变量

变量的声明和赋值

va r a = 1;//声明赋值

或者

let b = 1;

等同于

var a;//声明变量      
a = 1;//变量赋值

let b;
b = 1;

var变量可以提升

console.log(a); //undefined
var a = 1;

let变量不可以提升

console.log(b);//报错
let  b = 1;

常量

声明必须赋值,不允许重新赋值
const  a =  3;
a = 4;//报错

数据类型

分为原始类型和引用类型

原始类型分为

检测数据类型: typeof

  • 数值型(number)

就是数字,分为整型和浮点型,就是整数和小数

var  a = 10;
var  b = 10.10
  • 字符串型(string)

被引号包含的数据,不区分大小写

var b = 'hello'
  • 布尔型(boolean)

分为true和false, true是1,false是0

  • 未定义型(undefined)

变量声明了没有赋值,其值就是undefined

var a;
console.log(a);//undefined
  • 空(null)

值是null,类型是object

var a = null;
console.log(a, typeof a);//object

引用类型

Object 、 Array 、 Date、 Function

数据类型转换

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

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

  • 数字+字符串

    数字转换为字符串

var  a = 1;
var  b = '2';
console.log(a+b);//'12'
  • 数字+布尔型

    布尔型转换为数字

var  a = 1;
var  b = true;
console.log(a+b);//2
  • 布尔型+字符串

    布尔型转字符串

var  a = true;
var  b =  'hello'
console.log(a+b);//'truehello'
加号(+)的作用

执行数字之间的加法作用

执行字符串之间的拼接

其余运算符

纯数值字符串转换为数值,其他字符串转为NaN

NaN: Not a Number

在一个数据转换为数值型的时候,没有成功得到一个数字就返回NaN

强制类型转换(手动转换)

  • 其他类型转为数值型
    Number()
var  a1 = Number('1'); //1
var  a2 = Number('1a'); //NaN
var  a3 = Number(true); //1
var  a4 = Number(false); //0
var  a5 = Number(undefined); //NaN
var  a6 = Number(null);//0
console.log(a1,a2,a3,a4,a5,a6)

其他类型转为整型

parseInt()
var  a1 = parseInt('3.14');//3
var  a2 = parseInt('2.18a');//2
var  a3 = parseInt('a6.18');//NaN
var  a4 = parseInt(true);//NaN
var  a5 = parseInt(false);//NaN
var  a6 = parseInt(undefined);//NaN
var  a7 = parseInt(null);//NaN
console.log(a1,a2,a3,a4,a5,a6,a7)

其他类型转为浮点型,就是转为小数

parseFloat()
var  a1 = parseFloat('3.12');//3.12
var  a2 = parseFloat('4.13a');//4.13
var  a3 = parseFloat('a1.13');//NaN
var  a4 = parseFloat(true);//NaN
var  a5 = parseFloat(false);//NaN
var  a6 = parseFloat(undefined);//NaN
var  a7 = parseFolat(null);//NaN
console.log(a1,a2,a3,a4,a5,a6,a7)
  • 其他型转为布尔型( Boolean() )
var  a1 = Boolean('');//false
var  a2 = Boolean('0');//true
var  a3 = Boolean(0);//false
var  a4 = Boolean(1);//true
var  a5 = Boolean(undefined);//false
var  a6 = Boolean(null);//false
console.log(a1,a2,a3,a4,a5,a6,a7) 
  • 其他类型转字符串( String() )
var e1 = String(123.4);//123.4
var e2 = String(true);//true
var e3 = String(false);//false
var e4 = String(undefined);//undefined
var e5 = String(null);//null
console.log(e1,e2,e3,e4,e5);

运算符

算数运算符

+、-、*、/、%、++、--

++自增

在原来基础上加1

前++
var  a = 1;
//++a是表达式,a是变量,++a不等于a
//赋值给b的是++a的值,不是a的值
//1.++在a的前面,先做自增a = a + 1,此时a = 2
//2.把a的值作为表达式a++的值,a++表达式的值等于2
//3.最后把a++表达式的值赋值给b
var  b = ++a;
console.log(a,b);//2,2
后++
var  a = 1;
//a++是表达式,a是变量,a++不等于a
//赋值给b的是a++的值,不是a的值
//1.++在a的后面,把a的值作为表达式a++的值,此时a =1, a++表达式的值等于1
//2.在做自增a = a +1,此时a = 2
//3.最后a++表达式的值赋值给b, b = 1
var  b = a++;
console.log(a,b)//2,1

--自减

在原来的基础上减1, 其他执行流程跟++自增一样

比较运算符

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

==:比较两者的值是否相同,会发生隐式转换

===:比较两者的类型和值,都相同true,否则false

console.log('1' == 1); //true
console.log('1' === 1); //false

逻辑运算符

&& || !

&&: 逻辑与,如果第一个条件为false,就不用执行第二个

||:逻辑或,如果第一个条件为true,就不用执行第二个

!:非,取反向

console.log(false && true); //false
console.log(true || false); //true

赋值运算符

=、+=、-=、/=、%=、*=

三目运算符

一目运算符:一个运算符连接一个操作数据++ -- !

二目运算符:一个运算符连接两个操作数据+ - / * = ...

三目运算符: 两个运算符连接三个操作数据 ? :

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

如果条件表达式正确,执行表达式1

如果条件表达式错误,执行表达式2

console.log(1 < 2 ? true : false); // true
console.log(3 > 5 ? true : false); // false

流程控制

if-else

if(条件表达式) {

语句块1

}else {

语句块2

}

如果条件表达式为true, 就执行语句块1,否则就执行语句块2

if(1 > 0){
	console.log('true');

}else{
	console.log('false');
}

或者
if(1 > 3) {
	console.log(3);
}else  if (1 > 2) {
	console.log(2);
}else  if (1>0){
	console.log(1)
}

switch-case

switch(表达式){//表达式通常是一个变量

​ case 值1:

​ 语句;

​ break;//结束switch语句,不在往后执行

​ case 值2:

​ 语句;

​ break;//结束switch语句,不在往后执行

​ .....

​ default:

​ 语句n;//如果表达式和case中的每个值比较为false

}

表达式和case的值做比较,使用的是全等于,要求值和类型相等

switch(100){
	case 100: 
		console.log(100);
		break;
	case 90:
		console.log(90);
		break;
	case 80:
		console.log(80);
		break;
	default:
		console.log(60);
}

循环

while循环

while(条件表达式){

​ 循环体

}

var i = 0;
while(i < 10){
	//循环体
	console.log(i)
	//增量
	i++
}

do-while循环

do{

​ 循环体

}while(条件表达式)

var i = 0;
do{
	//循环体
	console.log(i)
	//增量
	i++
}while(i < 10)

for循环

for(初始值;条件表达式;增量){

​ 循环体

}

先执行初始值-->条件表达式 -->循环体-->增量

for(var i = 0; i<= 10; i++) {
	console.log(i);
}

break和continue

continue: 跳过后续循环体代码,还会往后继续执行

break: 跳出循环,结束循环的执行

for(var i = 0; i <= 10; i++) {
	// 当i= 5时
	if(i === 5) {
		//continue;//跳过,继续往后执行
		break;//跳出循环
	}
	console.log(i);
}

函数

保存一段可重复利用的代码

创建函数方式

声明方式创建

function 函数名称(参数列表){//行参

​ 函数体;

​ return 值;//返回值,函数调用后返回的值

}

函数名称(实参)

function fn(){
	console.log('a');
}
fn()

赋值方式创建

var 函数名 = function(){

​ 函数体;

​ return 值;

}

var fn = function() {
	console.log('a');
}
fn()

参数

  • 行参:在函数被调用时接收到的传入的值或变量
  • 实惨:在调用函数时传入的值或者变量
  • 实参可以跟行参数量不一样,没有赋值的行参显示undefined
function fn(a,b){//行参:在函数被调用时接收到的传入的值或变量
	//行参:虽然没有var,但是它属于局部变量
	console.log(a,b);//1,2
}
var i = 1;
fun(i, 2);
console.log(a,b);//会报错,a和b是局部变量

变量作用域

作用域: 一个变量的可用范围

  • 全局作用域:变量在任意位置可用
  • 函数作用域:变量在函数内部可用
  • 块级作用域:变量{}内部可用,es6新增

变量作用域:全局变量和局部变量

  • 全局变量:全局作用域可用
  • 局部变量:函数作用域和块级作用域可用

全局作用域

//定义全局变量
var a = 1;
console.log(a);// 1 可以访问到
function fn(){
	//函数访问先在函数内部找a
	//函数内部没有定义a变量,那么就会再往外层去找
	//找到全局变量a
	console.log(a);//1 可以访问到
}
fn();

函数作用域

function fun() {
	//定义局部变量
	var a = 1;
	//函数内访问时会先在函数内部找a
	//函数内部定义过a变量,就找到局部变量a
	console.log(a);//1
}
fun();
console.log(a);//报错,函数内部定义的函数只能在函数内部有效,外部不能访问

函数本质是一个变量,只不过这个变量的值保存的是一个函数

var a = function() {
	console.log('b');
}
a;//只是访问变量的值,函数并不会执行
console.log(a);//打印是个函数,是变量的值
a();//调用函数
  • 全局函数:全局作用域可用
  • 局部函数:函数作用域和块级作用域可用
//全局函数
function fun() {
	function a() {
		//局部函数
		console.log(a);
	}
	a();//可用调用
}
fun();//可以调用
a();//报错

声明提前

声明方式创建

console.log(a);//var a;声明提前,但是没有赋值
//a()//会报错 undefined不是一个函数
var a = function () {
	console.log('a');
}
a()

赋值方式创建

a();//可以调用,会把声明和赋值一起提前
function a() {
	console.log('a');
}

匿名函数

创建匿名函数

创建函数不指定名字的函数,节约内存,用完释放

(function (参数){
	代码块
})

匿名函数自调用

(function (str) {
	var n = 1;
	console.log(str);
})('hello');
(functin () {
	var n =2;
	console.log(n);
})()

回调函数

函数作为实参传递到另一个函数,在另一个函数内当作行参被使用

function tao(madai) {
	madai();//传入的行参,调用传递的回调函数
}
function dong() {
	
}
tao(dong);//dong是回调函数
tao(function () {})//匿名函数是回调函数

递归

函数内调用自己的函数,return返回值

function fn() {
	fn();
	return 返回值;//要有跳出条件,结合着return
}

系统函数

isNaN(): 判断值是不是NaN,隐式转换为数值型,是NaN为true,不是NaN为false
var a = 1;
var b = '1a';
console.log(isNaN(a));//false
console.log(isNaN(b));//true
isFinite():判断值是不是有限值,只有infinity是无限值
var a = 3/2;
console.log(isFinite(a));//true

var b = 3/0;
console.log(isFinite(b));//false
eval():执行字符串表达式
var a = 3.14
console.log(eval('parseInt(a)'));//3

对象

自定义对象

  • 对象字面量

    var 对象名称 =

    var obj = {name: 'wang', sex: '男'}
    console.log(obj);//{name: 'wang', sex: '男'}
    
  • 内置构造函数

    var 对象名称 = new Object();//创建一个空对象,添加属性需要一步步添加

    var obj = new Object();
    obj.name = 'wang';
    obj['sex'] = '男';
    console.log(obj);//{name: 'wang', sex: '男'}
    

访问属性

  • 对象.属性名
  • 对象['属性名']
  • 访问没有的属性,返回undefined
var obj = {name: 'wang', sex: '男'};
console.log(obj.name);//wang
console.log(obj['sex']);//男

遍历属性

for(var k in 对象) {
k//每个属性名
对象[k]//属性名代表的属性值
}

var obj = {name: 'wang', sex: '男'}
for (var k in obj) {
	console.log(k, obj[k])//name wang    sex 男
}

检测属性是否存在

  • 对象.属性名 === undefined
  • 对象.hasOwnProperty('属性名')
  • ‘属性名’ in对象

对象中的方法

方法对应的是一个函数

var person = {
	name: 'ding',
	play: function() {
		//this指代调方法的对象
		console.log(this.name)//ding
	}
}
person.play()

数组

数组创建

字面量

var 数组名称 = [元素1,元素2...]

var arr = ['a','b']
console.log(arr)

构造函数

var 数组名称 = new Array();

var arr = new Array();
arr[0] = 'a';
arr[1] = 'b';
console.log(arr);//['a','b']
数组的访问
  • 数组[下标],下标是以0开始的数字
  • 不存在的元素,结果是undefined
var arr = ['a','b'];
console.log(arr[0], arr[1]);//a, b
数组的长度

数组.length

var arr = ['a','b'];
console.log(arr.length);//2

数组末尾添加元素

数组[数组.length] = 值

var arr = ['a', 'b', 'c'];
arr[arr.length] = 'd';
console.log(arr);
遍历

for(var i = 0; i < 数组.length; i++) {
i代表下标
数组[i] 下标对应的元素
}

var arr = ['a', 'b', 'c'];
for(var i = 0; i < arr.length; i++) {
	console.log(arr[i]);
}

数组常用API

toString()

数组转为字符串

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

join()

数组转为字符串,默认分割为逗号,可以指定分割符号

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

concat()

数组拼接

var arr1 = [1,2,3];
var arr2 = [4,5,6];
console.log(arr1(arr2));//1,2,3,4,5,6

reverse()

翻转数组元素

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

sort()

数组排序,默认是按照首字母Unicode码从小到大

sort(function(a,b){
	return a-b;//数字从小到大排序
	//return b-a;//数字从大到小排序
})

slice(start,end)

截取数据,返回截取到的元素

var arr = ['a','b','c','d'];
console.log(arr.slice(1,3));//b,c

splice(start, count,v1,v2)

删除数据,count删除几个,替换的值v1,v2,,返回删除的元素

var arr = ['a','b','c','d'];
console.log(arr.splice(1,2,'o','r'),arr);

push()

数组末尾添加一个或多个元素,返回数组的长度

var arr = ['a','b','c','d'];
console.log(arr.push('e','f'));//6

pop()

删除数组末尾最后一个元素,返回删除的元素

var arr = ['a','b','c','d'];
console.log(arr.pop());//d

unshift()

数组开头添加一个或者多个元素,返回数组的长度

var arr = ['a','b','c','d'];
console.log(arr.unshift('e','f'));//e,f,a,b,c,d

shift()

删除数组开头一个元素,返回删除的值

var arr = ['a','b','c','d'];
console.log(arr.shift());//b,c,d

indexOf

判断数组是否含有某个元素,存在返回下标,不存在返回-1

var arr = ['a','b','c','d'];
console.log(arr.indexOf('c'));//2
console.log(arr.indexOf('e'));//-1

字符串

字符串API

length

字符串长度

var str = 'hello';
console.log(str.length);//5
charAt()

获取下标对应的字符,也可以使用数组格式,字符串[下标]

var str = 'hello';
console.log(str.charAt(4));//o
indexOf()

查找字符串,返回满足条件的第一个下标,找不到返回-1

var str = 'hello';
console.log(str.indexOf('l'));//2
console.log(str.indexOf('w'));//-1
lastIndexOf()

查找字符串,返回满足条件最后一个下标,找不到返回-1

var str = 'hello';
console.log(str.lastIndexOf('l'));//3
toUpperCase()

将英文字母转大写

var str = 'hello';
console.log(str.toUpperCase());//HELLO
toLowerCase()

将英文字母转小写

var str = 'HELLO';
console.log(str.toLowerCase());//hello
slice(start,end)

截取字符串,返回截取的字符串

var str = 'hello';
console.log(str.slice(1,3));//el
substr(start,count)

截取字符串,countd等于数量,返回截取到的字符串

var str = 'hello';
console.log(str.substr(1,3));//ell

Math对象

Math.PI()

圆周率 ,等于3.141592653589793

Math.abs()

求绝对值

var num = Math.abs(-3.14);
console.log(num);//3.14
Math.ceil()

向下取整

var num = Math.ceil(3.4);
console.log(num);//4
Math.floor()

向上取整

var num = Math.floor(3.4);
console.log(num);//3
Math.round()

四舍五入

var num = Math.round(3.4);
console.log(num);//3
Math.max()

获取一组数字最大值

var num = Math.max(10,20,30,15);
console.log(num);//30
Math.min()

获取一组数字最小值

var num = Math.min(10,20,30,15);
console.log(num);//10
Math.pow(x,y)

计算x的y次方

var num = Math.pow(2,3);
console.log(num);//8
Math.random()

获取随机,范围0~1 ,>=0 <1

var num = Math.random();
console.log(num);

Date()对象

创建Date()
  • var dt = new Date('2021/6/17 10:20:30');

  • var dt = new Date(2021,5,17,10,20,30) ;

    月份范围0~11代表1~12月

  • var dt = new Date(16882300000);

    存储距离计算机元年的毫秒数对应的日期时间

  • var dt = new Date();

    存储当地操作系统的时间

获取时间

getFullYear() 、 getMonth() 、getDate()、getHours()、getMinutes()、getSeconds()、getMilliseconds()

var dt = new Date();//获取当前时间
var year = dt.getFullYear();//获取年
var month = dt.getMonth()+1;//获取月
var date = dt.getDate();//获取天
var hours = dt.getHours();//获取小时
var minutes = dt.getMinutes();//获取分
var seconds = dt.getSeconds();//获取秒
var milliseconds = dt.getMilliseconds();//毫秒
console.log(year,month,date,hours,minutes,seconds,milliseconds)
设置时间

setFullYear()、setMonth()、setDate()、setHours() 、setMinutes() 、setSeconds()、setMilliseconds

var dt = new Date();//获取当前时间
dt.setFullYear(2022);//获取年
dt.setMonth(5);//获取月
dt.setDate(20);//获取天
dt.setHours(10);//获取小时
dt.setMinutes(15);//获取分
dt.setSeconds(35);//获取秒
console.log(dt);
转本地字符串,用于测试

toLocaleString()、toLocaleDateString()、toLocalTimeString()

var dt = new Date();
console.log(dt.toLocaleString());//获取完整的日期时间
console.log(dt.toLocaleDateString());//获取日期部分
console.log(dt.toLocaleTimeString());//获取时间部分

原始类型对象

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

Number对象
  • 创建

    new Number(),数据强制转为数值型,返回对象

var  n1 = new Number('33');//数据强制转为数值型,返回对象
console.log(n1, typeof n1);//{33},object
var  n2 = Number('3');//数据转为数值型,返回字符串
console.log(n2, typeof n2);//3,number
  • toFixed(n)

强制保留小数点n位

var num = 4
console.log(num.toFixed(2));//4.00
String对象

创建

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

var n1 = new String('hello');
console.log(n1, typeof n1);//{'hello'},object
var n2 = String('hello');//数据转为字符串,返回字符串
console.log(n2, typeof n2);//hello,object
Boolean对象

创建

new Boolean(),数据转为布尔型,返回对象

var n1 = new Boolean(1);//数据转为布尔型,返回对象
console.log(n1, typeof n1);//{true},object
var n2 = Boolean(1);//数据转为布尔型,返回布尔
console.log(n2, typeof);//true, string

ES6

块级作用域

let、const

let是常量

const是变量

声明的变量和常量都是局部的

大括号之间的语句块都是块级作用域

if for while....

箭头函数

() => {}

箭头的函数只有一行代码并且是return形式

let x = [1,2,4,3]
x.sort((a,b) => {
	return a-b;
});
//x.sort((a,b) => return a-b);//省略大括号
console.log(x);[1,2,3,4]
模版字符串

``

模板字符串${JS表达式}

let obj = {
	name: 'wang',
	sex: 1,
	isWork: 0
}
console.log(`姓名${obj.name},性别${obj.sex ? '男' : '女' },营业${obj.isWork ? '是' : '否' }`);
参数的默认值
//es6之前
function fn(a, b) {
	b = b || 0,
	console.log(a,b);
}
fn(5000);

//es6
function fn(a, b = 0) {//b没有值默认的参数为0
	console.log(a,b);
}
fn(5000);

错误处理

常见错误
  • 语法错误:(SyntaxError)

    出现中文符号,缺少括号等

  • 引用错误:(ReferenceError)

    使用了未声明的变量

  • 类型错误:(TypeError)

    函数或者对象下的方法找不到

  • 自定义错误:

    程序员自己指定的错误

    throw 错误内容

错误处理

try{

​ 尝试执行,可能出现的错误

}catch(err) {

​ 捕获错误,一旦try中出现错误才会执行

​ 将错误放入到 err中

​ 进行错误处理

}

let age = 75;
//尝试执行,可能产生错误,出现错误不会影响后边代码执行
try{
	if(age > 60 || age < 18) {
	//自定义错误
	throw '非法的年龄';
	}
}catch(err){
	//捕获错误,一旦try中出现错误才会执行
	//err会报错错误信息
	console.log(err);
	//解决错误
	age = 20;
}
console.log(20)
posted @ 2021-06-21 00:35  像鱼灵活的猫  阅读(58)  评论(0编辑  收藏  举报