js面试题总结
1.typeof和Object.prototype.toString
typeof是js里面判断变量类型的一种方法,但这种方法没有Object.prototype.toString准确,前者有6种判断结果,分别是function,string,number,object,undefined,boolean,后者有8中判断结果,分别是[object Function],[object Number],[object String],[object Object],[object Array],[object Null],[object Undefined],[object Boolean]。typeof对于数字类型,null类型以及数组类型的判断不如Object.prototype.toString准确。
下面是我的测试代码和运行结果:
function func(){ }
var str="str";
var num=1;
var dou=3.14;
var num_obj=new Number(1);
function Person(name){
this.name=name;
}
var person=new Person("hexiang");
var nul=null;
var undef=undefined;
var arry=[];
var obj={};
console.log("-----typeof-----");
console.log("func:"+typeof func);
console.log("str:"+typeof str);
console.log("num:"+typeof num);
console.log("num_obj:"+typeof num_obj);
console.log("dou:"+typeof dou);
console.log("person:"+typeof person);
console.log("nul:"+typeof nul);
console.log("undef:"+typeof undef);
console.log("arry:"+typeof arry);
console.log("obj:"+typeof obj);
console.log("null:"+typeof null);
console.log("unknown variable:"+typeof unknownvar)
console.log("-----toString-----");
console.log("func:"+Object.prototype.toString.call(func));
console.log("str:"+Object.prototype.toString.call(str));
console.log("num:"+Object.prototype.toString.call(num));
console.log("num_obj:"+Object.prototype.toString.call(num_obj));
console.log("dou:"+Object.prototype.toString.call(dou));
console.log("person:"+Object.prototype.toString.call(person));
console.log("nul:"+Object.prototype.toString.call(nul));
console.log("undef:"+Object.prototype.toString.call(undef));
console.log("arry:"+Object.prototype.toString.call(arry));
console.log("obj:"+Object.prototype.toString.call(obj));
console.log("null:"+Object.prototype.toString.call(null));
结果如下:
-----typeof-----
func:function
str:string
num:number
num_obj:object
dou:number
person:object
nul:object
undef:undefined
arry:object
obj:object
null:object
unknown variable:undefined
-----toString-----
func:[object Function]
str:[object String]
num:[object Number]
num_obj:[object Number]
dou:[object Number]
person:[object Object]
nul:[object Null]
undef:[object Undefined]
arry:[object Array]
obj:[object Object]
null:[object Null]
2.false和==,===
==号向来是不严谨的,比如'1'==1是true的,而'1'===1则是false的,特别是当[],0,“”,"0"和false进行比较时,用==都会返回true, ===都会返回false。不过注意null和undefined和false进行比较时,不管是用==还是===都是false的。
3.局部变量和全局变量,连续赋值
以下代码
var a=b=3;
是连续赋值,相当于先执行b=3;再执行var a=b;所以这个时候a,b都是全局变量,这个时候打印a,b肯定都是3,没毛病。
但是下面代码:
(function(){
var a=b=3
})();
虽然也是先执行b=3,再执行var a=b;但由于代码是包含在闭包中的,所以有var声明的a就是局部变量,没有var声明的b就是全局变量,此时从全局角度来看b是3,a是undefined。
4.this
var myObject={
foo:"bar",
func:function(){
var self=this;
console.log("outer func:this.foo="+this.foo);
console.log("outer func:self.foo="+self.foo);
(function(){
console.log("inner func:this.foo="+this.foo);
console.log("inner func:self.foo="+self.foo);
})();
}
};
myObject.func();
输出:
outer func:this.foo=bar
outer func:self.foo=bar
inner func:this.foo=undefined
inner func:self.foo=bar
注意this在javascript里面根据函数域的不同而不同,(function(){})()是myObject.func()里的一个闭包,形成了一个独立的函数域,因此this在myObject.func里指的是myObject这个对象,在闭包里指的是window对象。
5.严格模式 use strict 的使用及作用
"use strict"; 放在脚本第一行,则下面的所有代码都执行严格模式,放在函数的第一行,则函数里的所有代码都执行严格模式。那么严格模式与正常模式有什么区别呢?
(1)严格模式下不允许不声明就赋值。正常模式下a=2是不会有错的,严格模式下会报"Uncaught ReferenceError: a is not defined",包括var a=b=2这样的赋值在严格模式下也是不允许的,3里面提到过。
(2)禁止使用with,eval有自己的作用域了(相当于闭包了)
(3)禁止函数中的this指向全局对象,例如下面代码
function hello(){
console.log(this);
}
hello();
会输出window对象,但是如果hello函数第一行加上“use strict”;会输出undefined
(4)禁止使用caller,arguments.callee等
(5)禁止函数形参重名
(6)禁止使用八进制数字,如012,正常模式下相当于数字10,但是在严格模式下会报错
(7)public,protected,private,implements,interface,package,let,yield,static等关键词不允许使用
(8)还有其他的一些用的比较生辟的,这里就不再赘述了。
6.奇怪的分号
下面两个函数的返回值分别时2和undefined
function a(){
return {
a:2
};
}
function b(){
return
{
a:2
};
}
因为js中分号并不像c++,java那样是必须的,很多时候js代码只要独立成行的写,解析器会根据能否正常编译来自动判断是否应该有分号。return,break,continue这样的关键词后面紧跟换行的话,解析器一定会在后面自动添加分号,于是b函数相当于
function b(){
return;
{
a:22
};
}
7.NaN是啥?
NaN是not a number的缩写,是一种特殊的Number类型的数值(这他妈太奇怪了),toString.call(NaN)的结果你会发现是[object Number],isNaN可以判断一个变量(字符串,数字)能否转化为数字,返回true时表示不行,返回false是表示可以。
8.js浮点型计算
和java等多数语言一样,js里0.1+0.02并不等于0.12,而是后面有一长串的小数,我们可以自己实现方法进行准确的计算,比较好的一个方法就是先升幂后降幂的方法。非常简短,如下:
function add(n1,n2){
var d1=((n1+"").split(".")[1]).length;
var d2=((n2+"").split(".")[1]).length;
var r=Math.pow(10,Math.max(d1,d2));
return (n1*r+n2*r)/r;
}
9.使用定时器解决堆栈溢出的问题
下面代码在队列巨大的时候会导致堆栈溢出,
function bar(){
var n=list.pop();
//do something
if(n!=null){
bar();
}
}
解决堆栈溢出的一个很好的方法是使用定时器,当然这会带来异步的问题,请注意。
function bar(){
var n=list.pop();
//do something
if(n!=null){
setTimeout(bar,0);
}
}
10.&& 和||执行顺序
举个简单的例子吧,0&&1||2返回2,0||1&&2返回2
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对象只有三种状态: ...
- js经典试题之w3规范系列
js经典试题之w3规范系列 1:w3c 制定的 javascript 标准事件模型的正确的顺序? 答案:事件捕获->事件处理->事件冒泡 解析:先事件捕获从windows > doc ...
随机推荐
- 使用vbScript 链接SQLserver数据库和基础操作
使用vbs链接SQLserver数据库 数据库的创建.设计使用 management studio完成 1.本地链接数据库 set oCon = server.createObject("a ...
- js里面Object的一些方法
1.Object.freeze() 阻止修改现有属性的特性和值,并阻止添加新属性两种用法:Object.freeze( { } ) 和 Object.freeze( object ) <scri ...
- vue项目中快捷语法糖
1.Vue.js是渐进式框架,采用自底向上增量开发的设计基于MVVM思想. 2.Vue 完全有能力驱动采用单文件组件和Vue生态系统支持的库开发的复杂单页应用. 3.Vue.js 的目标是通过尽可能简 ...
- loadrunner:文本检查点web_reg_find和web_find两个函数的区别
web_reg_find是先注册(register)后查找的:使用时将它放在请求语句的前面. 而web_find是查找前面的请求结果:使用时将它放在请求语句的后面. 另二者的参数也完成不一样的,web ...
- 在DLL中创建窗口时一个值得注意的地方 — UnregisterClass
背景描述: 今天要测试一份注入代码,拿以前写的创建窗口的DLL来做测试. 第一次注入时一切正常,窗口被成功创建并显示,但在第二次加载时窗口没有显示出来. 经过研究发现在第二次加载DLL时Registe ...
- UVA 11922 Permutation Transformer (Splay树)
题意: 给一个序列,是从1~n共n个的自然数,接下来又m个区间,对于每个区间[a,b],从第a个到第b个从序列中分离出来,翻转后接到尾部.输出最后的序列. 思路: 这次添加了Split和Merge两个 ...
- 51nod 1417 天堂里的游戏
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 多年后,每当Noder看到吉普赛人,就会想起那个遥远的下午. Noder躺在草地上漫无目的的张望,二 ...
- springcloud 之 bus 消息总线
在分布式系统中,我们通常使用轻量级消息代理(rabbitmq.kafuka)建立一个公共的主题,让所有的微服务都链接进来,并且监听消费这个主题的内容,我们就称这个主题是 消息总线. (可以用作配置文件 ...
- (一) Docker in Docker
一. 背景介绍 工作中,要实现在docker中运行docker,实现镜像的拉取,创建,修改,上传等操作. 尝试过在docker中,安装docker.行不通,服务起不来. 而且直接在 docker 容 ...
- k8s集群之Docker安装镜像加速器配置与k8s容器网络
安装Docker 参考:https://www.cnblogs.com/rdchenxi/p/10381631.html 加速器配置 参考:https://www.cnblogs.com/rdchen ...