JS考点

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

5.bind、call、apply的区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值