【总结系列】原生JS常用技巧,重难点整理

(一)字符串相关


一、获取查询字符串

/**

  • 获取url中的查询字符串的某个值

  • @param key 必须参数,查询字符串中的一个键名

  • @param url 可选参数,默认为当前页面的url

  • @returns {string|null}

*/

function getQuery(key,url=document.location.href){

const query = url.split(“?”).length > 1 ? url.split(“?”)[1] : null

if(!query)

throw new Error(“当前url没有查询字符串”)

const entries = query.split(“&”)

for(let i = 0;i < entries.length;i++){

const entry = entries[i].split(“=”)

if(key === entry[0]){

return entry[1]

}

}

return null

}

二、翻转字符串

如果需要翻转一个数组,那么很简单,因为原生的方法就支持实现这个功能。但是,如果需要翻转一个字符串就需要自己实现了。实现的思路也很简单,先把字符串转换为数组,将数组翻转,最后将数组转化为字符串。

/**

  • @param str 待翻转的字符串

  • @returns {string} 翻转后的字符串

*/

function reverseString(str){

str = “” + str

return str.split(“”).reverse().join(“”)

}

三、去重字符串相同字符

感觉这个需求在面试中出现的比较多,实现原理:

字符串是可迭代对象,所以可以转换为 Set 类型,利用 Set 类型元素唯一性进行去重,然后将 Set 转换为数组,最后通过数组方法拼接成字符串。

[…new Set(str)].join(“”)

(二)数组相关


一、数组去重

数组去重是一个很常见的需求了,在网上也有很多去重的方法,在此介绍两个简洁的去重方法。

unique(arr){

if(!Array.isArray(arr))

throw new Error(“arr is not a array”)

return […new Set(arr)] //或者 Array.from(new Set(arr))

}

上面就是利用了 Set 元素的唯一性。

但是,如果数组中存在内容相同的引用类型,那么这个方法就没有效果了。

比如:

let arr = [

{name:“jonas”,age:18},

{name:“jonas”,age:18},

{name:“jonas”,age:18}

]

你会发现无论使用上面的方法还是网络上介绍的数组去重方法,都实现不了这种去重。所以,这时候自己写了一个方法用于解决这个问题(见下面)。

二、数组深度去重

对于基本数据类型的去重很简单,就是上面的一行代码就解决了,然而复杂的是引用类型。此处的引用类型主要是指对象和数组,所以,问题就变成两个:①去重内容相同的对象②去重内容相同的数组。

因为数组和对象的特征不同,存储数据的方式也不同,所以第一件事就是将数组和对象区分开来。

/**

  • 获取一个值的类型

  • @param target

  • @returns {string} 返回这个值的类型。如果是数组,则返回 “Array”;是对象返回 “Object”

*/

function getType(target) {

return Object.prototype.toString.call(target).slice(8,-1)

}

接下来的问题就是判断两个对象中的内容是否完全一致了。

/**

  • 判断两个对象的内容是否完全一致,返回布尔值

  • @param a

  • @param b

  • @returns {boolean}

*/

function objUnique(a,b) {

//限制两个参数都是对象

if(getType(a) !== ‘Object’ && getType(b) !== ‘Object’)

return false

//获取其中一个对象的属性

let keyList = Object.keys(a)

for(let i = 0;i < keyList.length;i++){

//获取键名

let propName = keyList[i]

//处理嵌套

if(getType(a[propName]) === ‘Object’ && getType(b[propName]) === ‘Object’){

objUnique(a[propName],b[propName])

}else if(getType(a[propName]) === ‘Array’ && getType(b[propName]) === ‘Array’){

arrUnique(a[propName],b[propName])

}else if(a[propName] !== b[propName]){

//存在一对键值对不同,则表示两个对象不同

return false

}

}

return true

}

/**

  • 判断两个数组的内容是否完全一致,返回布尔值

  • @param a

  • @param b

  • @returns {boolean}

*/

function arrUnique(a, b) {

//限制两个参数都是数组

if(getType(a) !== ‘Array’ && getType(b) !== ‘Array’)

return false

//如果长度不等,则两个数组不可能相同

if(a.length !== b.length)

return false

//处理嵌套

for(let i = 0;i < a.length;i++){

if(getType(a[i]) === ‘Object’ && getType(b[i]) === ‘Object’){

objUnique(a[i],b[i])

}else if(getType(a[i]) === ‘Array’ && getType(b[i]) === ‘Array’){

arrUnique(a[i],b[i])

}else if(a[i] !== b[i]){

//存在一个元素不同,则表示两个数组不同

return false

}

}

return true

}

整合:

/**

  • 数组深度去重

  • @param arr

  • @returns {null|*[]}

*/

function unique(arr) {

//处理异常参数

if(getType(arr) !== ‘Array’)

throw new Error(“arr is not a Array.”)

//基本数据类型容器

let commonList = []

//对象收纳容器

let objList = []

//数组收纳容器

let arrList = []

//数据分类

arr.forEach(item => {

if(getType(item) === ‘Object’){

objList.push(item)

}else if(getType(item) === ‘Array’){

arrList.push(item)

}else{

commonList.push(item)

}

})

//基本数据类型去重

commonList = Array.from(new Set(commonList))

//对象收纳容器去重

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

最后更多分享:前端字节跳动真题解析

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

JTDkPkp-1710706611793)]
[外链图片转存中…(img-StMNxASs-1710706611794)]
[外链图片转存中…(img-EjkZI8c1-1710706611794)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-UV2nm59z-1710706611795)]

最后更多分享:前端字节跳动真题解析

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  • [外链图片转存中…(img-swiP7bJN-1710706611795)]
  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值