一,变量和作用域
1, js变量可以保存两种类型,基本类型、引用类型和symbol类型,基本类型有5种:undefined、null、boolean、number、string,它们都有以下的特征
-
- 基本类型在内存中占据固定大小的空间,因此被保存在栈内存中
- 从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本
- 引用类型的值是对象,保存在堆内存中
- 包含引用类型的变量只是一个指向该对象的指针
- 复制引用类型,只是复制了指针,其实两个变量都指向同一个对象。
- 确定基本类型的种类可以使用typeof操作符,确定是哪种引用类型可以使用instanceof操作符,也可以使用Object.prototype.toString.call()来进行处理
2,所有变量都存在一个执行环境,这个执行环境决定了变量的生命周期和访问区间
-
- 执行环境分为全局和函数执行环境
- 每次进去一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链
- 变量的执行环境有助于确定何时释放内存
二,引用类型
1,Object类型
创建Object实例的方法有三种,
Object.create
new Object()
对象字面量
一般用点表示法来访问对象属性,不过也可以用方括号来访问,方括号的优点是可以通过变量来访问属性。
2,Array类型
创建Array实例有两种方法
new Array() 或者 省略new Array(),如果只有一个参数并且为数值,则创建一个数值长度的数组,每一项为undefined,如果为其他类型,则创建一个只有那个值的一项的数组。
数组字面量方式 [1,2,3]
数组的length属性是可以设置的,通过设置length可以从数组的末尾移除项或者向数组中添加新项,添加的新项都为undefined
检测数组: value instanceof Array : 使用instanceof的问题在于,它假定的只有一个全局执行环境,如果页面中包含多个框架,那实际上就有两个以上不同的全局执行环境,从而存在两个以上的Array构造函数,如果从一个框架传数组到另一个框架,那么这两个数组分别有不同的构造函数。这里可以使用Array.isArray()来进行检测。
转换方法:
toString():返回数组每个值的字符串拼接成的以逗号分隔的字符串。
valueof(): 返回的还是数组本身
toLocalString() :和toString返回的一样。
join() : 默认也是返回数组每个值的字符串拼接的以逗号分隔的字符串,可以自定义分隔符。
栈方法和队列方法:
push: 后进 , 修改原数组,返回新数组的长度。
pop: 后出, 修改原数组,返回移除的项
unshift: 先进 , 修改原数组,返回新数组的长度
shift : 先出,修改原数组,返回移除的项
重排序:
reverse() : 反转数组,改变原数组 返回值为排序之后的数组
sort() : 调用数组每一项的toString 方法,然后比较得到的字符串。 返回值为排序之后的数组。会改变原数组。
操作方法:
concat() : 合并数组, 返回值为合并之后的数组