JavaScript
1. 原始值和引用值类型及区别
原始值即存在栈中的数据,包含symbol、number、string、null、undefined、boolean类型。
引用值即存在堆中的对象,对象地址(指针)存在栈中,指向堆中存储的数据,包含Object、Function、Array类型。
2.判断数据类型typeof、instanceof、Object prototype.toString.call()、constructor
typeof用于判断基本类型数据,但判断null和对象时(包括数组)都会返回object。
instanceof用于判断实例对象是否属于某个构造函数下属的实例(构造函数的prototype原型对象是否在实例对象的原型链上)。
根据原型链知识点,obj.toString在不同对象obj的情况下调用的是相对应的重写方法(比如Function就是返回函数体字符串,数组则返回元素组成的字符串。。)不会去调用Object原型上的toString方法。因此才使用Object.prototype.toString.call(obj)的方式进行类型判断,可以以[object String]的形式对obj的类型进行判断,但无法判断自定义对象,自定义对象需使用instanceof进行判断。
constructor存在于每一个function的prototype中。
在定义一个函数时:
functionF() {
//…
},
JS内部会为该函数添加一个原型prototype属性,并为原型属性添加一个constructor,保存指向F函数的一个引用。因此:
1.var f = new F();
2.alert(f.constructor === F);// output true
3.alert(f.constructor === F.prototype.constructor);// output true
使用constructor属性返回对创建此对象的数组函数的引用
3.类数组与数组的区别与转换
都可以用下标访问每个元素,都有length属性
数组对象的类型时Array,类数组对象的类型时Object,也就是类数组原型是Object,类数组不具备数组的方法,数组遍历能用for in、for of,而类数组只能用for遍历
常见的类数组有:函数参数arguments(包含函数传入的实参,其中的callee指针指向拥有这个arguments的函数)、DOM对象列表、jQuery对象列表
数组转类数组:
var arr = [1, 2, 3, 4]
var obj = {}
[].push.apply(obj, arr)
类数组转数组:
Array.prototype.slice.call(arrayLike, start)
Array.from(arrayLike)(ES6新增方法,能将类数组对象和iterable对象(包括Set、Map)转换为真正的数组)
扩展运算符(…)
4.数组的常见API
join():将数组元素组成字符串,以括号中参数为分隔符,如省略则默认逗号分隔,只能接受一个参数。原数组不变。
push():接收任意数量参数,逐个添加到数组末尾返回修改后数组长度。原数组改变。
pop():数组末尾最后一项移除,同时数组length-1,然后返回移除的项。原数组改变。
shift():移除数组第一项,并返回移除的项,原数组改变。
unshift():将参数添加至数组第一项,返回数组length。原数组改变。
sort():按升序排序数组,将数组每个项调用toString方法转型,比较结果字符串的大小以排序,因此无法精确排序,需要添加排序函数作为参数:function compare(value1, value2) {
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
}
然后使用sort(compare)可以精确排序
原数组改变。
reverse():反转数组,原数组改变。
concat():创建一个数组副本,将参数添加到副本末尾并返回这个副本,原数组不改变。
slice():一个参数则返回数组该位置到末尾所有项,两个参数则返回第一个参数位置到第二个参数减一位置之间的项。参数为负数则将参数加数组长度的值作为新代替参数。原数组不改变。
splice():
删除:指定两个参数(要删除的第一项位置和删除的项数)
插入:指定三个参数(起始位置、0、要插入的项)
替换:指定三个参数(起始位置、删除的项数、要插入的任意数量的项)
原数组不改变。
indexOf():两个参数,要查找的项和查找起点位置(以0为基准、可选),从前往后查找成功返回查找项的索引位置,失败则返回-1
lastIndexOf():两个参数,要查找的项和查找起点位置(可选),从后往前查找成功返回查找项的索引位置,失败则返回-1
forEach():遍历数组每一项运行指定函数,没有返回值
map():数组每一项运行指定函数,返回每一项调用函数的结果组成的数组
filter():数组每一项运行指定函数,返回满足过滤条件的数组
every():判断数组每一项是否满足给定函数的条件,只有所有项都满足才返回true,否则false
some():判断数组中是否有满足给定函数的条件的项,只要有一项满足就返回true,否则false
reduce和reduceRight():
这两个方法都会实现迭代数组的所有项,然后构建一个最终返回的值。reduce()方法从数组的第一项开始,逐个遍历到最后。而 reduceRight()则从数组的最后一项开始,向前遍历到第一项。
这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值。
传给 reduce()和 reduceRight()的函数接收 4
个参数:前一个值、当前值、项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数就是数组的第二项。
下面代码用reduce()实现数组求和,数组一开始加了一个初始值10。
var values = [1,2,3,4,5]; var sum =
values.reduceRight(function(prev, cur, index, array){
return prev +
cur; },10);
console.log(sum); //25