Js前端面试题

1. Js的基本数据类型

  1. null
  2. undefined
  3. string
  4. symbol
  5. bigint
  6. boolean
  7. number
  8. object

Es6 新增了symbol和bigint两种类型,symbol一般常用可以结合redux的action的type进行使用;bigint是大数处理,一般除非项目中涉及到很大的数才会用到。

2. 数据类型检测的方式有哪些

  1. typeof , 但是在判断Array null为object
  2. instanceof , 通过prototype 判断构造函数
  3. construct,通过构造函数来判断
  4. Object.prototype.toString()

一般项目中常用的判断方式可能是使用typeof,typeof null === "object" 是一个历史遗留问题.

3 null 和 undefined 区别

两者都是基本数据类型
undefined 在 JavaScript 中不是一个保留字,这意味着可以使用 undefined 来作为一个变量名,但是这样的做法是非常危险的,它会 影响对 undefined 值的判断。我们可以通过一些方法获得安全的 undefined 值,比如说 void 0。

但是现在大多数浏览器应该是都无法使用undefined作为一个变量名。

5 intanceof 操作符的实现原理及实现

intanceof 是判断构造函数的prototype是否存在于对象的原型链上,一直找到Object.prototype.

知道了原理,实现就很简单了,就是无限循环递归

function myInstanceOf(left:object, right:object) {
  // Object.getPrototypeOf() 返回对象的原型
  const leftPrototype = Object.getPrototypeOf(left);
  const rightPrototype = right.prototype;
  while(leftPrototype) {
    if(leftPrototype === rightPrototype) return true;
    if(!rightPrototype) return false;
    leftPrototype = Object.getPrototypeOf(leftPrototype);
  }
  return fasle;
}

6 Object.is() 与比较操作符 “===”、“==” 的区别?

=== 判断两边类型和值都相等才返回true

== 会进行隐士类型转换,转换之后才判断,项目中不推荐==进行判断

Object.is() 基本上和===使用类似,这两者的区别在于如何判断+0和-0,以及NaN的处理

console.log(+0 === -0); //true
console.log(Object.is(+0, -0)); //false

console.log(NaN === NaN); // false
console.log(Object.is(NaN, NaN)); //true

console.log(Number.NaN === Number.NaN); // false
console.log(Object.is(Number.NaN, Number.NaN)); // true

console.log(NaN === Number.NaN); // false
console.log(Object.is(NaN, Number.NaN)); // true

7 什么是BigInt

JavaScript 中 Number.MAX_SAFE_INTEGER 表示最大安全数字,计算 结果是 9007199254740991,即在这个数范围内不会出现精度丢失(小 数除外)。

8 如何判断一个对象是一个空对象

function isEmptyObject(obj={}) {
  return Object.keys(obj).length > 0;
}
console.log(isEmptyObject({}));
console.log(isEmptyObject({'a':1}));

9 new 一个类的时候发生了什么?

  1. 创建一个对象
  2. 把该对象的proto指向类的原型
  3. 使用apply执行构造函数,如果返回是一个对象就返回,如果不是就返回刚才创建的对象。

10 Proxy 可以实现什么功能

在 Vue3.0 中通过 Proxy 来替换原本的 Object.defineProperty 来实现数据响应式。

之所以 Vue3.0 要使用 Proxy 替换原本的 API 原因在于 Proxy 无需一层层递归为每个属性添加代理,一次即可完成以上操作,性能上更好,并且原本的实现 有一些数据更新不能监听到,比如数组的push和pop等,但是 Proxy 可以完美监听到任何方式的数据改变,唯一缺陷就是浏览器的兼容性不好。

Proxy是Es6中添加的,基本使用如下:

const target1 = {
  message1: "hello",
  message2: "everyone"
};

const handler2 = {
  // target 原始对象,这里是指target1,prop传入的属性,receiv   // er表示是接受的对象,这里是handle2
  get(target, prop, receiver) {
    return "world";
  }
};

const proxy2 = new Proxy(target1, handler2);

11 Js 文件延迟加载方法有哪些?

  1. defer:js文件下载会和浏览器的解析同时执行,当浏览器解析完毕后,然后再执行js文件。
  2. async:js文件下载会和浏览器的解析同时执行,当js文件下载完毕后,会立即执行js文件。
  3. 如果没有defer和async,文件会立即下载和立即执行,并且会阻塞浏览器的解析。

12 ES6 模块与 CommonJS 模块的区别

相同点:
ES6和CommonJS都可以对引入的对象内部重新赋值

不同点:
CommonJS模块输出的是一个值的拷贝,ES6 模块输出的是值的引用;
也就是说ComonnJS是引用的一个值的拷贝,如果当我们引入之后,修改了原来文件的内容,我们引用的值不会改变,比如下面的例子,test.js中输出的值都是3,3

// lib.js
let counter = 3;
function incCounter() {
  counter++;
}
module.exports = {
  counter: counter,
  incCounter: incCounter,
};
// test.js
const mod = require("./lib");
console.log(mod.counter); // 3
mod.incCounter();
console.log(mod.counter); // 3

ES6是导入的引用,有点类似指针,所以当引入的文件内容改变后,会跟着改变。

可以看下下面的例子

// lib.js
export let counter = 3;
export function incCounter() {
  counter++;
}
// test.js
export let counter = 3;
export function incCounter() {
  counter++;
}

13 for...in 和 for...of 的区别

for...of 是 ES6 新增的遍历方式,允许遍历一个含有 iterator 接口 的数据结构(数组、对象等)并且返回各项的值

for...in 主要是遍历对象,并且会沿着原型链向上查找

for... in 遍历数组的时候,返回的是数组下标
for... of 遍历数组的时候,返回的是数组的值

例子如下:

Object.prototype.objCustom = function() {};
Array.prototype.arrCustom = function() {};

const iterable = [3, 5, 7];
iterable.foo = 'hello';

for (const i in iterable) {
// logs "0", "1", "2", "foo", "arrCust  om", "objCustom"
  console.log(i); 
}

for (const i in iterable) {
  if (Object.hasOwn(iterable, i)) {
    // logs "0", "1", "2", "foo"
    console.log(i); 
  }
}

for (const i of iterable) {
  // logs 3, 5, 7
  console.log(i); 
}

for...of 不能遍历对象,如果想要遍历对象,可以使用如下代码

const obj = {
  a: 1,
  b: 2,
};
for (let [key, value] of Object.entries(obj)) {
  console.log(key, value);
}

14 原型和原型链的经典图

15 this的理解

  1. 当一个函数不是一个对象的属性时,直接作为函数来调用时,this 指向全局对象。
  2. 如果一个函数作为一个对象的方法来调用时, this 指向这个对象。
  3. 如果一个函数用 new 调用时,函数执行 前会新创建一个对象,this 指向这个新创建的对象。
  4. apply 、 call 和 bind 调用模式, 这三个方法都可以显示的指定调用函数的 this 指向。其中 apply 方法接收两个参数: 一个是 this 绑定的对象,一个是参数数组。call 方法接收的参数, 第一个是 this 绑定的对象,后面的其余参数是传入函数执行的参数。 也就是说,在使用 call() 方法时,传递给函数的参数必须逐个列举出来。bind 方法通过传入一个对象,返回一个 this 绑定了传入对 象的新函数。这个函数的 this 指向除了使用 new 时会被改变,其 他情况下都不会改变。
  5. 箭头函数的this指向定义的时候,最外层的this

16 内存泄露的情况

  1. 全局变量
  2. 闭包
  3. dom元素的引用,当dom被删除后,引用没有清空。

本文由mdnice多平台发布

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

推荐阅读更多精彩内容

  • web前端面试题分为:html/css面试题、javascript面试题、vue面试题、性能优化面试题、网络方面面...
    终身成长人格阅读 10,836评论 0 3
  • 2022金三银四前端面试题预告 马上就到了面试季了,今天整理了一下前端常见的一些面试题。虽说面试的时候造火箭,需要...
    伯约同学阅读 534评论 0 15
  • 一、xue的生命周期是什么 vue每个组件都是独立的,,每个组件都有一个属于他的生命周期,从一个组件创建、数据初始...
    康娜阅读 826评论 0 0
  • 时间转换为相对时间 过滤器的使用 1. 定义一个时间过滤器, vue.filter('timefilter',fu...
    就是那么倔强阅读 376评论 0 1
  • html 1.1 html标签的类型(head, body,!Doctype) 他们的作用是什么 参考答案: !D...
    _Y_X_阅读 594评论 0 1