基本数据类型
Undefibed类型
一个声明后没有被赋值的变量会有一个默认值undefined
Null
一个声明变量给 null 值,里面存的值为空
Number
既可以保存整数,也可以保存浮点数,其中八进制前面加0,十六进制前面加0x
- 三个特殊值
Infinity:无穷大
-Infinity:无穷小
NaN:非数值 - isNaN(变量) 用来判断一个变量是否为非数字的类型,返回 true 不是数值,返回 false是数值
String
字符串型可以是引号中的任意文本
- JS 可以用单引号嵌套双引号 ,或者用双引号嵌套单引号
- 字符串转义符
\n 换行
\\ 斜杠
\t tab缩进
\b 空格 - 字符串长度,length 属性可以获取整个字符串的长度
- 字符串拼接 " + "
字符串 + 任何类型 = 拼接之后的新字符串
Boolean
布尔类型有两个值:true 和 false , 和数字相加时,true为1,false为0
-
操作符 typeof
可以检测变量的数据类型(object,number,unction,boolean,undefined)
注:typeof null = object -
字面量:字面量是在源代码中一个固定值的表示法
- 数字:1,2等
- 字符串:“字符串”,‘字符串’
- 布尔:true,false
-
数据类型的转换
- 转换为字符串
toString() 变量.toString()
String() String(变量) 强制转换
加号拼接字符串 隐式转换 - 转换为数字型
parseInt() parseInt(变量) 整型
parseFloat() parseFloat(变量) 浮点数
Number() Number(变量)
( -,*,/) 隐式转换是我们在进行算数运算的时候,JS 自动转换了数据类型 - 转换为布尔型
Boolean() Boolean(变量)
代表空、否定的值会被转换为 false ,如 ’ '、0、NaN、null、undefined ,其余值都会被转换为 true
- 转换为字符串
引用类型
Object
Array数组
-
创建数组的方法(数组中可以存放任意类型的数据)
- 利用 new 创建数组:var 数组名 = new Array();
- 利用数组字面量创建数组:var 数组名 = [ ‘元素1’ , ‘元素2’ , ‘元素3’ ];
-
获取数组中的元素
利用索引号获取,如果访问时数组没有和索引值对应的元素,则得到的值是undefined
-
遍历数组
- 数组的长度:默认情况下表示数组中元素的个数
数组名.length 可通过改变数组length属性的值改变数组的元素个数
- 数组的长度:默认情况下表示数组中元素的个数
-
数组中新增元素
数组[ 数组.length ] = 新数据;
-
检测是否为数组
- instanceof 运算符 :可以判断一个对象是否是某个构造函数的实例
- 用法:
var 变量名 = 对象名 instanceof 构造函数名称;
- 用法:
- Array.isArray() 用于判断一个对象是否为数组, 是 HTML5 中提供的方法
Array.isArray(对象名);
- instanceof 运算符 :可以判断一个对象是否是某个构造函数的实例
-
添加删除数组元素的方法
pop() 删除数组的最后一个元素并返回删除的元素。
push() 向数组的末尾添加一个或更多元素,并返回新的长度。
shift() 删除并返回数组的第一个元素。
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。 -
数组排序
reverse() 反转数组的元素顺序。
sort() 对数组的元素进行排序。
arr.sort(function(a, b) {
return b - a; // 降序
// return a - b; // 升序
});
-
数组转化为字符串
toString() 把数组转换为字符串,逗号分隔每一项,返回一个字符串
join(‘分隔符’) 把数组中的所有元素转换为一个字符串,返回一个字符串 -
数组索引方法
indexOf() 搜索数组中的元素,并返回它所在的位置,如果不存在,返回-1
lastIndexOf() 搜索数组中的元素,并返回它最后出现的位置,如果不存在,返回-1 -
迭代方法
forEach() 数组每个元素都执行一次回调函数。
filter() 检测数值元素,并返回符合条件所有元素的数组。
some() 检测数组元素中是否有元素符合指定条件。
Function
Date
-
Date实例化
- 无参数 :var now = new Date();
- 有参数 :var future = new Date(‘2019/5/1’);
参数分为数字型和字符串型,建议使用字符串型
-
方法
getFullYear() 从 Date 对象以四位数字返回年份。
getMonth() 从 Date 对象返回月份 (0 ~ 11)。
getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。
getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。
getHours() 返回 Date 对象的小时 (0 ~ 23)。
getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。
getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。
获取总毫秒:基于1970年1月1日(世界标准时间)起的毫秒数
valueOf(),getTime()
var date = +new Date();
Date.now()(H5新增的)
RegExp
正则表达式( Regular Expression )是用于匹配字符串中字符组合的模式。
-
创建正则表达式
- 通过调用 RegExp 对象的构造函数创建
var 变量名 = new RegExp(/表达式/); - 通过字面量创建
var 变量名 = /表达式/;
- 通过调用 RegExp 对象的构造函数创建
-
测试正则表达式 test
test() 正则对象方法,用于检测字符串是否符合该规则 -
特殊字符
- 边界符=
^ 表示匹配行首的文本(以谁开始)
$ 表示匹配行尾的文本(以谁结束) - 方括号[]
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
[adgk] 查找给定集合内的任何字符。
[^adgk] 查找给定集合外的任何字符。
(red|blue|green) 查找任何指定的选项。 - 量词符
* 重复0次或更多次
+ 重复1次或更多次
? 重复0次或1次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
- 边界符=
-
正则表达式参数
/表达式/[switch]
switch有三种值:
g:全局匹配
i:忽略大小写
gi:全局匹配 + 忽略大小写
内置对象 Math (不是构造函数)
-
常见属性和方法
Math.PI 圆周率
Math.floor() 向下取整
Math.ceil() 向上取整
Math.round() 四舍五入 就近取整 ,注意 -3.5 结果是 -3
Math.abs() 绝对值
Math.max()/Math.min() 求大和小值
Math.random() 获取范围在[0,1)内的随机值 - 获取指定范围内的随机整数
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
1
基本包装类型 :String、Number、Boolean
基本包装类型:把简单数据类型包装成为复杂数据类型,这样基本数据类型就有了属性和方法。
-
String
- 字符串的不可变
指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间 - 根据字符返回位置
indexOf(‘要查找的字符’ , 开始的位置) 返回指定内容在原字符串中的位置,如果找不到就返回-1
lastIndexOf() 从后往前找,只找第一个匹配的。 - 根据位置返回字符
charAt(index) 返回指定位置的字符
charCodeAt(index) 返回指定位置的字符的ASCII码
str[index] 获取指定位置的字符 HTML5 - 字符串操作方法
concat() 连接两个或更多字符串等效于 + ,并返回新的字符串。
slice(start,end) 提取字符串的片断,并在新的字符串中返回被提取的部分。
substr(start,取的个数) 从起始索引号提取字符串中指定数目的字符。
substring(start,end) 提取字符串中两个指定的索引号之间的字符,基本与slice相同,不接受负值
trim() 方法会从一个字符串的两端删除空白字符。 - replace() 方法:在字符串中用一些字符替换另一些字符。
replace(被替换的字符串, 要替换为的字符串); - split(‘分隔符’) 方法:用于切分字符串,它可以将字符串切分为数组,返回一个新数组
- 字符串的不可变
-
Number
- var num = new Number(value);
- toFixed(x) 把数字转换为字符串,结果的小数点后有指定位数的数字。
-
Boolean
- var 变量名 = new Boolean(true/false);
作用域、内存
- 全局作用域:作用于所有代码执行的环境
- 局部作用域:作用于函数内的代码环境
- JS没有块级作用域,但有模仿块级作用域
(function(){
//这里是块级作用域
})(); -
变量的作用域
全局变量:在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存
局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码块运行结束后,就会被销 毁,因此更节省内存空间 -
预解析
预解析会把变量和函数的声明在代码执行之前执行完成。- 变量的提升:变量的声明会被提升到当前作用域的最上面,变量的赋值不会提升。
- 函数的提升函数的声明会被提升到当前作用域的最上面,但是不会调用函数。
-
堆和栈
- 栈:由操作系统自动分配释放存放函数的参数值、局部变量的值等,简单数据类型存放到栈里面
- 堆:存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收,复杂数据类型存放到堆里面
-
传参
- 简单类型的传参:当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到的外部变量。
- 复杂类型的传参:当我们把引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地 址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。
对象
面向对象
优点 易维护、易复用、易扩展,由于面向对象有封装、继承、多 态性的特性,可以设计出低耦合的系统,使系统 更加灵 活、更加易于维护
缺点 性能比面向过程低
创建对象
-
使用对象字面量创建对象 {},采用键值对的形式表示
var 对象名 = { }; -
利用 new Object 创建对象
var 对象名 = new Obect(); -
利用构造函数创建对象
构造函数:是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 运算符一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。构造函数的封装格式和调用格式
function 构造函数名(形参1,形参2,形参3) {
this.属性名1 = 参数1;
this.属性名2 = 参数2;
this.属性名3 = 参数3;
this.方法名 = 函数体;
}
var 变量名 = new 构造函数名(实参1,实参2,实参3)
遍历对象 for in 语句
for (变量 in 对象名字) { } 通常我们会将这个变量写为 k 或者 key
对象方法
- Object.keys() 方法返回一个所有元素为字符串的数组。
- Object.defineProperty() 定义新属性或修改原有的属性。
构造函数和原型
静态成员和实例成员
- 实例成员:构造函数内部通过this添加的成员
- 静态成员:在构造函数本身上添加的成员
构造函数原型prototype
构造函数通过原型分配的函数是所有对象所共享的。
JavaScript 规定,每一个构造函数都有一个prototype 属性,指向另一个对象。注意这个prototype就是一个对 象,这个对象的所有属性和方法,都会被构造函数所拥有。
我们可以把那些不变的方法,直接定义在 prototype 对象上,这样所有对象的实例就可以共享这些方法。
对象原型__proto__
对象都会有一个属性 proto 指向构造函数的 prototype 原型对象
constructor 构造函数
对象原型( proto)和构造函数(prototype)原型对象里面都有一个属性 constructor 属性 ,constructor 我们称 为构造函数,因为它指回构造函数本身
原型链
JavaScript 的成员查找机制是根据原型链在查找的
继承:通过构造函数+原型对象模拟实现继承,被称为组合继承
- 属性继承:通过 call() 把父类型的 this 指向子类型的 this
- 方法继承:借用原型对象
函数
函数的定义方式
- 自定义函数方式(命名函数)
function fn() {…}
调用函数的代码既可以放到声明函数的前面,也可以放在声明函数的后面 - 函数表达式方式(匿名函数)
var 变量名 = function(){…};
函数调用必须写到函数体下面 - new Function()(该方法效率低,比较少用)
var fn = new Function(‘参数1’,‘参数2’…, ‘函数体’)
Function 里面参数都必须是字符串格式
arguments(伪数组)的使用
arguments实际上它是当前函 数的一个内置对象。所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有实参。
注:具有 length 属性,不具有数组的 push , pop 等方法
函数的调用
- 普通函数(直接调用):fn();
- 对象的方法 :对象名.sayHi();
- 构造函数:new 函数名();
this
- 函数内部this的指向
- 普通函数调用:window
- 对象方法调用:该方法所属对象
- 构造函数调用:实例对象
改变函数内部this指向
- call()方法 可调用函数,返回值为函数的返回值:call(this值,参数)
- apply()方法 可调用函数,返回值为函数的返回值:apply(this值,[数组])
- bind()方法 不会调用函数,返回由指定的 this 值和初始化参数改造的原函数拷贝 :bind(this值,参数)
高阶函数
高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出
闭包
闭包(closure)指有权访问另一个函数作用域中变量的函数。
闭包的作用:延伸变量的作用范围。
递归
如果一个函数在内部可以调用其本身,那么这个函数就是递归函数。