棘手的JavaScript面试题
1、意外的全局变量
在以下代码中,typeof a 和 typeof b的值分别是什么:
function foo() { let a = b = 0; a++; return a; } foo(); typeof a; // => ???typeof b; // => ???
答案:让我们仔细看看第2行:let a = b = 0
。这个语句确实声明了一个局部变量a
。但是,它也声明了一个全局变量b。
注:b
是一个偶然创建的全局变量。
在浏览器中,上述代码相当于:
function foo() { let a; window.b = 0; a = window.b; a++; return a; } foo(); typeof a; // => 'undefined' typeof window.b; // => 'number'
typeof a
是 'undefined'。变量a
仅在 foo()
范围内声明,在外部范围内不可用。
typeof b
等于'number'。b
是一个值为 0
的全局变量。
2、鹰眼测试
numbers 数组内容是什么:
const length = 4; const numbers = []; for (var i = 0; i < length; i++);{ numbers.push(i + 1); } numbers; // => ???
答案:上述代码中,我们可以清晰的看到 花括号 { 左侧的分号 ;,而它创建了一个空语句,空语句是不做任何事情的。
所以 for循坏执行了4次,仅仅是改变了 i 的值。
也就是:
const length = 4; const numbers = []; var i; for (i = 0; i < length; i++) { // does nothing } { // a simple block numbers.push(i + 1); } numbers; // => [5]
for()
递增变量i
直到4
。然后JavaScript 进入代码块 { numbers.push(i + 1); }
,将4 + 1
添加到numbers
数组中。
这样 numbers
就是 [5]。
3、自动插入分号
arrayFromValue()
返回什么值?
function arrayFromValue(item) { return [item]; } arrayFromValue(10); // => ???
答案:很容易忽略关键词 return 和 表达式[item]之间的换行;
换行使JavaScript自动在 return
和[items]
表达式之间插入一个分号。
即:
function arrayFromValue(item) { return; [items]; } arrayFromValue(10); // => undefined
函数中的 return;
导致它返回 undefined
。
因此 arrayFromValue(10)
的值是 undefined 。
查看 https://dmitripavlutin.com/7-tips-to-handle-undefined-in-javascript/#24-function-return-value 阅读更多关于自动插入分号的内容。
4、闭包
下面脚本会在控制台输出什么:
let i; for (i = 0; i < 3; i++) { const log = () => { console.log(i);
} setTimeout(log, 100); }
答案:
我第一次做的时候,答案是 0,1和2,后来控制台调试发现是错的。
执行这个代码段分两个步骤。
步骤 1
1、for()
迭代3次。在每次迭代过程中,都会创建一个新的函数log()
,它捕获变量 i
。然后setTimout()
执行log()
。
2、当for()
循环完成时,i
变量的值为3
。
log()
是一个捕获变量 i
的闭包,它在for()
循环的外部作用域定义。重要的是要理解闭包从词法上捕获了变量 i
。
步骤 2
第2步在 100 毫秒后发生:
setTimeout()
调用了队列中的3个log()
回调。log()
读取变量 i
的当前值,即3
,并记录到控制台3
。
这就是为什么控制台输出3
, 3
和3
。
5、浮点数问题
等号判断的结果是什么:
0.1 + 0.2 === 0.3 // => ???
答案:首先我们看一下 0.1+0.2的值
0.1
和 0.2
的和 不完全等于 0.3
,而是略大于 0.3
。
由于浮点数在二进制中的编码机制,像浮点数的加法这样的操作会受到舍入误差的影响。
简单地说,直接比较浮点数是不精确的。
因此 0.1 + 0.2 === 0.3
是 false。
更多示例:
6、变量的提升
原文地址:https://www.cnblogs.com/shenyi/p/11933970.html
- 学界 | OpenAI 发布稀疏计算内核,更宽更深的网络,一样的计算开销
- 【手把手教你做项目】自然语言处理:单词抽取/统计
- Kaggle赛题解析:逻辑回归预测模型实现
- R语言 使用BP神经网络进行银行客户信用评估
- 使用R语言挖掘QQ群聊天记录
- 解析滴滴算法大赛---GBDT进行数据预测
- 数据迁移中的数据库检查和建议(r2笔记71天)
- 决策树案例:基于python的商品购买能力预测系统
- 数据迁移前的准备和系统检查 (r2笔记70天)
- 数据处理的统计学习(scikit-learn教程)
- 机器学习实战,使用朴素贝叶斯来做情感分析
- Python NLTK 处理原始文本
- 通过闪回事务查看数据dml的情况 (r2笔记69天)
- 通过shell和sql结合查找性能sql(r2笔记68天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法