几道前端p6笔试题

B. rel="noopener"

C. rel="noreferrer"

D. rel="opener"

E. rel="external"

F. rel="parent"

参考答案:BC

noopener 是最合适的属性,不过 noreferrer 同样也包含有 noopener 的功效,noreferrer noopener 同时加是多余的。

rel="opener" 是功能恰好相反的选项,因为其实除了 Chrome,最新版的 Safari 和 Firefox 已经都为 a 链接默认采用 noopener 模式了,真需要 opener 属性的时候可以使用 rel="opener" 开启。

其它的选项都是迷惑性选项,在浏览器中实际都没有任何作用。

3. ES6 里的 Proxy 被认为是个神器,利用它可以实现很多以前只有魔改 JS 引擎底层才能实现的效果,请找出下面是利用 Proxy 实现了的神奇效果:

A. 原型就是自己的对象 —— Object.getPrototypeOf(obj) === obj // true

B. 任意属性都存在的对象 —— "任意名字的属性" in obj // true

C. 任意值都是它的实例的对象,甚至 null 和 undefined —— undefined instanceof obj // true

D. 用 Object.prototype.toString() 检测出来的对象类型是 haha 的对象 —— Object.prototype.toString.call(obj) === "[object haha]" // true

E. 一元加后的值与加 0 后的值分别恒等于两个不同的数字 —— 比如 +obj 始终 === 1,但 obj + 0 始终等于=== 10

F. 亦假又亦真的对象 —— if (obj) {alert("执行不到")} 但 if (obj.length) {alert("能执行到")}

参考答案:AB

A: obj = new Proxy({}, {getPrototypeOf(){return obj}})

B: obj = new Proxy({}, {has(){return true}})

C: obj = {[Symbol.hasInstance](){return true}}

D: obj = {[Symbol.toStringTag]: "haha"}

E: obj = {[Symbol.toPrimitive](hint){return hint === "number" ? 1 : 10}}

F: document.all

C、D、E 是利用了 ES6 里 Well-Known Symbols 的魔力,不是 Proxy 的。F 是唯一的大奇葩 document.all

4. ES6 中首次对函数的 name 属性进行了标准化,而且为了方便在调用栈里看到具体的函数名,ES6 里还增加了函数名推断的功能。下面哪个选项中函数的 name 属性并不完全等于 foo ?

A. const foo = () => {}

{foo: function(){}}

C. {*foo(){}}

D. {[Symbol("foo")](){}}

E. class C {static get foo(){}}

F. {async foo(){}}

参考答案:DE

考查知识点:对 ES6 中函数 name 属性的了解。D 中 name 属性为 [foo] ,Symbol 类型的属性键需要加中括号,E 中 name 属性为 get foo,getter 和 setter 分别加 get 和 set 前缀。

5. 下面这些 Element 上的方法,有哪些是支持传入一个选择器作为参数的?

A. Element.prototype.querySelector()

B. Element.prototype.querySelectorAll()

C. Element.prototype.matches()

D. Element.prototype.closest()

E. Element.prototype.remove()

F. Element.prototype.contains()

参考答案:ABCD

考查知识点:原生的 remove() 方法和 jQuery 的不一样,只能删除自己,所以不支持传入选择器。contains() 方法也很容易被误认为支持选择器,比如 document.body.contains(".header > a") ,实际只支持传入节点。

编程题


1. JavaScript 采用原型继承,即一个对象继承自另外一个对象,另外一个对象再继承自别的对象,依此往复。请写一个通用的 JavaScript 函数,来找出某个对象身上的某个属性继承自哪个对象。

函数签名:

function findPrototypeByProperty(obj, propertyName){

// 请实现函数体

}

使用举例:

const foo = {a: 1}

const bar = Object.create(foo)

bar.b = 2

const baz = Object.create(bar)

baz.c = 3

console.log(findPrototypeByProperty(baz, “c”) === baz) // true

console.log(findPrototypeByProperty(baz, “b”) === bar) // true

console.log(findPrototypeByProperty(baz, “a”) === foo) // true

参考答案:

function findPrototypeByProperty(obj, propertyName) {

do {

if (obj.hasOwnProperty(propertyName)) {

return obj

}

} while (obj = Object.getPrototypeOf(obj))

}

2. URLSearchParams() 接口是用来解析和处理 URL 参数的 API,目前最新的浏览器和 Node 都支持它。请用 class URLSearchParams {} 语法实现一个该接口的 polyfill,考虑到时间因素,答题者只需实现下面列举的要求即可:

// 构造函数支持传入 URL 参数串

searchParams = new URLSearchParams(“foo=1&bar=2”)

// 构造函数也支持传入一个包含参数键值对的对象

searchParams = new URLSearchParams({foo: “1”, bar: “2”})

// 实例支持 get()、set()、has()、append() 四个方法

console.log(searchParams.get(“foo”)) // “1”

searchParams.set(“foo”, “10”)

console.log(searchParams.has(“bar”)) // true

searchParams.append(“foo”, “100”)

// 实例支持 toString() 方法

console.log(searchParams.toString()) // “foo=10&bar=2&foo=100”

// 实例支持 for-of 迭代

for(const [key, value] of searchParams) {

console.log([key, value])

// [“foo”, “10”]

// [“bar”, “2”]

// [“foo”, “100”]

}

参考答案:

考察学生对 URL 的认识以及对 class 语法、for-of 语法的熟悉程度,以下代码在 Chrome 74 中可用。实现逻辑不需要完全依照规范,能跑通题干中的要求即可。

class URLSearchParams {

#searchParams = []

constructor(init) {

if (typeof init === “string”) {

this.#searchParams = init.split(“&”).map(kv => kv.split(“=”))

} else {

this.#searchParams = Object.entries(init)

}

}

get(key) {

const param = this.#searchParams.find(param => param[0] === key)

return param && param[1]

}

set(key, value) {

const param = this.#searchParams.find(param => param[0] === key)

if (param) {

param[1] = value

} else {

this.#searchParams.push([key, value])

}

}

has(key) {

return this.#searchParams.some(param => param[0] === key)

}

append(key, value) {

this.#searchParams.push([key, value])

}

toString() {

最后

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

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

[外链图片转存中…(img-nhuuwr2B-1715834416778)]

[外链图片转存中…(img-LupG6gKe-1715834416778)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值