自检:前端知识清单——语法和API

前言

题目来自ConardLi的blog
写的是自己的题解,水平有限,所以仅供参考
代码会整合在github,觉得有帮助就给个star吧~

正文

一、Javascript基础

语法和API

1、理解ECMAScript和JavaScript的关系

ECMAScript是JavaScript的规范,JavaScript是ECMAscript的体现

2、熟练运用es5、es6提供的语法规范

ES6:

  • spread展开符
  • 模块化
  • 箭头函数
  • 函数参数默认值
  • 模板字符串
  • 解构赋值
  • 对象属性简写
  • Promise
  • let const
    • const声明一个对象,能不能修改对象的属性?
      答案是可以的,因为用const只是保证对象的指针不可以改变,只想地址的内容是可以改变的。
    • 如果要让const声明对象的属性也不可修改,怎么实现?
      要实现真正的不可被修改的对象常量,首先我们要实现三个点:
      1、对象属性不能被修改
      2、对象属性不能增加
      3、对象属性不能被删除

不能被增加,我们可以用Object.preventExtensions来实现
不能被增加和删除,我们可以用Object.seal来实现
不能被修改,我们可以用Object.freeze来实现,但是Object.freeze只能作用一层,我们需要通过递归调用

ES7:
Array.prototype.includes()

const arry = ['xiaoMing','xiaoHong','xiaoLan']
arry.includes('xiaoMing')   //true

指数操作符
**

console.log(Math.pow(2,10))  //1024
console.log(2**10)  //1024

ES8:

  • async await
  • Object.values()
const values=Object.values(obj1);
console.log(values);//[1, 2, 3]
  • Object.entries()
for(let [key,value] of Object.entries(obj1)){
    console.log(`key: ${key} value:${value}`)
}
//key:a value:1
//key:b value:2
//key:c value:3
  • Object.getOwnPropertyDescriptors()
    返回obj对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。
const obj = {
    name: 'Jine',
    get age() { return '18' }
};
Object.getOwnPropertyDescriptors(obj)

3.熟练掌握JavaScript提供的全局对象(例如Date、Math)、全局函数(例如decodeURI、isNaN)、全局属性(例如Infinity、undefined)

全局对象:

  • Array
  • Boolean
  • Math
  • Number
  • String
  • RegExp

全局函数:

  • decodeURI()
  • decodeURIComponent()
  • encodeURI()
  • encodeURIComponent()
  • escape()
  • eval()
  • isFinite()
  • isNaN()
  • Number()
  • parseFloat()
  • parseInt()
  • String()
  • unescape()

全局属性:

  • NaN
  • undefined
  • Infinity

4、熟练应用map、reduce、filter 等高阶函数解决问题

  • map
    map返回一个数组,接受两个参数,第一个是回调函数,第二个是执行回调函数时用的this值,map遍历数组的每个值来做一些改变,再返回整个数组。

map实现

const arr = [1, 2, 3, 4]

arr.push(5)

Array.prototype.selfMap = function (callback, context) {
    let arry = Array.prototype.slice.call(this)
    let mapArry = Array()
    for (let i = 0; i < arry.length; i++) {
        if (!arry.hasOwnProperty(i)) {
            continue
        }
        mapArry[i] = callback.call(context, arry[i], i, this)
    }
    return mapArry
}

const result = arr.selfMap(value => value + 1)

  • filter
    filter返回一个数组,接受的参数是一个回调函数,filter遍历数组的每一个值,当数组的值在你在filter里面的规则对应为true时,返回该数组上的值,否则不返回。
const arry = [1, 2, 3, 4]

arry.push(5)

Array.prototype.selfFilter = function (callback, context) {
    let filterArry = Array()
    let arry = Array.prototype.slice.call(this)
    for (let i = 0; i < arry.length; i++) {
        if (!arry.hasOwnProperty(i)) {
            continue
        } else {
            callback.call(context, arry[i], i, this) ? filterArry.push(arry[i]) : filterArry.push()
        }
    }
    return filterArry
}

const result = arry.selfFilter(value => value % 2 === 0)
  • reduce

reduce接受两个参数,一个是回调函数,另一个是初始值。

const finalVal = oldArray.reduce((accumulator, currentValue, currentIndex, array) => {
  ...
}, initalValue)

reduce实现

const arry = [1, 2, 3, 4]

Array.prototype.selfReduce = function (callback, initialValue) {
    let arr = Array.prototype.slice.call(this)
    let res
    let startIndex
    if (initialValue === undefined) {
        for (let i = 0; i < arr.length; i++) {
            if (!arr.hasOwnProperty(i)) {
                continue
            } else {
                startIndex = i
                res = arr[i]
                break
            }
        }
    } else {
        res = initialValue
    }
    for (let i = ++startIndex || 0; i < arr.length; i++) {
        if (!arr.hasOwnProperty(i)) {
            continue
        } else {
            res = fn.call(null, res, arr[i], i, this)
        }
        return res
    }
}

5、setInterval需要注意的点,使用setTimeout实现setInterval

  • setTimeout():当方法执行完成定时器就立即停止(但是定时器还在,只不过没用了);
  • setInterval():当方法执行完成,定时器并没有停止,以后每隔[interval]这么长的时间都会重新的执行对应的方法[function],直到我们手动清除定时器为止

关于setInterval容易造成内存泄漏的说法,是由于使用者没有清除计时器造成的,setInterval不背这个锅。

实现setInterval

const mySetInterval = (cb, time) => {
    const fn = () => {
        cb() // 执行传入的回调函数
        setTimeout(() => {
            fn() // 递归调用自己
        }, time)
    }
    setTimeout(fn, time)
}

mySetInterval(() => {
    console.log(new Date())
}, 1000)

6、JavaScript提供的正则表达式API、可以使用正则表达式(邮箱校验、URL解析、去重等)解决常见问题

API:

  • String search
    输出index值

  • String match
    输出一个数组,包括匹配的参数,匹配的index值,以及输入的字符串
    当正则没有g时,使用match返回的信息比较多。但是有g后,就没有关键的信息index了。

  • String replace
    把"2,3,5",变成"5=2+3":

const result = "2,3,5".replace(/(\d+),(\d+),(\d+)/, "$3=$1+$2")
console.log(result)
  • String split
    它可以有第二个参数,表示结果数组的最大长度
    正则使用分组时,结果数组中是包含分隔符的

  • RegExp test
    返回true false

  • RegExp exec
    输出一个数组,包括匹配的参数,匹配的index值,以及输入的字符串
    exec方法能接着上一次匹配后继续匹配

解决常见问题:
暂时不会

7、JavaScript异常处理的方式,统一的异常处理方案

  • try catch
  • promise catch
  • window.onerror
  • window.onunhandledrejection
    window.onunhandledrejection 与 window.onerror 类似,在一个JavaScript Promise 被 reject 但是没有 catch 来捕捉这个 reject时触发。并且同时捕获到一些关于异常的信息。
  • window.rejectionhandled
    因为 Promise 可以延后调用 catch 方法,若在抛出 reject 时未调用 catch 进行捕捉,但稍后再次调用 catch,此时会触发 rejectionhandled 事件。

统一异常处理:
toast,alert

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容