前端必会的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). 声明位于文档中的最前面,处于 标签之前.告知浏览器的解析器,用什么文 ...
随机推荐
- 你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?
JavaScript 中 Arguments 对象的用途总结. 前言 相信我们很多人在代码开发的过程中都使用到过一个特殊的对象 -- Arguments 对象. 在实际开发中,Arguments 对象 ...
- ES6 class——音乐播放器实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Hutool中那些常用的工具类和方法
Hutool中那些常用的工具类和方法 Hutool是一个Java工具包,它帮助我们简化每一行代码,避免重复造轮子.如果你有需要用到某些工具方法的时候,不妨在Hutool里面找找,可能就有.本文将对Hu ...
- 菜鸟入门Linux之路(方法论浅谈)
Linux是为人熟知的OS之王,已"统治"世界.要想学好绝非易事. 作为菜鸟,可以与Linux亲密接触的方法很多,如视频.书籍.各种企培资料等等,如今的在线教育也如火如荼. 总结说 ...
- Redis详解(二)——
https://www.cnblogs.com/yeya/p/14274948.html https://www.cnblogs.com/liang24/tag/redis/
- Python - 头部解析
背景 写 python 的时候,基本都要加两个头部注释,这到底有啥用呢? #!usr/bin/env python # -*- coding:utf-8 _*- print("hello-w ...
- Robot Framework(8)- Collections 测试库常用的关键字列表
如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html 前言 所有关键字 ...
- java版gRPC实战之一:用proto生成代码
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 【曹工杂谈】Maven底层容器Plexus Container的前世今生,一代芳华终落幕
Maven底层容器Plexus Container的前世今生,一代芳华终落幕 前言 说实话,我非常地纠结,大家平时只是用Maven,对于内部的实现其实也不关心,我现在非要拉着大家给大家讲.这就有个问题 ...
- JS009. 数组去重的多种方法总结与一步步优化
两层for循环 这种函数的优点是兼容性好比较通用,缺点是时空复杂度都很直观的为O(n2),不利于维护和性能. var array = [1,1,'1','1'] function unique(arr ...