JavaScript基础

217 阅读7分钟

变量声明提升

在执行所有代码前,JS有预解析阶段,会预读所有变量的定义;变量声明提升只提升定义,不提升值 例如: console.log(a); // 先使用变量 var a = 12; // 后定义变量 输出:undefined

So, 在实际开发中,要先定义并给变量赋初值,再使用变量。

JS基本数据类型

基本数据类型:Number、String、Boolean、Undefined、Null; 复杂数据类型:Object、Array、Function、RegExp、Date、Map、Set、Symbol等等, 复杂数据类型都是引用类型;

Null类型

null表示“空”,它是“空对象”; 当我们需要将对象销毁、数组销毁或者删除事件监听时,通常将它们设置为null。 typeof null; // object typeof [1,2,3]; // object

数据类型转换

使用Number()函数 --> 字符串、布尔值、undefined和null 转 数字

Number('123'); // 123 Number('123.6'); // 123.6 Number('123年'); // NaN Number('2e3'); // 2000 Number(''); // 0

Number('true'); // 1 Number('false'); // 0

Number(undefined); // NaN Number(null); // 0

使用parseInt()函数 --> 字符串 =>转=> 整数

parseInt() 会自动截掉第一个非数字字符之后的所有字符; parseInt() 如果字符串不是以数字开头的,结果为NaN; parseInt() 不会四舍五入; 例如: parseInt('3.14圆周率'); // 3 parseInt('圆周率3.14'); // NaN parseInt('3.99'); // 3

使用parseFloat()函数 --> 字符串 =>转=> 浮点数

parseFloat() 会自动截掉第一个非数字字符、非小数点之后的所有字符; parseFloat() 如果字符串不是以数字开头的,结果为NaN; parseFloat() 不会四舍五入; 例如: parseFloat('3.14圆周率'); // 3.14 parseFloat('圆周率3.14'); // NaN parseFloat('3.99'); // 3.99

使用String()函数 --> 数字、布尔值、undefined和null =>转=> 字符串

String(0xf) // '15'

使用toString()函数 --> 几乎所有值 =>转=> 字符串

使用Boolean()函数 --> 数字、布尔值、undefined和null =>转=> 布尔值

Boolean(123); // true Boolean(0); // false Boolean(NaN); // false 【0和NaN转为false,其他数字都转为true】 Boolean(Infinity); // true Boolean(-Infinity); // true

Boolean(''); // false 【空字符串变为false,其他都转为true】 Boolean('abc'); // true Boolean('false'); // true

Boolean(undefined); // false Boolean(null); // false

数组 =>转=> 字符串

一、toString()方法

1、功能:可以把每个元素转换为字符串,然后以逗号连接输出并显示。

2、使用方法:

var arr = [0,1,2,3]; //定义一个数组 var str = arr.toString(); //把arr数组利用toString()转换为字符串 console.log(str); //输入字符串“0,1,2,3”

当数组处于字符串环境中时,JS会自动调用 toString() 方法将数组转换成字符串。

var arr = [0,1,2,3]; //定义数组 var arr1 = [4,5,6,7]; //定义数组 var str = arr + arr1; //数组连接操作 console.log(str); //返回“0,1,2,3,4,5,6,7”

toString() 在把数组转换成字符串时,首先要将数组的每个元素都转换为字符串。当每个元素都被转换为字符串时,才使用逗号进行分隔,以列表的形式输出这些字符串。

var arr = [1,[2,3],[4,5]],[6,[7,[8,9],0]]]; //定义多维数组 var str = arr.toString(); //把数组转换为字符串 console.log(S); //返回字符串“1,2,3,4,5,6,7,8,9,0”

其中数组 arr 是一个多维数组,JavaScript 会以迭代的方式调用 toString() 方法把所有数组都转换为字符串。

二、toLocalString()方法

1、功能: 与 toString() 方法用法基本相同,区别在于 toLocalString() 方法能够使用用户所在地区特定的分隔符把生成的字符串连接起来,形成一个字符串。

var a = [1,2,3,4,5]; //定义数组 var s = a.toLocalString(); //把数组转换为本地字符串 console.log(s); //返回字符串“1,2,3,4,5,6,7,8,9,0”

根据中国的使用习惯,先把数字转换为浮点数之后再执行字符串转换操作

该处使用的url网络请求的数据。

三、join() 方法

1、功能: 把数组转换为字符串,不过它可以指定分隔符,如果省略参数,默认使用逗号作为分隔符

var arr = [1,2,3]; //定义数组 var str = arr.join("-"); //指定分隔符- console.log(s); //返回字符串“1-2-3”

substring()、substr()和slice()方法的区别

substring()、slice() a,b 从a开始到b结束,但不包括b slice() 不允许交换a,b位置,substring()允许交换位置 substr() a,b b表示长度


break 和 continue

break 立即终止循环;

continue用于跳出循环中的一个迭代,并继续执行循环中的下一个迭代。for循环更经常使用continue.

随机数函数

^ 得到[a, b]区间的整数,公式: ParseInt(Math.random() * (b - a + 1)) + a

算法 && 累加器和累乘器

image.png

image.png

image.png

image.png

image.png

image.png

数组类型的检测

Array isArray([]) // true type of ([]) // Object type of ({}) // Object

数组的常用方法

push() // 在尾部插入新项

pop() // 在尾部删除

unshift() // 在头部插入新项

shift() // 在头部删除

splice(x, y) // 从第x项开始连续替换或插入y项

slice(x, y) // 截取的子数组从第x项开始,到第y项结束(但不包括第y项);参数为负数表示倒数项

slice(x) // 截取第x项开始到后续所有项作为子数组

join() // 数组转字符串,默认以 , 分隔

concat() // 合并连结多个数组

reverse() // 将一个数组中的全部项顺序置反

indexOf() // 搜索数组中的元素,并返回它所在的位置,如果元素不存在,则返回-1

includes() // 判断一个数组是否包含一个指定的值,返回布尔值

sort() // 数组排序,涉及函数的相关知识(另外还有冒泡排序和快速排序)

字符串算法通常可以通过数组操作 例如: 要求把字符串 'ABCDEFG' 置反: 'ABCDEFG'.split('').reverse().join('') // 'GFEDCBA'

数组的浅克隆和深克隆

数组的浅克隆

通过遍历,推入到新数组,实现克隆。但是只能克隆一层。(例如,多维数组中只能克隆第一层数组)

数组的深克隆

image.png

image.png

函数的递归

指调用函数自身,但是一定要有一个递归的出口。否则就是回调地狱。

image.png

闭包

闭包的定义

image.png

image.png

image.png

闭包就是自身函数和所处环境的组合。 在JavaScript中,每次创建函数时,都会创建闭包。 闭包的特性:记忆性、模拟私有变量

闭包的记忆性

image.png

闭包模拟私有变量

image.png

image.png

立即执行函数IIFE

  1. 可以直接定义一个变量为函数并且立即执行;
  2. 可以让全局变量 转化成 局部变量。

image.png

image.png

image.png

image.png

image.png

DOM

image.png

nodeType

image.png

document(访问元素节点)

image.png

image.png

延迟运行

image.png

给window对象添加onload事件监听

image.png

封装节点关系函数

image.png image.png

image.png

image.png

image.png

image.png

innerHTML和innerText

image.png

节点操作

document.getElementById('#app').sytle.backgroundImage = 'url(www.baidu.com/static/img/…) contain';

document.getElementById('#app').src = 'images/2.jpg';

document.getElementById('#app').href = '......';

document.getElementById('#app').innerText = '......';

document.getElementById('#app').setAttribute('data-n', 10);

document.getElementById('#app').getAttribute('data-n'); ......

节点的创建(createElement()),移除(remove()),克隆(cloneNode()) document.getElementById('#app').createElement('box'); document.getElementById('#app').appendChild('box'); document.getElementById('#app').insertBefore('box');

事件监听(onclick...)、事件传播(先从外到内再从内到外)、事件对象、事件委托(e.target/e.currentTarget)

定时器(setInterval)和延时器(setTimeout)

无缝滚动、跑马灯轮播、呼吸轮播特效

BOM

BOM:浏览器对象模型

  1. 对象: Window、Navigator、History、Screen、Location;
  2. BOM特效开发;

对象的深浅克隆

对象的浅克隆: 循环遍历对象,插入到新对象;

对象的深克隆:使用递归

image.png

函数的上下文规则

image.png

规则1:对象.方法() 【函数的上下文是被调用的对象】

image.png

规则2:函数() 【函数的上下文是window对象】

image.png

规则3:数组下标 【函数的上下文是该数组或该类数组对象】

image.png 类数组对象:

image.png

image.png

规则4:IIFE函数(function() {})() 【上下文是window对象】

image.png

image.png

规则5:

image.png

规则6:

image.png

image.png 备份上下文: image.png

call和apply能指定函数的上下文

image.png

image.png

用new调用函数:秘密创建出的函数

上下文规则总结

image.png

构造函数

image.png

image.png

prototype

普通函数的prototype对于普通函数来说没什么用; 而构造函数的prototype却大有用处。【构造函数的prototype是实例的原型】

image.png

原型链查找

image.png

image.png

image.png

构造函数里面的方法要添加到prototype上

【prototype上添加方法】 image.png **注意 image.png

**方法要写到原型上,实例不要添加方法 image.png

原型链的终点

image.png

数组的原型链

image.png

例如: image.png

继承

例如: image.png

继承概念: image.png

更多继承关系举例: image.png

JS如何实现继承: image.png 通过原型链实现继承:

image.png

image.png

上升到面向对象

image.png

红绿灯案例:

image.png

炫彩小球小案例:

【有空敲一敲】

包装类

包装类:对基本类型值的一种面向对象封装

image.png

image.png

Math()对象方法

Math.pow(), Math.sqrt(), Math.ceil(), Math.floor()

image.png

Math.round()

image.png

用Math()对象四舍五入到小数点后两位 Math.round(a * 100) / 100

Math.max() 和 Math.min()

image.png

Math.max.apply(null, arr) 或 Math.max(...arr) image.png

Math.random()

image.png

Date(日期)对象

image.png

image.png

image.png

时间戳

image.png

image.png

倒计时小案例

image.png

image.png