前端必会的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). 声明位于文档中的最前面,处于 标签之前.告知浏览器的解析器,用什么文 ...
随机推荐
- 使用Visual Studio分析dump
最近系统是不是CPU会飙升的百分之九十多甚至百分百,在本地又很难复现问题,无法定位问题出现在哪. 可以用转储文件来保存现场,然后通过分析dump文件可以大概分析出问题的所在 生成转存文件 在CPU飙升 ...
- Error establishing a database connection!
后来发现在 wp-config.php 有个 debug 的参数,打开这个参数,修改为: define('WP_DEBUG','true'); 修改这个后,非常不错,报了很多错,一堆.... 使用 ...
- 安装配置Linux Squid代理服务器
1.代理服务器的工作机制 代理服务器的工作机制像生活中的代理商,假设自己的机器为A,想获得的数据由服务器B提供,代理服务器为C,那么连接过程是,A需要B的数据,并直接和C连接:C接受到A的数据请求之后 ...
- GitHub+JSDelivr+PicGo+Typora免费白嫖高速稳定图床
0. 初衷1. 创建 GitHub 仓库2. 使用 jsDelivr 进行 CDN 加速3. 使用PicGo上传图片4. Typora 配置 PicGo 上传 0. 初衷 平时写文章,经常需要插入图片 ...
- MySQL——InnoDB事务
事务:全部成功 或 全部失败! ------------------------------------------------------------------------------------ ...
- windows/linux 页面编码区别导致 python 乱码
http://blog.csdn.net/haiross/article/details/36189103 可以先看下这篇文章..写的比较用心和详细并且高深..我只是记流水账的. 直到今天我才注意到 ...
- ysoserial CommonsColletions5分析
我们知道,AnnotationInvocationHandler类在JDK8u71版本以后,官方对readobject进行了改写. 所以要挖掘出一条能替代的类BadAttributeValueExpE ...
- Vue个人博客关于标题自动打字机效果Typewriter
最近在写个人Blog 中间看过很多个人博客的开发 一大部分用的是Hexo框架或者vuePress框架 导入各种主题样式插件等等 但是看多了就会发现 很多博主的个人博客基本都很相似 并没有什么新东西呈现 ...
- 求 10000 以内 n 的阶乘
求 10000以内 n 的阶乘. 输入格式 只有一行输入,整数 n(0≤n≤10000) 输出格式 一行,即 n!的值. 输出时每行末尾的多余空格,不影响答案正确性 样例输入 100 样例输出 933 ...
- PHP中针对区域语言标记信息的操作
相信大家对 zh_CN 这个东西绝对不会陌生,不管是 PHP 中,还是在我们的网页上,都会见到它的身影.其实这就是指定我们的显示编码是什么国家或者地区的,使用何种语言.对于这种区域语言的标记来说,PH ...