var a = 0;let b = 0;const c = 0;if (true) { var a = 1; let b = 1; const c = 1;}console.log(a); // 1console.log(b); // 0console.log(c); // 0在条件块中 , 全局范围的var a已重新定义 , 但全局范围的let b和const c则没有 。一般而言 , 确保本地任务保持在本地执行 , 将使代码更加清晰 , 减少出错 。
6. 如果分配不带关键字的变量会发生什么?
如果不使用关键字定义变量 , 又会如何?从技术上讲 , 如果x尚未定义 , 则x = 1是window.x = 1的简写 。
要想完全杜绝这种简写 , 可以编写严格模式 , ——在ES5中介绍过——在文档顶部或特定函数中写use strict 。后 , 当你尝试声明没有关键字的变量时 , 你将收到一条报语法错误:Uncaught SyntaxError:Unexpected indentifier 。
7. 面向对象编程(OOP)和函数式编程(FP)之间的区别是什么?
JavaScript是一种多范式语言 , 即它支持多种不同的编程风格 , 包括事件驱动 , 函数和面向对象 。
编程范式各有不同 , 但在当代计算中 , 函数编程和面向对象编程最为流行 - 而JavaScript两种都可执行 。
面向对象编程
OOP以“对象”这一概念为基础的数据结构 , 包含数据字段(JavaScript称为类)和程序(JavaScript中的方法) 。
一些JavaScript的内置对象包括Math(用于random , max和sin等方法) , JSON(用于解析JSON数据)和原始数据类型 , 如String , Array , Number和Boolean 。
无论何时采用的内置方法 , 原型或类 , 本质上都在使用面向对象编程 。
函数编程
FP(函数编程)以“纯函数”的概念为基础 , 避免共享状态 , 可变数据和副作用 。这可能看起来像很多术语 , 但可能已经在代码中创建了许多纯函数 。
输入相同数据 , 纯函数总是返回相同的输出 。这种方式没有副作用:除了返回结果之外 , 例如登录控制台或修改外部变量等都不会发生 。
至于共享状态 , 这里有一个简单的例子 , 即使输入是相同的 , 状态仍可以改变函数的输出 。设置一个具有两个函数的代码:一个将数字加5 , 另一个将数字乘以5 。
const num = { val: 1};const add5 = () => num.val += 5;const multiply5 = () => num.val *= 5;如果先调用add5在调用乘以5 , 则整体结果为30 。但是如果以相反的方式执行函数并记录结果 , 则输出为10 , 与之前结果不一致 。
这违背了函数式编程的原理 , 因为函数的结果因Context调用方法而异 。重新编写上面的代码 , 以便结果更易预测:
const num = { val: 1};const add5 = () => Object.assign({}, num, {val: num.val + 5}); const multiply5 = () => Object.assign({}, num, {val: num.val * 5});现在 , num.val的值仍然为1 , 无论Context调用的方法如何 , add5(num)和multiply5(num)将始终输出相同的结果 。
8. 命令式和声明性编程之间有什么区别?
关于命令式编程和声明式编程的区别 , 可以以OOP(面向对象编程)和FP(函数式编程)为参考 。
这两种是描述多种不同编程范式共有特征的概括性术语 。FP(函数式编程)是声明性编程的一个范例 , 而OOP(面向对象编程)是命令式编程的一个范例 。
从基本的意义层面 , 命令式编程关注的是如何做某事 。它以最基本的方式阐明了步骤 , 并以for和while循环 , if和switch陈述句等为特征 。
const sumArray = array => { let result = 0; for (let i = 0; i < array.length; i++) { result += array[i] }; return result;}相比之下 , 声明性编程关注的是做什么 , 它通过依赖表达式将怎样做抽出来 。这通常会产生更简洁的代码 , 但是在规模上 , 由于透明度低 , 调试会更加困难 。
这是上述的sumArray()函数的声明方法 。
const sumArray = array => { return array.reduce((x, y) => x + y) };
![JavaScript九大面试问题集锦,助你顺利通关](http://img.jiangsulong.com/220420/0J92635T-4.jpg)
文章插图
图片来源:pexels.com/@rawpixel
9. 是什么基于原型的继承?
最后 , 要讲到的是基于原型的继承 。面向对象编程有几种不同的类型 , JavaScript使用的是基于原型的继承 。该系统通过使用现有对象作为原型 , 允许重复运行 。
推荐阅读
- 自己总结 给初中级JAVA准备的面试题,致竞争激烈的秋招面试
- JavaScript黑科技:实现一个AST解释器
- 你的博客用不着什么 JavaScript 框架
- 大学生|资深面试官坦言,毕业生有这些特点,不用看学历就会被拒之门外
- 基于canvas的JavaScript 二维码生成工具——QRCanvas
- 求职|聘多多上面试通过后,拒绝了offer没去上班,后面想去还能入职吗?
- 终于还是打开了这个可以学习JavaScript的教程
- 面试题-Mysql数据库优化之垂直分表
- 2020年常见Vue面试题
- 软件测试|3面支付宝!一个从业4年软件测试工程师面试结束后想说的