题
手写call
Function.prototype.myCall = function(target, ...args) {
target = (target === null || target === undefined) ? globalThis:Object(target);
let key = Symbol('this'); // 保证属性的唯一
// 属性不可被枚举
Object.defineProperty(target, key, {
enumerable: false,
value: this;
});
let result = target[key](...args);
delete target[key];
return result;
}
function sum(a,b) {
return a+b;
}
sum.myCall(null, 1, 1);
sum.myCall(undefined, 1, 3);
sum.myCall({}, 1,4);
sum.myCall(1, 1, 5);
手写bind
Function.prototype.myBind = function(target, ...orginArgs) {
let fn = this;
return function(..args) {
fn.call(target, ...orginArgs, ...args);
}
}
添加什么代码使let [a,b] = {a: 1, b:2};成立不报错
迭代器的考察
Object.prototype[Symbol.iterator] = function() {
return Object.values(this)[Symbol.iterator]();
}
let [a, b] = {a: 1, b: 2};
判断中等于的考察
let a = {
n: 1,
valueOf: function() {
return this.n++;
}
};
console.log(a===1 && a === 2 && a ===3); // 输出true
判断时
- 类型相同,值比较
- 类型不同
- 均为原始值,转为数字比较
- 一端原始值、一端对象 ,对象先调用valueOf,无法转为原始值,再调用toString
其他
获取元素大小
- clientHeight、clientwidth 元素大小,不包含滚动条、边框
- offsetWidth, offsetHeight 包含边框、滚动条
- scrollHeight, scrollWidth 包含滚动位置
- getBoundingClientRect() 获取包含元素的最小尺寸,包括放大缩小、旋转
知识盲区
- 浏览器在标签在非活动状态(切换到别的网页标签、缩小浏览器到任务栏),setInterval中时间如果小于1000则都会被按照1000执行,减少性能消耗
- onWheel,preventDefault 会报错 Unable to preventDefault inside passive event listener
ele.addEventListener('wheel', (e) => {
e.preventDefault();
}, {passive: true});
css相关
// 兄弟选择器
.item ~.b {}
// <input required /> 当input符合规则时的样式
input:valid {}