不容忽视的js面试题
1、全局变量和局部变量(变量提升和连等赋值问题)
(function() {
var a = b = 5;
})();
console.log(a);
console.log(b);
上面代码运行结果如下:

上面代码中声明了两个变量,a 使用关键字var声明的。代表它是一个局部变量。而b则是一个全局变量。调用在该作用域未声明的变量,是会报错的。而一个变量只声明,但未定义赋值的时候,才会是undefined。很明显,变量a在全局作用域未曾声明,并不存在,所以会报错!
首先连等操作符是从右向左赋值的,b = 5; var a = b; 变量a是用var进行声明并赋值的所以是局部变量, 变量b是未用var声明的变量在javscritp中是一个隐式全局变量。所以在外面consoloe.log(b) 是5, console.log(a) 报错 a is no defined.
2、数组求和
Array.prototype.sum = function () {
for (var sum = i = 0; i < this.length; i++)sum += parseInt(this[i]);
return sum ;
};
3、数组求最大值
Array.prototype.maxNum = function () {
for (var i = 0, maxValue = Number.MIN_VALUE; i < this.length; i++)parseInt(this[i]) > maxValue && (maxValue = this[i]);
return maxValue;
};
4、
var a = 100;
function test(){
var b = 2 * a;
var a = 200;
var c = a / 2;
console.log(b);
console.log(c);
}
test()
上面代码运行结果如下:

当全局变量和局部变量同名的时候,全局变量是不会主用于同名局部变量的作用域的。也就是说var a=100是不会作用于test这个函数中的。
引用:
1.全局变量和它的作用域
全局变量是指在程序开头的说明部分定义和说明的量。它的作用域分为两种情况:
(1)在全局变量和局部变量不同名时,其作用域是整个程序。
(2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。
2.局部变量和它的作用域
凡是在子程序内部使用的变量,必须在子程序中加入说明。这种在子程序内部说明的变量称为局部变量。局部变量的作用域是其所在的子程序。形式参数也只能在子程序中有效。因此也属于局部变量。局部变量的作用域分为两种情况:
(1)当外层过程序的局部变量名和嵌套过程中的局部变量不同名时,外层过程的局部变量作用域包含嵌套过琛。
(2)当外层过程的局部变量名和嵌套过程内的局部变量名同名时,外层局部变量名的作用域不包含此过程。
5、
console.log(0.1 + 0.2 === 0.3);
上面代码运行结果:false
6、
console.log(0 || "1" && 2);
上面代码运行结果:
7、
console.log(2 in [1,2]);
上面代码运行结果:false
关键字:in
判断对象是否为数组/对象的元素/属性:
当“对象”为数组时,“变量”指的是数组的“索引”;
当“对象”为对象是,“变量”指的是对象的“属性”。
var arr = ["a","b","2","3","str"];
var a= ("b" in arr);
var b= (4 in arr);
console.log(a);
console.log(b);
8、
var a=[1,2],b=[3],c=6;
function test(a1,b1,c1){
a1=[];
b1[0]=4;
c1=7;
}
test(a,b,c);
console.log(a);
console.log(b);
console.log(c);
上面代码运行结果如下:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJcAAABKCAIAAAA5XVHfAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADGElEQVR4nO2cPW7qQBRGvSPqVGwgO0CKixTZAAV9Gl5FgcQOkCLRoUiwg6eIJFRpaJAIIYUXcTPjn8HEY8aGG6O5fEdWZE1mSOTjb2zjqwkI+E/g6gA8ABYlAIsSgEUJwKIEYFECnBZn49eg/zFzdfsDPp/ub2/aant4+nZ0nfaoE9LwzdHNzo66oR7e6dGXo+v/x3b8L91Pdo6eDPBZ3K7C+WYwWg62rp78KItufxQrnO70z9MsqoGLeGcxou6zo7Pme3Lnl8XZWPtTcQzf05b1fNnSXlVA9Za0WxuJItMS9JPzIMqfEOpjW/Oo8DcNVS0mnGzR8PVMnZGrE3lncbtqjTd0eLjjCTYvLzrSmI3ahNmcnGuMXBFv2qLKYqVP8Mri/igbMUm8CgGyNaozYLRaF/ffP4L4zNjvlNKoRR1E93UxxieL6ij3X/dbesT3qcpha8xJ0kk1wlKjSrzzjqk5izUUkk8WD6c7pSQJUz5VBmtjZlHlWJ0EuaRqf4P50lxoyznb4ss/dT/5+GLvb6inkDyyaLQlGE/WadA+N6qApiFeHzo7iOYxqlpMHjPMtjC/UIe7fXs3+TwyVjEMS4aX4Y3Fv8MaXDtVLZajH++cWazNNVtM7mODqgqp1lN/kd3k4aZCEGvi6VM/uBywKAFYlAAsSgAWJQCLEoBFCcCiBGBRArAoAViUACxKgNOiFzVwlL2fcr1XavTr7DPhs+hDDRxlhU9Dt8WYpl4tnQmbRT9q4OKC0gXBohVPauBMrQYsFvGjBi5fRAqLBTypgftVdFOpzv9qLPpXA0fI4m+8qoEzwGJTNFoDVwIsnkzDNXAlXOdTP7gcsCgBWJQALEoAFiUAixKARQnAogRgUQKwKAFYlAAsSoDP4lv29rXWKhSAAx6LtZcQAazwWDTL3IGLwGFxR90eTUfpjFppsULACpPFXCXSMNSrV4ImYbKYuyhWXa8Q8MFhMVs9NgFZbB4ei/ulmKsUeQJumCyCiwKLEoBFCcCiBGBRArAoAViUACxKABYlAIsSgEUJwKIEYFECsCgBWJTAD299oiTI8xqtAAAAAElFTkSuQmCCAA==" alt="" />
9、事件循环
function printing() {
console.log(1);
setTimeout(function(){console.log(2)},1000);
setTimeout(function(){console.log(3)},0);
console.log(4);
}
printing();
上面代码运行结果如下:

浏览器有一个事件循环用于检查事件队列,处理延迟的事件。UI事件(例如,点击,滚动等),Ajax回调,以及提供给 setTimeout() 和 setInterval()的回调都会依次被事件循环处理。当调用 setTimeout() 函数时,即使延迟的时间被设置为0,提供的回调也会被排队。回调会乖乖地待在队列中,直到指定的时间用完后,它才开始执行动作。
因此,即使 setTimeout() 回调被延迟0毫秒,它仍然会被排队,并且直到函数中其他非延迟的语句被执行完了之后,才会执行。所以运行的结果是:1 4 3 2。
10、
var f = function g(){
return 23;
}
typeof g()
上面代码运行结果如下:

函数定义的方法有两种:(1)直接声明,比如 function g(){} (2) 匿名函数(表达式声明)比如:var f = function(){}
题目中的函数定义方法属于匿名函数,即右边的函数体赋值给了变量f,只有f() 才会调起函数,而右侧的函数体的g变量已经无法在函数体外进行访问,即g is not defined。
function g(){
return 'qqq'
}
var f = function g(){
return 23;
}
g();
上面代码运行结果如下:qqq
11、delete
(function(x){
delete x;
return x;
})(1)
上面代码运行结果如下:1
delete的删除机制:delete一般用来删除对象的属性和方法的,不能够删除函数传递的参数。
delete无法删除用var、let、const声明的变量。
不容忽视的js面试题的更多相关文章
- 10个常见的Node.js面试题
如果你希望找一份有关Node.js的工作,但又不知道从哪里入手评测自己对Node.js的掌握程度. 本文就为你罗列了10个常见的Node.js面试题,分别考察了Node.js编程相关的几个主要方面. ...
- 所在实习公司的JS笔试题
在班上无聊的时候看到了一份JS笔试题(我是电面进去的,没做过这份题~~),开始还觉得蛮简单......后来觉得还是很有意思的,贴出来一起看看. 题目一: if(!("a" in w ...
- 有点难度的JS面试题
自己总结了一些JS面试题 希望能够帮助正在找工作的程序猿(●´∀`●) 1.js 实现一个函数对javascript中json 对象进行克隆 var oldObject ="sdf" ...
- Node.js面试题之2017
译者按: 从ECMAScript标准,Node.js语法以及NPM模块角度来看,Node.js的发展让人目不暇接,那么面试题也得与时俱进. 原文: Node.js Interview Question ...
- vue.js面试题整理
Vue.js面试题整理 一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务 ...
- 一道JS面试题引发的血案
刚入职新公司,属于公司萌新一枚,一天下午对着屏幕看代码架构时. BI项目组长给我看了一道面试别人的JS面试题. 虽然答对了,但把理由说错了,照样不及格. 话不多说,直接上题: var a = 1; s ...
- js经典试题之常用的方法
js经典试题之常用的方法 1.下面代码输出的值 let s = "bob" const replaced = s.replace('b', 'l') replaced === &q ...
- js经典试题之运算符的优先级
js经典试题之运算符 1.假设val已经声明,可定义为任何值.则下面js代码有可能输出的结果为: console.log('Value is ' + (val != '0') ? 'define' : ...
- js经典试题之ES6
js经典试题之ES6 1:在ECMAScript6 中,Promise的状态 答案:pending resolved(fulfilled) rejected 解析: Promise对象只有三种状态: ...
随机推荐
- JAVA之旅(三十一)——JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件
JAVA之旅(三十一)--JAVA的图形化界面,GUI布局,Frame,GUI事件监听机制,Action事件,鼠标事件 有段时间没有更新JAVA了,我们今天来说一下JAVA中的图形化界面,也就是GUI ...
- Error处理:Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack tra
[2014-04-20 20:59:23 - MyDetectActivity] Dx trouble writing output: already prepared [2014-04-20 20 ...
- SpringMVC源码分析--容器初始化(五)DispatcherServlet
上一篇博客SpringMVC源码分析--容器初始化(四)FrameworkServlet我们已经了解到了SpringMVC容器的初始化,SpringMVC对容器初始化后会进行一系列的其他属性的初始化操 ...
- 【Netty源码学习】入门示例
Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 也就是说,Netty ...
- 保证service存活
Android开发的过程中,每次调用startService(Intent)的时候,都会调用该Service对象的onStartCommand(Intent,int,int)方法,然后在onStart ...
- Struts2知识点学习笔记
写给自己的话 好记性不如烂笔头,不可能说看了一遍视频就可以完全掌握的.留下这篇笔记,便于今后的复习吧. 1. 访问ServletAPI 访问ServletAPI(response,request,)的 ...
- Android 5.x 权限问题解决方法
android 5.x开始,引入了非常严格的selinux权限管理机制,我们经常会遇到因为selinux权限问题造成的各种avc denied困扰. 本文结合具体案例,讲解如何根据log来快速解决9 ...
- FFmpeg示例程序合集-批量编译脚本
此前做了一系列有关FFmpeg的示例程序,组成了<最简单的FFmpeg示例程序合集>,其中包含了如下项目:simplest ffmpeg player: ...
- 【shell脚本】mysql每日备份shell脚本
每天固定时间用mysqldump 备份mysql数据. #!/bin/bash #每天早上4点, mysql备份数据 orangleliu #chmod 700 backup.sh #crontab ...
- gradle编译自定义注解(annotation)的未解决问题
最近把一个用eclipse构建的项目,加上了Gradle脚本,用它来编译.虽然最后编译是显示BUILD SUCCESSFUL,但是在编译过程中,却打印出一大堆栈信息,似乎是在编译我自定义的注解时出现的 ...