JavaSrcipt红宝书阅读导图(二)
-
三、变量、作用域和内存问题
1. 类型
- 基本类型
-
- 简单数据段
- 引用类型
-
- 多个值构成的对象
-
- 操作对象都是以引用的方式访问
2. 变量
- 动态属性
-
- 可以给对象动态地添加属性值
-
- 简单类型不能添加属性值
- 传递参数
-
- 简单类型是按值传入
-
- 对象类型是按引用传入
-
-
- 会改变对象内的值,并反映到调用函数的地方
-
-
-
- 在函数中为对象赋值为新对象,并不会反映到函数外部,会在函数结束后新对象销毁
-
- 复制
-
- 简单类型可以直接复制
-
- 对象复制是浅复制,只是复制引用
- 检测类型
-
typeof
-
instanceof
-
-
- 检测一个引用类型值和Object构造函数时,返回
true
- 检测一个引用类型值和Object构造函数时,返回
-
3. 作用域
- 当代码在环境中运行时,会创建一个作用域链
- 链从本函数的
arguments
开始,再到外部环境变量,再到下一个外部环境,直到全局变量 - 解析从作用域链一级一级向上回溯
- 延长作用域链
-
- try-catch语句的
catch
块
- try-catch语句的
-
with
语句
- 没有块级作用域
-
- 声明变量
-
-
- 在语句块中用
var
声明变量,会把变量添加到最近的环境中,即语句块的所在函数
- 在语句块中用
-
-
-
- 在函数中用
var
声明变量,把变量添加到最近的环境中,即这个函数局部,因此不能在函数外部访问函数内部的变量
- 在函数中用
-
-
-
- 如果函数中的变量不是局部变量,那么有可能会影响到外部的变量
-
-
- 查询标识符
-
-
- 从作用域链一级一级向上回溯,查到就立刻终止查询,并返回值,如果全局都没有,返回
undefined
或错误
- 从作用域链一级一级向上回溯,查到就立刻终止查询,并返回值,如果全局都没有,返回
-
- 垃圾收集
-
- 标记清除
-
- 引用计数
-
-
- 循环计数会造成内存泄露
-
四、引用类型
1. Object
- 创建对象
-
var person = new Object()
-
var person = {}
-
- 属性值自动转换成字符串
- 访问属性
-
obj.propname
-
obj["propname"]
-
-
- 可以解决点表示法中的数字、空格等情况
-
2. Array
- 数组可以保存任何类型的数据
- 创建数组
-
var colors = new Array()
-
var colors = []
length
-
- 数组长度
-
-
- 手动设置
length
可以改变数组大小,扩充的用Undefined
表示
- 手动设置
-
-
-
colors[colors.length]="purple"
可以表示在数组插入一个值在末尾,并且更新数组长度length
-
Array.isArray()
-
- 用于检测是否是数组
- 转换方法
-
toString()
-
toLocaleString()
-
valueOf()
-
join()
-
-
- 设置分隔符
-
- 栈方法
-
push()
-
-
- 数组末尾插入
-
-
pop()
-
-
- 数组末尾取出
-
- 队列方法
-
push()
-
shift()
-
-
- 数组开头取出
-
-
unshift()
-
-
- 数组开头插入
-
-
pop()
- 重排序方法
-
reverse()
-
-
- 反转
-
-
sort()
-
-
- 排序
-
-
-
- 参数:
compare
函数自定义定义排序效果
- 参数:
-
- 操作方法
-
concat()
-
-
- 拼接两个数组
-
-
-
- 返回拼接后的数组,原数组不变
-
-
slice()
-
-
- 返回起始位置到结束位置构成的新数组
-
-
-
- 对原数组不变
-
-
splice()
-
-
- 删除
-
-
-
- 插入
-
-
-
- 替换
-
- 位置方法
-
indexOf()
-
lastIndexOf()
- 迭代方法
-
every()
-
filter()
-
forEach()
-
map()
-
some()
- 归并方法
-
reduce()
-
reduceRight()
3. Date
4. RegExp
- 正则表达式
-
var expression = / pattern / flags;
- 实例方法
-
exec()
-
-
- 如果设置全局标志
g
,那么会保存上一次匹配的位置,从上一次的下一个字符开始匹配
- 如果设置全局标志
-
-
test()
-
-
- 检测是否有正则匹配的字符串
-
- 构造函数属性
-
input
-
lastMatch
-
lastParen
-
leftContext
-
multiline
-
rightContext
5. Function
- 定义方式
-
function sum(a,b);
-
var sum = function(a,b);
- 没有重载
- 函数声明
-
- 函数声明提升,放在代码源顶部
-
- 函数表达式没有提升
- 作为值的函数
-
- 函数名可以作为其他函数的参数来调用
-
- 函数可以作为返回值
- 内部属性
-
arguments
-
-
callee
指向拥有arguments
的函数
-
-
this
-
caller
- 函数属性和方法
-
length
-
-
- 指定参数个数
-
-
propotype
-
apply()
-
-
- 可以接受参数数组
-
-
call()
-
-
- 参数必须枚举
-
-
bind()
-
-
- 绑定
this
指针
- 绑定
-
6. 基本包装类型
- 基本包装类型如同对象一样有属性与方法
- 生存期很短,不能在运行时给基本包装类型添加属性与方法
new Object()
中传入字符串、数字或布尔值,会转换为基本包装类型
let num = Number(10); //num为Number类型 let num = new Number(10); //num为Object类型
Boolean-
不要使用这个对象
- Number
-
valueOf()
-
toString()
-
toLocaleString()
-
toFixed()
-
-
- 显示小数位数
-
-
toExponential()
-
-
- 指数表示
-
-
toPrecision()
-
-
- 接受显示位数来决定使用何种表示方法
-
- String
-
length
-
charAt()
-
charCodeAt()
-
[]
-
concat()
-
slice()
-
substr()
-
indexOf()
-
lastIndexOf()
-
trim()
-
-
- 删除前置后置空格
-
-
toUpperCase()
-
toLowerCase()
-
match()
-
-
- 接受正则表达式或
RegExp
对象
- 接受正则表达式或
-
-
search()
-
replace()
-
split()
-
localeCompare()
7. 单体内置对象
- 在程序运行前就已经创建好的对象
- Global
-
encodeURI()
-
decodeURI()
-
eval()
-
-
- 解析运行代码字符串
-
-
-
- 在方法中创建的变量不会提升,但是函数会
-
-
window
对象
- Math