前端必会的Javascript经典面试题
这是前端最基础的问题,也是在面试中难倒无数同学的经典问题
01. Javascript 数据类型
Javascript 数据类型 = 基本类型 + 引用类型
ES6 之前 5 + 1 = 6 种
ES6 之后 6 + 1 = 7 种
注:基本类型共6种:Number 数值型, String 字符型, Boolean 布尔型, Null 空, Undefind 未定义, Symbol 符号型, 其中Symbol是ES6新增的。
引用类型只有1种:Object 对象,注意:Function 和 Array 都继承于Object。
02. Javascript 类型判断
Javascript 类型判断主要有三种方法
① typeof
最大的问题是判断数组和null等数据类型时,无法获得预期的结果。
② instanceof
用于判断引用类型的继承关系,如:判断Function是否继承于object
最大的问题是不支持基本类型判断
③ Object.prototype.toString.call()
类型判断的最佳实践,使用Object原型上的toString方法,这种方法可以精确的判断各种数据类型。
03. Javascript 函数调用
① 直接调用
function test(msg) {
console.log(msg)
}
test ('Hello word !')
这种方法最为常用,使用括号即可调用函数。
② 方法调用
const f = {
a: 1,
b(){ console.log(this.a) }
}
f.b() // 1
当函数被保存为对象的一个属性时,称为方法。当它被调用时this将绑定到该对象。
③ 构造函数调用
function test() {
this.a = 1
}
const o = new test()
console.log(o.a) // 1
当使用new来调用函数时,会创建一个新对象,函数内部的this会绑定到新对象。
④ call 和 apply 调用
Object.prototype.toString.call({}) // [object Object]
Object.prototype.toString.apply([]) // [object Array]
函数也是一个对象,可以拥有方法,call 和 apply 就是函数的方法,任何函数都包含call 和 apply这两个方法,调用它们可以执行函数并改变this的指向。
04. Javascript 函数调用 bind call 和 apply 的区别
① bind
function test() {
// this默认指向window
console.log(this.a)
}
test.bind({a: 1}) // 返回一个新函数
bind 的作用是改变函数的 this 指向,通过 bind 将 this 绑定到新对象,并返回一个新的函数。
② call
function test(b,c) {
console.log(this.a, b, c)
}
test.call({a: 1}, 2, 3) // 1 2 3
call 的作用是执行函数并改变this指向,既然是执行函数,所以需要传入执行参数,call传参的方式是依次传入,用逗号分隔。
③ apply
function test(b,c) {
console.log(this.a, b, c)
}
test.apply({a: 1}, [2, 3]) // 1 2 3
apply 的作用和 call 类似,只是 传参方式不同, apply 将参数全部放置到一个数组当中。
05. Javascript 变量提升
① 基本概念:变量可以后定义先使用。
a = 2
console.log(a) // 2
var a = 1
console.log(a) // 1
如 后定义了变量 a,但可以在之前使用,是因为变量 a 的定义过程被提前了。
② 函数同样支持变量提升,可以使用后定义的提升
test() // 123
function test() {
console.log('123)
}
注意:字面量定义的函数不支持变量提升
test() // error:test is not a function
var test = function() {
console.log('123)
}
因为 test 变量会进行提升,并且默认值为 undefined。只有执行到赋值语句时,test 才会 变成一个函数。
06. Javascript 作用域
主要分三种,常用的是全局作用域和函数作用域
① 全局作用域
var a = 123
function test() {
console.log(a)
}
test() // 123
全局作用域的变量,在函数中是可以被访问的,是因为作用域链在起作用,函数内部查找作用域没有找到变量 a 后,会到它的父级作用域,即全局作用域去查找。
② 函数作用域
function test() {
var a = 123
}
console.log(a) // undefined
函数作用域的变量,在全局作用域中是无法被访问的,要解决这个问题要通过闭包。
解决方法:
function test() {
var a = 123
return function() {
return {
a
}
}
}
console.log(test()().a) // 123
在函数中返回一个函数会形成一个闭包,通过闭包我们可以访问到函数作用域下的变量。
07. Javascript 异常处理
分为被动触发和主动抛出
① // Uncaught ReferenceError: a is not defined
console.log(a)
上面的代码由于没有定义变量 a , 所以会触发未定义错误,属于被动触发。
② // Uncaught Error: crash
throw new Error('crash')
主动抛出需要使用 throw 关键字,后面需要实例化一个 Error 对象。
③ 如果希望主动捕获异常,可以通过 try catch ,
try {
console.log(a)
} catch(err) {
console.error(err)
}
通过 try 捕获异常,catch 处理异常。
08. Javascript 原型
术语:1. 实例(对象):通过构造函数创建出来的对象叫做实例(对象) 注:实例对象可以有多个
2. 实例化:构造函数创建出来的对象过程
3. 成员:对象的属性和方法的一个统称
一. prototype
① 任何一个函数都有 prototype 属性
function Person() {} // 构造函数
console.dir(Person) // ƒ Person() > prototype: {constructor: ƒ}
② 函数的 prototype 属性值是一个对象,这个对象叫做原型 (或叫做原型对象)
function Person() {} // Person 是函数也是一个对象
console.log(Person.prototype) // {constructor: ƒ} // 这个就是原形对象
③ 作用:通过构造函数创建的实例对象 可以直接访问这个构造函数的 prototype 属性 上的任意成员。
p 原型
function Person() {}
console.log(Person.prototype) // 原型对象
var p = new Person() // 这就是通过构造函数创建的实例对象
// 现在给原型对象添加 .color 属性 值为 lime
o.fn() // 1
该案例中共定义了 3 个 a ,从直觉上来说 o.fn 函数执行后,应该获取 o.a ,即打印 2 ,但实际结果打印了 1 ,是因为 test 创建于全局,所以它的 this 仍然指向 window ,这与它的调用环境无关。
前端必会的Javascript经典面试题的更多相关文章
- JavaScript经典面试题(二)
前言: 近年来T行业就业者越来越多,有关于编程行业的高薪工作也变得越来越难找,竞争力越来越大,想要在众多的应聘者当中脱颖而出,面试题和笔试题一定要多加研究和琢磨,以下记录的是自己的面试过程之中遇到的一 ...
- 20道JavaScript经典面试题
该篇文章整理了一些前端经典面试题,附带详解,涉及到JavaScript多方面知识点,满满都是干货-建议收藏阅读 前言 如果这篇文章有帮助到你,️关注+点赞️鼓励一下作者,文章公众号首发,关注 前端南玖 ...
- 前端javaScript经典面试题
1.alert(1&&2),alert(1||0) alert(1&&2)的结果是2 只要“&&”前面是false,无论“&&”后面是t ...
- javascript经典面试题之for循环click
经典重现 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf- ...
- JavaScript经典面试题系列
1.javascript的typeof返回哪些数据类型 Object number function boolean underfind 2.例举3种强制类型转换和2种隐式类型转换? 强制(parse ...
- JavaScript经典作用域问题(转载)
题目 var a = 10; function test(){ a = 100; console.log(a); console.log(this.a); var a; console.log(a); ...
- 15分钟带你了解前端工程师必知的javascript设计模式(附详细思维导图和源码)
15分钟带你了解前端工程师必知的javascript设计模式(附详细思维导图和源码) 前言 设计模式是一个程序员进阶高级的必备技巧,也是评判一个工程师工作经验和能力的试金石.设计模式是程序员多年工作经 ...
- web前端经典面试题大全及答案
阅读目录 JavaScript部分 JQurey部分 HTML/CSS部分 正则表达式 开发及性能优化部分 本篇收录了一些面试中经常会遇到的经典面试题以及自己面试过程中遇到的一些问题,并且都给出了我在 ...
- 2018 BAT最新《前端必考面试题》
2018 BAT最新<前端必考面试题> 1.Doctype作用? 严格模式与混杂模式如何区分?它们有何意义? (1). 声明位于文档中的最前面,处于 标签之前.告知浏览器的解析器,用什么文 ...
随机推荐
- 回顾games101中的SSAA和MSAA
回顾games101中的AA(抗锯齿) 前言 善于进行课后总结,可以更加巩固自己的知识和具体细节 锯齿(走样)产生的原因 本质上,在光栅化阶段中,用有限离散的数据想表示连续的(类似三角形的某一边),就 ...
- jmeter实际场景应用之测试上传excel文件
日常工作上测试的时候,会有一些场景是导入/上传文件.我们系统多是excel文件,这里就用excel文件为例,详述一下此次测试遇到的坑.最终结果是成功的,请看到最后! 1.获取接口的一些参数信息 先按F ...
- Dubbo | Dubbo快速上手笔记 - 环境与配置
目录 前言 1. Dubbo相关概念 1.1 自动服务发现工作原理 2. 启动文件 2.1 zookeeper-3.4.11\bin\zkServer.cmd 2.2 zookeeper-3.4.11 ...
- Qt5中用QLCDNumber显示时间
编程中经常要用到时间的显示,因此在这总结一下在Qt中如何显示时间.废话不多说,直接上代码,简单明了,一看就懂~~ mydialog.h 文件 #ifndef MYDIALOG_H #define MY ...
- vue 引用省市区三级联动(element-ui Cascader)
npm 下载 npm install element-china-area-data -S main.js import {provinceAndCityData,regionData,provinc ...
- Python之requests模块-大文件分片上传
最近在做接口测试时,拿到一个分片上传文件的接口,http接口请求头中的Content-Type为multipart/form-data.需要在客户端将大文件分片成数据块后,依次传给服务端,由服务端还原 ...
- Leetcode 146. LRU 缓存机制
前言 缓存是一种提高数据读取性能的技术,在计算机中cpu和主内存之间读取数据存在差异,CPU和主内存之间有CPU缓存,而且在内存和硬盘有内存缓存.当主存容量远大于CPU缓存,或磁盘容量远大于主存时,哪 ...
- 安装或更新时,pip出错,“No module named ‘pip’”
解决办法: 在pycharm终端(Terminal)中 首先执行 :python -m ensurepip 然后执行 :python -m pip install --upgrade pip
- JDK 1.7 正式发布,Oracle 官宣免费提供!“新版任你发,我用JDK 8”或成历史?
Oracle公司JDK 17正式发布,JDK 17属于长期支持(LTS)版本,也就是获得8年的技术支持,自2021年9月至2029年9月截止. JDK 17版本更新了很多比较实用的新特性,关于此版本的 ...
- 【第十一篇】- Git Gitee之Spring Cloud直播商城 b2b2c电子商务技术总结
Git Gitee 大家都知道国内访问 Github 速度比较慢,很影响我们的使用. 如果你希望体验到 Git 飞一般的速度,可以使用国内的 Git 托管服务--Gitee(gitee.com). G ...