FED3: dom 节点查找
查找两个节点的最近的一个共同父节点,可以包括节点自身
> oNode1.parentNode
oNode1.contains(oNode2)
查找其中一个结点的父节点,循环判断另一个结点在不在这个结点中
function commonParentNode(oNode1, oNode2) {
for (; oNode1;oNode1=oNode1.parentNode){
if (oNode1.contains(oNode2)){
return oNode1
}
}
}
FED4: 根据包名,在指定空间中创建对象
根据包名,在指定空间中创建对象
输入描述:
namespace({a: {test: 1, b: 2}}, ‘a.b.c.d’)
输出描述:
{a: {test: 1, b: {c: {d: {}}}}}
hasOwnProperty方法的使用
深拷贝和浅拷贝
split() 方法用于把一个字符串分割成字符串数组
function namespace(oNamespace, sPackage) {
var package=sPackage.split('.')
var newname=oNamespace // 保留对原始对象的引用
for (var i=0;i<package.length;i++){
if(!newname.hasOwnProperty(package[i])){ // 空间名不在对象中,建立此空间名属性,赋值为空
newname[package[i]]={}
newname=newname[package[i]] // 将指针指向下一个空间名属性
}
}
return oNamespace
}
FED6 斐波那契数列
用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) = 1, f(2) = 1 等
function fibonacci(n) {
var a=1
var b=1
for(var i=1;i<n;i++){
b=a+b
a=b-a
}
return a
}
FED12 字符串字符统计
统计字符串中每个字符的出现频率,返回一个 Object,key 为统计字符,value 为出现频率
- 不限制 key 的顺序
- 输入的字符串参数不会为空
- 忽略空白字符
function count(str) {
var obj={}
for (var i=0;i<str.length;i++){
if (str[i]!=' '){
!obj[str[i]]?obj[str[i]]=1:obj[str[i]]+=1
}
}
return obj
}
JS中访问对象的两种方式区别
可以使用下面两种方式访问对象的属性和方法
1.对象名.属性名 对象名.方法名()
2.对象名[“属性名”] 对象名"方法名"
- 对于已经存在的属性和方法,用.和用[]得到的结果一致、
- 对于不存在(未定义)的属性和方法,用.会创建这个新的属性或方法,而用[]的方式访问不会创建新的属性或方法
FED17 数组求和
计算给定数组 arr 中所有元素的总和
reduce函数对数组中所有内容进行汇总
reduce(function(a,b,c,d) , 0); reduce 有两个参数 一个回调函数,一个参数, 当参数存在时, 即为a 的初始值, 之后a为回调返回的值, b为数组当前的元素, c为当前元素序号值, d为调用reduce的数组。
function sum(arr) {
return arr.reduce((pre,n)=>pre+n,0)
}
FED21 删除数组最后一个元素
删除数组 arr 最后一个元素。不要直接修改数组 arr,结果返回新的数组
filter函数过滤
function truncate(arr) {
return arr.filter((n,i)=>i!=arr.length-1)
}
FED22 添加元素
在数组 arr 开头添加元素 item。不要直接修改数组 arr,结果返回新的数组
用push在数组后面插入元素
用unshift在数组前面插入元素
用splice在数组指定位置插入元素
function prepend(arr, item) {
var arrs=arr.slice(0)
arrs.unshift(item)
return arrs
}
FED23 删除数组第一个元素
删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组
function curtail(arr) {
return arr.slice(1) //切片
}
FED24 数组合并
合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组
concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
function concat(arr1, arr2) {
return arr1.concat(arr2)
}
FED26 计数
统计数组 arr 中值等于 item 的元素出现的次数
输入: [1, 2, 4, 4, 3, 4, 3], 4
输出: 3
function count(arr, item) {
return arr.filter(n=>n==item).length
}
FED28 求二次方
为数组 arr 中的每个元素求二次方。不要直接修改数组 arr,结果返回新的数组
输入:[1, 2, 3, 4]
输出:[1, 4, 9, 16]
function square(arr) {
return arr.map(n=>n*n)
}
FED29 查找元素位置
在数组 arr 中,查找值与 item 相等的元素出现的所有位置
输入:[‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘a’,‘b’,‘c’] ‘a’
输出:[0, 6]
function findAllOccurrences(arr, target) {
var res=[]
for (var i=0;i<arr.length;i++){
if(arr[i]==target){
res.push(i)
}
}
return res
}
FED30 避免全局变量
给定的 js 代码中存在全局变量,请修复
在Javascript语言中,声明变量使用的都是关键字var,如果不使用var而直接声明变量,则该变量为全局变量。
FED32 正确的使用 parseInt
修改 js 代码中 parseInt 的调用方式,使之通过全部测试用例
parseInt(string, radix)
radix 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。
parseInt(num,10)
FED33 完全等同
判断 val1 和 val2 是否完全等同
val1===val2
FED36 函数传参
将数组 arr 中的元素作为调用函数 fn 的参数
** call() 和 apply() 之间的区别
call() 方法分别接受参数。
apply() 方法接受数组形式的参数。**
arr为数组fn.apply(fn,arr)
FED37 函数的上下文
将函数 fn 的执行上下文改为 obj 对象
在JavaScript中,函数是一种对象,其上下文是可以变化的,对应的,函数内的this也是可以变化的,函数可以作为一个对象的方法,也可以同时作为另一个对象的方法,可以通过Function对象中的call或者apply方法来修改函数的上下文,函数中的this指针将被替换为call或者apply的第一个参数。将函数 fn 的执行上下文改为 obj 对象,只需要将obj作为call或者apply的第一个参数传入即可
return fn.apply(obj)
。
FED40 二次封装函数
已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:
1、返回一个函数 result,该函数接受一个参数
2、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致
function partial(fn, str1, str2) {
function result(str3){
return fn.call(fn,str1, str2, str3)
}
return result
}
FED41 使用 arguments
函数 useArguments 可以接收 1 个及以上的参数。请实现函数 useArguments,返回所有调用参数相加后的结果。本题的测试参数全部为 Number 类型,不需考虑参数转换。
函数传参
function useArguments() {
var sum=0
for (var i=0;i<arguments.length;i++){
sum+=arguments[i]
}
return sum
}
FED44 柯里化
已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件:
1、返回一个函数 a,a 的 length 属性值为 1(即显式声明 a 接收一个参数)
2、调用 a 之后,返回一个函数 b, b 的 length 属性值为 1
3、调用 b 之后,返回一个函数 c, c 的 length 属性值为 1
4、调用 c 之后,返回的结果与调用 fn 的返回值一致
5、fn 的参数依次为函数 a, b, c 的调用参数
return a=>b=>c=>a+b+c
柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。简单理解题目意思,就是指,我们将预定义的函数的参数逐一传入到curryIt中,当参数全部传入之后,就执行预定义函数。于是,我们首先要获得预定义函数的参数个数fn.length,然后声明一个空数组去存放这些参数。返回一个匿名函数接收参数并执行,当参数个数小于fn.length,则再次返回该匿名函数,继续接收参数并执行,直至参数个数等于fn.length。最后,调用apply执行预定义函数。
FED45 或运算
返回参数 a 和 b 的逻辑或运算结果
return a||b
FED46 且运算
返回参数 a 和 b 的逻辑且运算结果
return a&&b
FED49 二进制转换
给定二进制字符串,将其换算成对应的十进制数字
return parseInt(str,2)
FED51 乘法
求 a 和 b 相乘的值,a 和 b 可能是小数,需要注意结果的精度问题
toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。
return parseFloat((a*b).toFixed(10))
FED52 改变上下文
将函数 fn 的执行上下文改为 obj,返回 fn 执行后的值
return fn.apply(obj)
FED53 批量改变对象的属性
给定一个构造函数 constructor,请完成 alterObjects 方法,将 constructor 的所有实例的 greeting 属性指向给定的 greeting 变量。
constructor.prototype.greeting=greeting
FED55 判断是否包含数字
正则匹配
给定字符串 str,检查其是否包含数字,包含返回 true,否则返回 false
return /[0-9]/g.test(str)
FED57 判断是否以元音字母结尾
给定字符串 str,检查其是否以元音字母结尾
1、元音字母包括 a,e,i,o,u,以及对应的大写
2、包含返回 true,否则返回 false
return /[a,e,i,o,u]$/i.test(str)