递归与深浅拷贝
递归
- 一个方法重复调用自身的情况叫做递归
- 注意,一定要有一个条件来结束递归,否则将会陷入无限的循环
深浅拷贝
- 浅拷贝
- 拷贝基本类型的值
- 拷贝引用类型的引用(地址)
- 浅拷贝不是直接赋值,而是新建一个对象,将源对象的属性都一一复制过来。
- 深拷贝
- 深拷贝 = 浅拷贝 + 递归
- 拷贝基本类型的值
- 拷贝引用类型时(eg:数组、对象),使用递归,把父对象中所有属于引用类型的对象都遍历赋给子对象即可
- 缺点:带来性能问题,如果一个对象十分复杂或数据庞大,性能消耗会增加。
- 深拷贝和浅拷贝最根本的区别在于是否是真正获取了一个对象的复制实体,而不是引用
- 使用拷贝的原因:改变新数组(或对象)时,不改变原数组(对象)
标准内置对象
构造器
- 包装对象
- 当访问基本数据类型属性或方法时创建临时包装对象,访问的都是对象中的属性或方法
- 访问对象属性时,首先访问自身属性,访问不到时,则会在原型链上寻找对应的属性和方法
Number
- 原型方法
- Number.prototype.toFixed(…) *
- Number.prototype.toPrecision(…)
- Number.prototype.toString(…) *
- Number.prototype.toExponential(…)
- 静态属性
- Number.MAX_VALUE Number.MIN_VALUE
- Number.NaN
- Number.NEGATIVE_INFINITY
- Number.POSITIVE_INFINITY
Boolean
- 所有对象都是真值
String
- 字符串方法
- 使用
- length、indexOf(value)、charAt(i)、str[i]、slice(start,end)、split()、+、删除内容,遍历(for)、toUpperCase()、toLowerCase
- 规则
- 单 / 双引号声明
- 字符串不可更改,返回全新字符串
- 书写符合小驼峰命名法
- 使用
- 静态方法
- String.fromCharCode(97,98,99);
- 原型方法
- String.prototype.trim( );
- String.prototype.**concat(**str1,str2);
- String.prototype.toLowerCase( ); String.prototype.toLocaleLowerCase( );
- String.prototype.toUpperCase( ); String.prototype.toLocaleUpperCase( );
- String.prototype.indexOf(searchingString,position?);
- String.prototype.lastIndexOf(searchingString,position?);
- String.prototype.search(regexp); *
- String.prototype.match(regexp); *
- String.prototype.replace(regexp); *
Function
- 函数定义
- 函数声明
- 函数表达式
- Function构造函数实例化
- 函数调用
- 作为函数直接调用
- 对象方法
- 构造函数
- call / apply
- 静态属性
- Function.name
- 原型方法
- Function.prototype.apply()
- Function.prototype.bind()
- Function.prototype.call()
- Function.prototype.toString()
Object
- 静态方法
- Object.create() *
- Object.defineProperties()
- Object.defineProperty() *
- Object.getOwnPropertyDescriptor() *
- Object.getOwnPropertyDescriptors()
- Object.getOwnPropertyNames()
- Object.getPrototypeOf()
- Object.setPrototypeOf()
- 原型方法
- Object.prototype.hasOwnProperty() *
- Object.prototype.isPrototypeOf()
- Object.prototype.propertyIsEnumerable()
- Object.prototype.toString() *
- Object.prototype.valueOf()
Date
- Date 提供了解析、管理和展示时间的功能
- 对象基于1970年1月1日(世界标准时间)起的毫秒数
- 以常规函数调用时返回一个字符串,通过new调用,返回的是Date对象
- 没有字面量格式
- Date时间戳
- 北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数
- 时间转换成时间戳
- Date.now()
- (new Date()).getTime()
- 时间戳转换成时间
- new Date(timestamp)
- 创建Date对象及其日期的格式
- new Date(year,month,date,hours,minutes,seconds,milliseconds) //注意起始索引 ,若years为2位的话自动加1900
- new Date(dateTimeStr) //参数为字符串类型,注意格式,参见日期格式
- new Date(timeValue) //参数为数字类型,以毫秒为单位的时间戳
- new Date( ) //返回当前时间
- 静态方法
- Date.now()
- Date.parse() //转成毫秒,从1970年1月1日 00:00:00开始
- 原型方法
- Date.prototype.get( )
- Date.prototype.set( )
- Date.prototype.toLocalTimeString( )
- Date.prototype.toString( )
- Date.prototype.toLocalString( )
- 日期和时间格式
- 日期
- YYYY-MM-DD 、 YYYY-MM 、 YY
- 时间
- THH:mm:ss.sss、THH:mm:ss.sssZ 、THH:mm:ss、THH:mm:ssZ、THH:mm、THH:mmZ
- (T代表时间、Z代表时区信息)
- 日期时间
- YYYY-MM-DDTHH:mm:ss.sssZ
- 时间比较时转换为毫秒比较
- 日期
Array
- 静态方法(ES6)
- Array.from(…) 、Array.isArray(…) 、Array.of(…)等 *
- 原型方法
- 添加和删除元素 —— 破坏性
- Array.prototype.shift() Array.prototype.unshift(elem1,elem2,…)
- Array.prototype.pop() Array.prototype.push(elem1,elem2?,…)
- Array.prototype.splice(start,deleteCount,elem1,elem2)
- 排序和颠倒元素顺序 —— 破坏性
- Array.prototype.reverse()
- Array.prototype.sort(compareFunction)
- 合并、切分和连接 —— 非破坏性
- Array.prototype.concat(arr1,arr2,…)
- Array.prototype.slice(begin,end)
- Array.prototype.join(separator)
- 值的查找 —— 非破坏性
- Array.prototype.indexOf(searchValue,startIndex)
- Array.prototype.lastIndexOf(searchElement,startIndex)
- 迭代 —— 非破坏性
- Array.prototype.forEach(callback,thisValue) *//遍历所有元素
- Array.prototype.every(callback,thisValue) *//判断所有元素是否都符合条件
- Array.prototype.some(callback,thisValue) *//判断是否至少有一个元素符合条件
- 迭代-转换方法 —— 非破坏性
- Array.prototype.map(callback,thisValue) * //对元素重新组装,生成新的数组
- Array.prototype.filter(callback,thisValue) * //过滤符合条件的元素
- 迭代-归约方法 —— 非破坏性
- Array.prototype.reduce(element,initialValue) *
- Array.prototype.reduceRight(callback,initialValue)
- 添加和删除元素 —— 破坏性
Error
- 7种错误
- Error 基类型,其他错误类型都继承自该类型
- ReferenceError: 引用错误
- TypeError: 类型错误
- RangeError: 范围错误
- SyntaxError: 语法错误
- EvalError: Eval错误
- URIError: URI错误
- 异常捕获 —— try catch finally
- try 是必选的,catch 和 finally 两者至少要有其一, 没有 catch 块,程序会终止
- catch 块指定一个标识符(e),该标识符保存抛出异常信息,标识符仅在 catch 块执行时存在;catch 块执行完成后,标识符不再可用
- catch内的错误对象属性
- name :错误名称
- message :错误信息的文本描述
- **异常抛出 —— throw **
- 抛出一个用户自定义的异常
- expression 指定了异常的内容,可以为任何的 JavaScript 值
- Error构造器
- new Error( [message])
- 可以创建一个错误对象。当运行时错误产生时,Error 的实例对象会被抛出
JSON
- 数据传输格式概述(JSON作用:数据交换格式)
- XML:生成与解析麻烦
- JSON:简化格式
- JSON
- 概述
- JavaScript对象表示法
- 轻量级文本数据交换格式
- 由JavaScript脚本语言演变而来
- 独立于语言和平台
- 文件扩展名.json
- 更小、更快、更易解析
- 是一种数据格式,不是编程语言
- 具有相同的语法形式,但 JSON 并不从属于 JavaScript
- 并不是只有 JavaScript 才使用 JSON
- 很多编程语言都有针对 JSON 的解析器和序列化器
- 是JavaScript 对象的字符串形式的表示法,使用文本表示 JavaScript 对象的信息,本质是一个字符串
- 语法
- 并列数据的集合(数组)用方括号(“[]”)表示
- 并列的数据之间用逗号(", ")分隔
- 映射的集合(对象)用大括号(“{}”)表示
- 映射用冒号(": ")表示
- 字符串必须加双引号
- 可以表示的类型
- 简单值
- 字符串、数值、布尔值和 null,不支持 undefined
- 对象 —— 一组无序的键值对
- 数组 —— 一组有序的值的列表
- 简单值
- JSON方法
- JSON.stringify(object [,replacer [,space] ] )
- 把 JavaScript 对象格式转化为 JSON 字符串(序列化)
- undefined 值会被忽略
- object:指定要转换的对象
- replacer:参数过滤器为数组时,结果只包含数组中列出的属性 ;参数过滤器为函数时,需接受两个参数,属性键名和属性值
- space:参数为数值时,表示每个级别缩进的空格数;参数为字符串时,使用字符串作为缩进字符
- JSON.parse(json [,reviver])
- 把JSON字符串解析为原生JavaScript对象(反序列化)
- json:参数必须是有效的 JSON,否则会报错
- reviver:过滤器函数,需接受两个参数,属性键名和属性值
- JSON.stringify(object [,replacer [,space] ] )
- 概述
- 应用
正则表达式(RegExp对象)
-
简介
- 对字符串操作的逻辑公式(过滤,替换,判定等)
- 匹配模式,包括字符匹配和位置匹配
-
创建正则表达式
-
创建方式
-
字面量方式
-
推荐优先使用,但是字面量不能够使用变量代替
-
var box = /box/; //直接用两个斜杠 var box = /box/ig; //在第二个斜杠后面加上模式修饰符
-
-
new运算符
-
涉及到转义字符时,需要多写一个 \
-
var box = new RegExp('box'); //第一个参数正则字符串或正则字面量 var box = new RegExp(/box/); var box = new RegExp('box','ig');//第二个参数可选模式修饰符字符串
-
-
修饰符
- i 忽略大小写
- g 全局匹配
- m 多行匹配
-
转义字符
- 具有特殊含义的字符,不能直接匹配使用的,必须使用反斜线(\) 作为前缀进行转义后才能使用。
- . \ / * ? + [ ] ( ) { } ^ | $ -
- 字符串、正则表达式构造函数都使用反斜线(\) 作为转义字符的前缀。
- 具有特殊含义的字符,不能直接匹配使用的,必须使用反斜线(\) 作为前缀进行转义后才能使用。
-
RegExp方法
- test():检索字符串中指定的值,返回true或false
- exec():检索字符串中指定的值,返回找到的值,并确定其位置
-
模式匹配的String方法
- replace():对字符串中特定格式的子串进行替换,返回替换后的结果
- match():一个或多个子串、正则表达式的匹配, 返回一个数组
- 原字符串中匹配到了正则表达式指代的子串,则返回一个数组,否则返回null。
- a*b:以a开始以b结束的字符串
- a.b:以a开始以b结束的最长字符串
- search():返回第一次出现匹配指定正则表达式子串的下标,若没有匹配则返回 -1
- indexOf() 不支持正则表达式
- split():用一个指定的字符串或正则表达式,对原字符串进行拆分,返回拆得的子串数组
- 若指定了 howmany 属性,则只返回拆得的前 howmany 个子串
-
-
-
正则表达式符号
-
元字符:具有特殊含义的字符
- . 匹配任意单个字符,换行符除外
- \w 匹配字母、数字、下换线(字符)
- \W 匹配非字母、数字、下换线(字符)
- \d 匹配数字
- \D 匹配非数字
- \s 匹配空格字符
- \S 匹配非空格字符
- \n 匹配换行符
-
锚字符 :用于查找某个位置
- ^ 匹配字符串的开头,从左向右匹配
- $ 匹配字符串的结尾,从右向左匹配
- \b 匹配字符串的边界,\w 和 \W之间的位置
- \B 匹配字符串的非边界
- 零宽断言
- (?=exp) 零宽度正预测先行断言
- 匹配其后紧接 exp 的字符串(exp表示任意表达式)
- (?!exp) 零宽度负预测先行断言
- 匹配其后没有紧接 exp 的字符串
- (?=exp) 零宽度正预测先行断言
-
方括号:用于查找某个范围内的单个字符
- [abc] 匹配方括号字符集中的任何字符
- [^abc] 匹配任何不在方括号字符集中的任意字符
- [0-9] 匹配任何从0到9的数字
- [a-z] 匹配任何从 a 到 z 的字符
- [A-Z] 匹配任何从 A 到 Z 的字符
- [A-z] 匹配任何从 A 到 z的字符
-
量词:定义字符出现频次的字符
- n+ 匹配任何包含至少一个 n 的字符串
- n* 匹配任何包零个或多个 n 的字符串
- n? 匹配任何包含零个或一个 n 的字符串
- n{x} 匹配包含 x 个 n 序列的字符串
- n{x,} 匹配包含至少 x 个 n 序列的字符串
- n{x,y} 匹配包含 x 至 y 个 n 序列的字符串
-
贪婪和惰性
贪婪匹配 惰性匹配
1、 + +?
*2、 * ?
3、 ? ??
4、 {x,} {x,}?
5、 {x,y} {x,y}?
-
选择和分组
- exp1|exp2|exp3 使用 | 进行条件选择,查找任何指定的选项
- (exp1) 括号中的表达式可以作为一个整体
-
-
正则静态属性
-
正则静态属性
RegExp.$1-$9 RegExp.input ($_) RegExp.lastMatch ($&) RegExp.lastParen ($+) RegExp.leftContext ($`)
-
正则实例属性
-
patten.flags patten.global patten.ignoreCase patten.multiline patten.lastIndex patten.source
-
-