变量声明提升
在执行所有代码前,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
算法 && 累加器和累乘器
数组类型的检测
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'
数组的浅克隆和深克隆
数组的浅克隆
通过遍历,推入到新数组,实现克隆。但是只能克隆一层。(例如,多维数组中只能克隆第一层数组)
数组的深克隆
函数的递归
指调用函数自身,但是一定要有一个递归的出口。否则就是回调地狱。
闭包
闭包的定义
闭包就是自身函数和所处环境的组合。 在JavaScript中,每次创建函数时,都会创建闭包。 闭包的特性:记忆性、模拟私有变量
闭包的记忆性
闭包模拟私有变量
立即执行函数IIFE
- 可以直接定义一个变量为函数并且立即执行;
- 可以让全局变量 转化成 局部变量。
DOM
nodeType
document(访问元素节点)
延迟运行
给window对象添加onload事件监听
封装节点关系函数
innerHTML和innerText
节点操作
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:浏览器对象模型
- 对象: Window、Navigator、History、Screen、Location;
- BOM特效开发;
对象的深浅克隆
对象的浅克隆: 循环遍历对象,插入到新对象;
对象的深克隆:使用递归
函数的上下文规则
规则1:对象.方法() 【函数的上下文是被调用的对象】
规则2:函数() 【函数的上下文是window对象】
规则3:数组下标 【函数的上下文是该数组或该类数组对象】
类数组对象:
规则4:IIFE函数(function() {})() 【上下文是window对象】
规则5:
规则6:
备份上下文:
call和apply能指定函数的上下文
用new调用函数:秘密创建出的函数
上下文规则总结
构造函数
prototype
普通函数的prototype对于普通函数来说没什么用; 而构造函数的prototype却大有用处。【构造函数的prototype是实例的原型】
原型链查找
构造函数里面的方法要添加到prototype上
【prototype上添加方法】
**注意
**方法要写到原型上,实例不要添加方法
原型链的终点
数组的原型链
例如:
继承
例如:
继承概念:
更多继承关系举例:
JS如何实现继承:
通过原型链实现继承:
上升到面向对象
红绿灯案例:
炫彩小球小案例:
【有空敲一敲】
包装类
包装类:对基本类型值的一种面向对象封装
Math()对象方法
Math.pow(), Math.sqrt(), Math.ceil(), Math.floor()
Math.round()
用Math()对象四舍五入到小数点后两位 Math.round(a * 100) / 100
Math.max() 和 Math.min()
Math.max.apply(null, arr) 或 Math.max(...arr)