前端面试题-高频考点

1 typeof类型判断

  • typeof 是否能正确判断类型? instanceof 能正确判断对象的原理是什么
  • typeof 对于原始类型来说,除了 null 都可以显示正确的类型
typeof 1 // 'number'
typeof '1' // 'string'
typeof undefined // 'undefined'
typeof true // 'boolean'
typeof Symbol() // 'symbol'
  • typeof 对于对象来说,除了函数都会显示 object ,所以说 typeof 并不能准确判断变量到底是什么类型
typeof [] // 'object'
typeof {} // 'object'
typeof console.log // 'function'
  • 如果我们想判断⼀个对象的正确类型,这时候可以考虑使⽤ instanceof ,因为内部机制是通过原型链来判断的

const Person = function() {}
const p1 = new Person()
p1 instanceof Person // true
var str = 'hello world'
str instanceof String // false
var str1 = new String('hello world')
str1 instanceof String // true
  • 对于原始类型来说,你想直接通过 instanceof 来判断类型是不⾏的

2 类型转换

  • ⾸先我们要知道,在 JS 中类型转换只有三种情况,分别是:
    • 转换为布尔值
    • 转换为数字
    • 转换为字符串

转Boolean

  • 在条件判断时,除了 undefined , null , false , NaN , ‘’ ,0 , -0 ,其他所有值都转为 true ,包括所有对象

对象转原始类型

  • 对象在转换类型的时候,会调⽤内置的 [[ToPrimitive]] 函数,对于该函数来说,算法逻辑⼀般来说如下
  • 如果已经是原始类型了,那就不需要转换了
  • 调⽤ x.valueOf() ,如果转换为基础类型,就返回转换的值
  • 调⽤ x.toString() ,如果转换为基础类型,就返回转换的值
  • 如果都没有返回原始类型,就会报错
  • 当然你也可以重写 Symbol.toPrimitive ,该⽅法在转原始类型时调⽤优先级最⾼。

let a = {
valueOf() {
return 0
},
toString() {
return '1'
},
[Symbol.toPrimitive]() {
return 2
}
}
1 + a // => 3

四则运算符

  • 它有以下⼏个特点:
    • 运算中其中⼀⽅为字符串,那么就会把另⼀⽅也转换为字符串
    • 如果⼀⽅不是字符串或者数字,那么会将它转换为数字或者字符串
1 + '1' // '11'
true + true // 2
4 + [1,2,3] // "41,2,3"
  • 对于第⼀⾏代码来说,触发特点⼀,所以将数字 1 转换为字符串,得到结果 ‘11’
  • 对于第⼆⾏代码来说,触发特点⼆,所以将 true 转为数字 1
  • 对于第三⾏代码来说,触发特点⼆,所以将数组通过 toString 转为字符串 1,2,3 ,得到结果 41,2,3
  • 另外对于加法还需要注意这个表达式 ‘a’ + + ‘b’
'a' + + 'b' // -> "aNaN"
  • 因为 + ‘b’ 等于 NaN ,所以结果为 “aNaN” ,你可能也会在⼀些代码中看到过 +‘1’ 的形式来快速获取 number 类型。
  • 那么对于除了加法的运算符来说,只要其中⼀⽅是数字,那么另⼀⽅就会被转为数字
4 * '3' // 12
4 * [] // 0
4 * [1, 2] // NaN

⽐较运算符

  • 如果是对象,就通过 toPrimitive 转换对象
  • 如果是字符串,就通过 unicode 字符索引来⽐较
let a = {
valueOf() {
return 0
},
toString() {
return '1'
}
}
a > -1 // true
  • 在以上代码中,因为 a 是对象,所以会通过 valueOf 转换为原始类型再⽐较值。

3 This

  • 我们先来看⼏个函数调⽤的场景
function foo() {
console.log(this.a)
}
var a = 1
foo()
const obj = {
a: 2,
foo: foo
}
obj.foo()
const c = new foo()
  • 对于直接调⽤ foo 来说,不管 foo 函数被放在了什么地⽅, this ⼀定是 window
  • 对于 obj.foo() 来说,我们只需要记住,谁调⽤了函数,谁就是 this ,所以在这个场景下 foo 函数中的 this 就是 obj 对象
  • 对于 new 的⽅式来说, this 被永远绑定在了 c 上⾯,不会被任何⽅式改变 this
  • 说完了以上⼏种情况,其实很多代码中的 this 应该就没什么问题了,下⾯让我们看看箭头函数中的 this
function a() {
return () => {
return () => {
console.log(this)
}
}
}
console.log(a()()())
  • ⾸先箭头函数其实是没有 this 的,箭头函数中的 this 只取决包裹箭头函数的第⼀个普通函数的 this 。在这个例⼦中,因为包裹箭头函数的第⼀个普通函数是 a ,所以此时的 this 是 window 。另外对箭头函数使⽤ bind 这类函数是⽆效的。
  • 最后种情况也就是 bind 这些改变上下⽂的 API 了,对于这些函数来说, this 取决于第⼀个参数,如果第⼀个参数为空,那么就是 window 。
  • 那么说到 bind ,不知道⼤家是否考虑过,如果对⼀个函数进⾏多次 bind ,那么上下⽂会是什么呢?

let a = {}
let fn = function () { console.log(this) }
fn.bind().bind(a)() // => ?
  • 如果你认为输出结果是 a ,那么你就错了,其实我们可以把上述代码转换成另⼀种形式
// fn.bind().bind(a) 等于
let fn2 = function fn1() {
return function() {
return fn.apply()
}.apply(a)
}
fn2()
  • 可以从上述代码中发现,不管我们给函数 bind ⼏次, fn 中的 this 永远由第⼀次 bind 决定,所以结果永远是 window
let a = { name: 'poetries' }
function foo() {
console.log(this.name)
}
foo.bind(a)() // => 'poetries'
  • 以上就是 this 的规则了,但是可能会发⽣多个规则同时出现的情况,这时候不同的规则之间会根据优先级最⾼的来决定 this 最终指向哪⾥。
  • ⾸先, new 的⽅式优先级最⾼,接下来是 bind 这些函数,然后是obj.foo() 这种调⽤⽅式,最后是 foo 这种调⽤⽅式,同时,箭头函数的this ⼀旦被绑定,就不会再被任何⽅式所改变。

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

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

相关文章

手把手写深度学习(20):搭建LLM大语言模型的敏感词过滤系统

前言:随着Llama 2、通义千问7B等越来越多的大语言模型开源,开发者们可以基于这些开源的模型搭建自己的对话系统、Agent等。但是因为我们的国情,需要开发者对这些模型进行一些特殊的“安全性”考虑,保证与用户的交互不会出现“有害信息”。这篇博客手把手教大家搭建一个大语…

Camunda 7.x 系列【6】Spring Boot 集成 Camunda 7.19

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. Camunda Platform Run3. Spring Boot 版本兼容性4. 集成 Spring Boot5. 启动项目…

【Vue3】动态组件

动态组件的基本使用 动态组件(Dynamic Components)是一种在 Vue 中根据条件或用户输入来动态渲染不同组件的技术。 在 Vue 中使用动态组件,可以使用 元素,并通过 is 特性绑定一个组件的名称或组件对象。通过在父组件中改变 is 特…

vue 图片base64转化

import html2canvas from ‘html2canvas’ html2canvas(canvasDom, options).then(canvas > { //此时的图片是base64格式的,我们将图片格式转换一下 let type ‘png’; let imgData canvas.toDataURL(type); // 照片格式处理 let _fixType function(type) { …

2023牛客暑期多校训练营4

Bobo String Construction 结论,字符串哈希 Election of the King 二分查找 Merge the squares! 递归模拟,辗转相除法 Quest-ce Que Cest? DP,前缀和优化 We are the Lights 思维,倒推 猜测是,把n个字符全填0或者1是最…

亿发江西中小型制造企业信息化建设解决方案,2023数字化转型升级

实体经济在经济中的重要性愈发凸显,江西省作为制造业强省,要实现制造业经济高质量发展,信息技术与制造业的深度汇合是不可或缺的关键路径。在这个制造业转型升级的浪潮中,中小企业成为了江西省制造业转型的焦点。让我们深入探讨一…

Redis 7.X Linux 环境安装

Redis 简介 作为一名开发人员,想必大家对Redis一定是耳熟能详,因此在此只做简单介绍。 Remote Dictionary Server(远程字典服务)是完全开源的,使用ANSIC语言编写遵守BSD协议,是一个高性能的Key-Value内存数据库,它提…

分布式 - 服务器Nginx:一小时入门系列之HTTP反向代理

文章目录 1. 正向代理和反向代理2. 配置代理服务3. proxy_pass 命令解析4. 设置代理请求headers 1. 正向代理和反向代理 正向代理是客户端通过代理服务器访问互联网资源的方式。在这种情况下,客户端向代理服务器发送请求,代理服务器再向互联网上的服务器…

抖音seo矩阵系统源代码开发搭建技术分享

抖音SEO矩阵系统是一个较为复杂的系统,其开发和搭建需要掌握一定的技术。以下是一些技术分享: 技术分享 抖音SEO矩阵系统的源代码可以使用JAVA、Python、PHP等多种语言进行开发。其中,JAVA语言的应用较为广泛,因为JAVA语言有良好…

软件架构师思维塑造

一、软件系统设计的六项原则 1、单一职责原则(Single Responsibility Principle) 2、开闭原则(Open Closed Principle) 3、里氏替换原则(Liskov Substitution Principle) 4、迪米特法则(Law of …

无涯教程-Lua - nested语句函数

Lua编程语言允许在另一个循环中使用一个循环。以下部分显示了一些示例来说明这一概念。 nested loops - 语法 Lua中嵌套for循环语句的语法如下- for init,max/min value, increment dofor init,max/min value, incrementdostatement(s)endstatement(s) end Lua编程语言中的…

IMV3.0

经历了两个版本,基础内容在前面,可以使用之前的基础环境: v1: https://blog.csdn.net/wtt234/article/details/132139454 v2: https://blog.csdn.net/wtt234/article/details/132144907 一、代码组织结构 二、代码 2.…

下载网络文件到本地

文章目录 目录 前言 操作步骤 1.引入 2.读取出文件内容 3.筛选出URL 4.下载表情包 总结 前言 这里记录一次用代码下载网络文件的过程,以获取抖音表情包为例。 一、操作步骤 1.引入 首先抖音有网页版,用浏览器就可以观看,用户评论发布表情在…

Webpack5 core-js和babel-loader区别和用法

文章目录 core-js是什么,有什么用?为什么使用了babel-loader对js进行兼容性配置还需要core-js?core-js的具体用法总结 core-js是什么,有什么用? core-js是一个流行的JavaScript库,它提供了对新的JavaScript特性、API…

Rookit系列一 【隐藏网络端口】【支持Win7 x32/x64 ~ Win10 x32/x64】

文章目录 Rookit系列一 【隐藏网络端口】【支持Win7 x32/x64 ~ Win10 x32/x64】前言探究隐藏网络端口netstat分析隐藏网络端口的原理关键数据结构隐藏网络端口源码 效果演示 Rookit系列一 【隐藏网络端口】【支持Win7 x32/x64 ~ Win10 x32/x64】 前言 Rookit是个老生常谈的话…

大学python题库及答案解析,大学python程序设计题库

本篇文章给大家谈谈大学python题库及答案解析,以及python期末编程题及答案,希望对各位有所帮助,不要忘了收藏本站喔。 发表时间:2020-07-07 一、填空题(15分) 使用print()函数将多个字符串’How’、’are ’…

关于ETL的两种架构(ETL架构和ELT架构) qt

ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库&#xf…

Qt+C++实现灯带动画运动位置变换移动跑马灯图片轮播

程序示例精选 QtC实现灯带动画运动位置变换移动跑马灯图片轮播 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC实现灯带动画运动位置变换移动跑马灯图片轮播>>编写代码&…

线段树模板12

线段树 洛谷上有两道线段树模板&#xff08;指模板1&#xff0c;模板2&#xff09;都是区间维护的&#xff0c;也就是说&#xff0c;都离不开lasytag的维护&#xff0c;为了提高效率&#xff0c;故使用了lasytag,这里看一下题 【模板】线段树 1 题目描述 如题&#xff0c;已…

JavaScript--WebStorage

目录 WebStorage概述 WebStorage分类 注意&#xff1a; localStorage方法 介绍&#xff1a; 常见方法&#xff1a; 案例演示&#xff1a; sessionStorage方法 介绍&#xff1a; 常见方法&#xff1a; 案例演示&#xff1a; WebStorage概述 WebStorage是HTML5中…