前端笔试遇到的坑-100题

1.闭包

let 形成闭包  var全局变量
function test() {for (var i = 0; i < 6; i++) {console.log(i);  //1 2 3 4 5 6// setTimeout(() => {//   console.log(i);// }, 0);   6 6 6 6 6 6 6}
}
test();var array = [];
for (var i = 0; i < 3; i++) {array.push(() => i);
}
var newArray = array.map((el) => el());
console.log(newArray); //[3,3,3]
 闭包的引用问题

2.W3C标准盒子模型和IE盒子模型的区别

 IE5.5及更早的版本使用的是IE盒模型。IE6及其以上的版本在标准兼容模式下使用的是W3C的盒模型标准。box-sizing属性可以切换盒模型模式,默认值是content-box,可选择有border-box、inherit。

  1. content-box:w3c标准盒模型。盒子实际大小取决于width+padding+border+margin
  2. border-box:IE盒模型,怪异盒模型。盒子实际大小取决于width+margin
  3. inherit:从父元素集成box-sizing属性的值

3.HTTP请求方法

get与post的区别

(1)post更安全(GET把参数包含在URL中,POST通过request body传递参数;get请求的数据会被缓存,如果两次传输的数据相同,第二次传输的数据时间大约为10ms;)

(2)post发送的数据更大(get有url长度限制)

(3)post能发送更多的数据类型(get只能发送ASCII字符)

(4)post比get慢。post在真正接收数据之前,会先将请求头发送给服务器进行确认,然后才真正发送数据。即tcp三次握手后服务器返回100 Continue响应,浏览器再发送数据,服务器返回200 OK响应。

(5)post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作,目的是资源的获取,读取数据

请求的方法

4.map

map的方法,set,get,has
let test = new Map();
test.set(3); //{3:undefined}
console.log(typeof null);  //Object
 Map对象和普通对象的7个区别

1、初始化与使用

普通对象可以直接使用字面量进行初始化,而 Map 需要 Map() 构造函数进行初始化,如果想要有初始值,则需要传递一个数组或其他元素为键值对的可迭代对象。

const obj = {name: 1,age: 2,
};const map = new Map([['name', 1],['age', 2],
]);

使用,各自拥有获取键值,设置键值,判断存在键值。但是Map拥有 size属性可以返回当前Map中key/value对的数量,而普通对象需要手动计算使用自己的方法Object.keys(obj).length。

2、key类型

普通对象只接受字符串和符号作为键值,其他类型将被强制转换为字符串类型,而 Map 可以接受任何类型的键值(包括函数、对象或任何原语)。

const obj = {};
const map = new Map();
const key = function () {};
obj[key] = 1;
map.set(key, 1);// { 'function () {}': 1 }
console.log('obj: ', obj);// Map(1) { [Function: key] => 1 }
console.log('map: ', map);

3、继承

 普通对象从原型继承了许多属性键,例如构造函数等。因此,自己的键值很可能与原型上的密钥发生冲突。但是 Map 默认不包含任何键

4、插入顺序

Map 元素的顺序遵循插入的顺序,而 Object 的则没有这一特性。

5、迭代

使用 for...of 语句或 Map.forEach 直接迭代 Map 的属性,而普通对象for...in 

6、序列化

普通对象支持 JSON 序列化,但 Map 默认无法获取正确数据。

7、性能

Map 对象在涉及频繁添加和删除键值对的场景中表现更好,而普通对象没有优化。

Map 和 WeakMap 区别

WeakMap是 ES6 中新增的一种集合类型,叫做“弱映射”。它和Map是兄弟关系,与Map的区别就在于这个弱字,API 还是Map的那套(只有set get has delete)。WeakMap 其实描述的是 JS 中垃圾回收程序对待“弱映射”中键的方式

1、WeakMap 的特性
WeakMap 只能将对象作为键名
WeakMap 的键名引用的对象是弱引用
WeakMap 不可遍历
2、Map 和 WeakMap 区别
Map 的键可以是任意类型,WeakMap 只接受对象作为键(null除外),不接受其他类型的值作为键
Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键; WeakMap 的键是弱引用,键所指向的对象可以被垃圾回收,此时键是无效的
Map 可以被遍历, WeakMap 不能被遍历
3、WeakMap 的使用场景
DOM 节点元数据
部署私有属性
数据缓存

5.时间

getDay() 返回的是星期几(0~6);获取4位数年份要用getFullYear() ;get Month() 返回的值是0~11。D正确

5.undefined情况

变量没赋值时默认值是undefined

函数默认的返回值也是undefined

不存在的数组元素或者对象属性也是undefined

6.typeof

let obj = { 1: 12, 2: 22 };
for (key in obj) {console.log(key);
}
let fun = function () {};
let arr = [];
console.log(typeof null);  //object
console.log(typeof fun); //function
console.log(typeof arr);//object
console.log(typeof {});//object
var x = typeof x; //x--undefined
var res = typeof typeof x; //string
// var res = typeof undefined;  //undefined
console.log(x, res);
console.log(typeof typeof 0);  //string

7.重排与回流

重排:重新计算元素的大小,重新渲染

回流:不用重新计算,只需重新渲染

减少重排与回流:动画用定位,添加类名或一次性直接修改样式,样式与html不进行深度嵌套

 8.定时器的回调

function fn() {console.log("111");
}
// setTimeout(() => {
//   fn();
// }, 0);
setTimeout(fn, 0);

8.promise

reject

promise中的reject函数返回值不一定会报错,传到catch中,需要看then函数中,有多少个回调函数,只有一个的话,就会报错,传到catch中,有两个的话,就会传到then的第二个回调函数的参数中。

var p1 = new Promise((res, rej) => {rej(1);
});
p1.then((value) => console.log("then的第一个回调函数res", value),(params) => console.log("then的第二个回调函数params", params)
).catch((err) => console.log("catch回调函数err", err));//then的第二个回调函数params 1
 Promise.all

Promise.all([ ])中,数组为空数组,则立即决议为成功执行resolve( );
Promise.race([ ])中数组为空数组,就不会执行,永远挂起,不会执行resolve( );

Promise.all

 Promise.race

如果希望在多个Promise对象同时执行时,只要有一个Promise对象的状态发生改变就中断执行,可以使用Promise.race()方法,该方法接收一个Promise数组作为参数,并返回一个新的Promise对象,当其中任何一个Promise对象被解决或拒绝时,就会将其对应的值或原因传递给返回的Promise对象的回调函数。我们可以在then回调函数中检查Promise对象的状态以及返回值,然后进行相应的处理。

Promise.race([promise1, promise2, promise3]).then(result => {console.log(result);}).catch(error => {console.error(error);});

 

 pedding fullfilled  reject

 

9.结构赋值,剩余参数...rest,参数数组arguments,对象属性简写

let [a, b, c, d, e] = "hello";
console.log(a, b, c, d, e);
//h e l l o

10.原型对象

 参考:JavaScript构造函数和原型、原型链及this指向_this.constructor_遥岑.的博客-CSDN博客

 原型对象  构造函数  对象

1.对象都会有一个属性__proto__指向构造函数的prototype原型对象

2.构造函数原型对象(prototype)里面都有一个constructor属性

  • 一般情况下,我们的公共属性定义在构造函数里面,公共的方法放在原型对象身上
  • 如果方法放在构造函数里面,创建实例时都会为这个方法单独再开辟一块内存空间来存放同一个函数,浪费内存
    解决方法:公共方法放在原型对象身上,这样所有实例可以共享方法

 疑惑点,对象如何访问构造函数的属性?原型对象如何获取对象的属性?

class Father {constructor(name, age) {this.name = name;this.age = age;}try = () => {console.log(this.games);};
}
Father.prototype.eat = function () {console.log(this.name + "会跑");
}; //原型对象添加方法
Father.prototype.games = "游戏人生";
let p1 = new Father("p1", 38);
p1.eat();  //p1会跑
p1.try();//游戏人生

 原型链
var Foo = (function () {var x = 0;function Foo() {}Foo.prototype.increment = function () {++x;console.log(x);};return Foo;
})();var a = new Foo();a.increment();
a.increment();
var b = new Foo();
b.increment();
//1 2 3

 最讨厌 这些new。。。,我都不知道创建了啥

new test.getName(); 

new test().getName(); 

new new test().getName(); 

function test() {getName = function () {Promise.resolve().then(() => console.log(0));console.log(1);};return this;
}
test.getName = function () {setTimeout(() => console.log(2), 0);console.log(3);
};
test.prototype.getName = function () {console.log(4);
};
var getName = function () {console.log(5);
};
function getName() {console.log(6);
}test.getName(); //3 2
console.log("-------");
getName(); //5
new test().getName(); //4
console.log("-------");
getName(); //1 0
console.log("-------");
new test.getName(); //3 2
new test().getName(); //4
new new test().getName(); //4

 11.css

 12.逻辑

console.log(2 < 3 || 3 < 2); //true
console.log(true || 1); //true
console.log(false || 2); //2
console.log(true && 3); //3
console.log(false && 4); //false
console.log(true || (false && false), (true && false) || true); //true  true

 13.js基础

console.log(1 + -+(+(+-+1))); //1
let arr = ["a", , "b", ,];
console.log(arr, arr.length); 
//[ 'a', <1 empty item>, 'b', <1 empty item> ] 4//length方法可以截断及清空数组,而不能操作字符串。
var str = "我非常喜欢编程";
str.length = 3; //我非常喜欢编程
str.length = 14; //我非常喜欢编程
console.log(str);
var test = [1, 2, 3, 4];
// test.length = 1; //1
test.length = 7; //[ 1, 2, 3, 4, <3 empty items> ]  
console.log(test);console.log("a" - 1);  //NaN
console.log("5" - 1);  //4function showCase(value) {switch (value) {case "A":console.log("Case A");break;case "B":console.log("Case B");break;case undefined:console.log("Case undefined");break;default:console.log("Case default");}
}
showCase(new String("A"));  //Case default
showCase(String("A"));  //Case A

14.数组

push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度

var a = [];                // [ ]
a.push(1, 2);        // [1,2]  数组末尾添加 1,2
a.shift(3, 4);      //  [ 2 ]   shift()会删除数组的第一个元素,里面写啥都没用
a.concat([5, 6]);  // [2]      拼接数组,会返回新的数组,这里没接收返回的新数组 ,a没变
a.splice(0, 1, 3);   //  [3]     删除下标为0的元素,同时替换为 2 

15.对象

// example 1
var a = {},b = "123",c = 123;
a[b] = "b";
a[c] = "c";
console.log(a[b]); //c
console.log(a);  //{ '123': 'c' }// example =2
var a = {},b = { key: "123" },c = { key: "456" };
a[b] = "b";
a[c] = "c";
console.log(a[b]);  //c
console.log(a); //{ '[object Object]': 'c' }// example =3
console.log(Function instanceof Object); //true
console.log(Object instanceof Function);  //true// example =4
var b = {age: 11,
};
var arr = [1, 2];
function test(a, y) {a[0] = 10;--y.age;
}
test(arr, b);
console.log(arr); //[ 10, 2 ]
console.log(b); //{ age: 10 }

16.深入理解this

call,bind,apply

  • apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。
  • call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。
  • bind除了返回函数以外,它的参数和call 一样。

call 与 apply 的相同点:

  • 方法的含义是一样的,即方法功能是一样的;
  • 第一个参数的作用是一样的;

call 与 apply 的不同点:两者传入的列表形式不一样

  • call可以传入多个参数;
  • apply只能传入两个参数,所以其第二个参数往往是作为数组形式传入
var x = 1;var obj = {x: 3,fun: function () {var x = 5;return this.x;},
};var fun = obj.fun;
console.log(obj.fun(), fun()); //3 undefined//非严格模式this为window,严格模式 undefined。node为严格模式// log1
let obj1 = {a: 1,foo: () => {console.log(this.a);},
};
obj1.foo();
const obj2 = obj1.foo; 
obj2();//undefined,调用者为window// log2
var obj = {a: 1,foo: function () {setTimeout(function () {console.log(this.a), 3000;});},
};
obj.foo(); //undefined,调用者为window
function fun() {return () => {return () => {return () => {console.log(this.name);};};};
}
var f = fun.call({ name: "foo" });
// 因为t1、t2、t3都是箭头函数,使用call()方法不能改变this指向,
// 作用域链上最近的this还是指向{name:‘foo’}。
var t1 = f.call({ name: "bar" })()(); //foo
var t2 = f().call({ name: "baz" })(); //foo
var t3 = f()().call({ name: "qux" }); //foofunction fun() {return function () {return function () {return function () {console.log(this.name);};};};
}
var f = fun.call({ name: "foo" });
var t1 = f.call({ name: "bar" })()(); //undefined
var t2 = f().call({ name: "baz" })(); //undefined
var t3 = f()().call({ name: "qux" }); //qux

 

 

     var name = "global";var obj = {name: "local",foo: function() {this.name = "foo";}.bind(window),};var bar = new obj.foo(); //{name:"foo";}setTimeout(function() {console.log("11", window.name); //global}, 0);console.log(bar.name); //foovar bar3 = (bar2 = bar);bar2.name = "foo2";console.log(bar3.name); //foo2

17.正则

var s = "12ab3cd",arr = s.split(/\d+/);
console.log(arr); //[ '', '', 'ab', 'cd' ]
//  arr = s.split(/\d+/); //[ '', 'ab', 'cd' ]

18.事件循环

setTimeout(() => {console.log(1);
}, 0);const P = new Promise((resolve, reject) => {console.log(2);setTimeout(() => {resolve(); //2 5 1 3  4console.log(3);}, 0);// resolve();  //2 5 4 1 3
});P.then(() => {console.log(4);
});
console.log(5);

19.作用域与预编译

var foo = "Hello";
(function () {var bar = " World";console.log(foo + bar); //Hello World
})();
console.log(foo + bar); //报错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Element UI 实战:跨页保存表格选中状态与判断状态可选性的高效方案

引言 在前文中&#xff0c;我们曾深入探讨了在修改数据后跨页时提醒用户可能丢失数据的问题。虽然这种方式对于一些场景是足够的&#xff0c;但当涉及选择框时&#xff0c;我们需要更为智能和高效的解决方案。在本文中&#xff0c;我们将分享一种基于 Element UI 的实际案例&am…

内模原理与控制

基于模型的控制方法&#xff1a; 把外部作用信号的动力学模型植入控制器来构成高精度反馈控制系统的设计原理。 内模原理&#xff08;IMP&#xff09;指的是&#xff0c;想要实现对R(s)的无差跟踪&#xff0c;系统的反馈回路中需要包含一个与外部输入R(s)相同的动力学模型。通…

2023-11-30 LeetCode每日一题(确定两个字符串是否接近)

2023-11-30每日一题 一、题目编号 1657. 确定两个字符串是否接近二、题目链接 点击跳转到题目位置 三、题目描述 如果可以使用以下操作从一个字符串得到另一个字符串&#xff0c;则认为两个字符串 接近 &#xff1a; 操作 1&#xff1a;交换任意两个 现有 字符。 例如&…

高并发架构——网页爬虫设计:如何下载千亿级网页?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 在互联网早期&#xff0c;网络爬虫仅仅应用在搜索引擎中。随着大数据时代的到来&#xff0c;数据存储和计算越来越廉价和高效&#xff0c;越来越多的企业开始利用网络爬虫来获取外部数据。例如&#xff1a;获取政府公…

力扣刷题-122买卖股票的最佳时机

题目要求如上&#xff0c;这里可以有两种解题思路&#xff0c;一种是利用动态规划去求解&#xff0c;一种是用贪心去求解。 首先看下动态规划的方法。 用动归去解决 动态规划最重要的就是要想出来递推公式&#xff08;这个真的很难&#xff09;&#xff0c;但是一旦想清楚递推…

VMware与Linux安装

VM与Linux安装 1、安装VMware ​ 这里安装Vm主要是为了安装Linux系统&#xff0c;除了相对云服务器&#xff0c;比较大众化的操作&#xff0c;当然更多的是熟悉Linux操作 1、Windows安装 ​ (1) 下载链接&#xff0c;目前版本上下载VM15的版本即可https://www.vmware.com/p…

阿里云服务器部署node和npm

目录 1.链接服务器2.找到node 下载地址3获取链接地址4下载到linux5.解压6.重命名 解压后的文件7.配置环境变量7.1复制当前的bin目录7.2vim /etc/profile7.3在按下ESC按键 8.重启环境变量9.输入node10.npm配置加速镜像 1.链接服务器 2.找到node 下载地址 https://nodejs.org/d…

CTO对生活和工作一点感悟

陌生人&#xff0c;你好啊。 感谢CSDN平台让我们有了隔空认识&#xff0c;交流的机会。 我是谁&#xff1f; 我呢&#xff0c;毕业快11年&#xff0c;在网易做了几年云计算&#xff0c;后来追风赶上了大数据的浪潮&#xff0c;再到后来混迹在AI、智能推荐等领域。 因为有一颗…

eNSP实验

前言 本文记录了使用eNSP进行组网&#xff0c;学习、巩固一些之前学的网络基础知识和协议。 一&#xff1a;同网段、网关互通 网络拓扑如下&#xff1a; AR1的配置&#xff1a; interface G0/0/0 ip address 192.168.10.1 24 PC1和PC2的配置(IP地址和网关设置) 最终实现PC1…

强芯铸魂,生态共赢!麒麟信安出席2023龙芯产品发布暨用户大会

11月28日&#xff0c;“到中流击水——2023龙芯产品发布暨用户大会”在北京国家会议中心隆重举办&#xff0c;会上发布新一代通用处理器龙芯3A6000、打印机主控芯片龙芯2P0500重磅成果。主管部门领导、专家学者、权威媒体等4000余人齐聚大会&#xff0c;麒麟信安作为龙芯合作伙…

【Linux学习】文件描述符重定向缓冲区

目录 九.文件描述符 9.1 文件描述符概念 9.2 文件描述符的分配规则 9.3 重定向 9.3.1 常见的重定向操作 9.3.2 重定向的原理 9.4 缓冲区 9.4.1 缓冲区概念 9.4.2 缓冲区刷新策略 9.4.3 C语言的缓冲区在哪里? 九.文件描述符 9.1 文件描述符概念 在上一篇讲到基础IO时,我们说到…

【C++】: unordered_map的使用

1、概念 key 键值的类型。unordered_map中的每个元素都是由其键值唯一标识的。 T 映射值的类型。unordered_map中的每个元素都用来存储一些数据作为其映射值。 Hash 一种一元函数对象类型&#xff0c;它接受一个key类型的对象作为参数&#xff0c;并根据该对象返回size_t类型…

Flask SocketIO 实现动态绘图

Flask-SocketIO 是基于 Flask 的一个扩展&#xff0c;用于简化在 Flask 应用中集成 WebSocket 功能。WebSocket 是一种在客户端和服务器之间实现实时双向通信的协议&#xff0c;常用于实现实时性要求较高的应用&#xff0c;如聊天应用、实时通知等&#xff0c;使得开发者可以更…

java系列:什么是SSH?什么是SSM?SSH框架和SSM框架的区别

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 什么是SSH&#xff1f;什么是SSM&#xff1f;SSH框架和SSM框架的区别 前言一、什么是SSH&#xff1f;1.1 Struts2具体工作流程&#xff1a;Struts2的缺点&#xff1a; 1.2 Sp…

【Linux】firewall防火墙配置-解决Zookeeper未授权访问漏洞

背景&#xff1a; zookeeper未授权访问漏洞&#xff0c;进行限制访问&#xff0c;采用防火墙访问策略 配置步骤&#xff1a; ##查看firewall配置清单 firewall-cmd --list-all ##查到为关闭态&#xff0c;启动防火墙 systemctl start firewalld ## 添加端口&#xff0c;这里…

Python入门06布尔值

目录 1 什么是布尔值2 怎么生成布尔值3 在控制程序中使用布尔值4 数据过滤、排序和其他高级操作总结 1 什么是布尔值 首先我们要学习一下布尔值的定义&#xff0c;布尔值是一种数据类型&#xff0c;它只有两个可能的值&#xff1a;True&#xff08;真&#xff09;或 False&…

rabbitmq消息队列实验

实验目的&#xff1a;实现异步通信 实验条件&#xff1a; 主机名 IP地址 组件 test1 20.0.0.10 rabbitmq服务 test2 20.0.0.20 rabbitmq服务 test3 20.0.0.30 rabbitmq服务 实验步骤&#xff1a; 1、安装rabbitmq服务 2、erlang进入命令行&#xff0c;查看版本 …

瑜伽学习零基础入门,各种瑜伽教学方法全集

一、教程描述 练习瑜伽的好处多多&#xff0c;能够保证平衡健康的身体基础&#xff0c;提升气质、塑造形体、陶冶情操&#xff0c;等等。本套教程是瑜伽的组合教程&#xff0c;共由33套视频教程组合而成&#xff0c;包含了塑身纤体&#xff0c;速效瘦身&#xff0c;四季养生&a…

双通道 H 桥 5V 4A驱动芯片

SS6951A 为电机一体化应用提供一种双通道集成电机驱动方案。SS6951A 有两路 H 桥驱动&#xff0c;每个 H 桥可提供最大峰值电流 4.0A&#xff0c;可驱动两个刷式直流电机&#xff0c;或者一个双极步进电机&#xff0c;或者螺线管或者其它感性负载。双极步进电机可以以整步、2 细…

字节大佬整理测试用例编写规范

目录 1.1目的 1.2使用范围 二 测试用例编写原则 2.1系统性 2.2连贯性 2.3全面性 2.4正确性 2.5符合正常业务惯例 2.6仿真性 2.7容错性&#xff08;健壮性&#xff09; 三 测试用例设计方法 3.1 等价类划分法&#xff1a; 3.2 边界值分析法&#xff1a; 3.3 因果图…