错题回顾与总结
正文
1.在 javascript 中,以下返回 false 的选项是
A.var test=1;typeof test==’number’;
B.var test=1.2;typeof test==’float’;
C.var test=undefined;typeof test==’undefined’;
D.var test={};typeof test==’object’;
E.var test=’4399’-0;typeof test==’number’;
F.var test=null;typeof test==’object’;
正解:B
解析:本题错选了E,主要是对运算符的隐式转换认识不全面。首先对于一元的加减法运算,字符串是都会转化成数字进行运算的,而二元加法对于类字符串的操作数是优先执行字符串拼接也就是会把另一个操作数转化为字符串,否则就转化为数字类型进行运算,如undefined->NaN,null->0,但是需要注意运算法则依然按正常的优先级顺序,先执行的运算按照不同的规则去运算。但是二元减法是会把操作数全都转换为数字进行运算的。 而B选项的float类型在js明显是不存在的,这里我们顺便复习一下typeof函数:typeof函数用于判断基本类型,返回的结果只有6种:number,boolean,string,function,object,undefined。特别的是,某些特殊值的类型判断是不准确的:null(特别注意),array,object以及函数实例(new + function)也就是类的实例返回的都会是object,所以我们需要instanceof函数来进一步判断,这个函数用于判断对象是谁的实例,也就是搜索当前对象的原型(因此继承到的原型也有效),instanceof的使用方法和typeof也不同,它前后都有参数,判断前一个参数是否后一个参数的实例。
2.下面结果为真的表达式是:()
A.null instanceof Object
B.null === undefined
C.null == undefined
D.NaN == NaN
正解:C
解析:实际上这题的知识点跟上一题类似,A选项的null本身就是object而非是object的实例。而相等(==)与严格相等(===)的区别就在与严格不允许格式转换。特别注意的是NaN属于Number类型,它自身是不等于自身的。
趁着这两题我们做一个延伸去了解各种看上去表达“空”或者“无意义”的变量背后的含义:
- 空数组[]空对象{}的布尔值都为true,但是空字符串’‘布尔值为false
- null表示一个空object,转为number是0
- undefined表示一个无定义的原始值(定义了变量没有赋值),转为number是NaN
- NaN表示非数字(Not A Number),主要出现在将字符串解析成数字出错的场合,0/0也是NaN,而且不等于任何值,包括NaN自己
- 在普通相等符(==)中,undefined和null是相等的,与其他的值都不相等,转换成Boolean为false
- 判断空数组和空字符串(str也是一种数组)可以判断array.length==0,判断空对象可以JSON.stringify()==”{}”
3. 以下代码执行后,console 输出的信息是?
for(let i = 0; i < 5; i++){
requestAnimationFrame(() => console.log(i));
}
正解:0 1 2 3 4
解析:经典题目,js单线程,所以异步执行的回调函数(或者是一个闭包函数)会在for循环结束后再执行,但是ES6中的let定义代替了从前的var定义,let定义令i变量拥有了自己的块级作用域后修正了这个问题,令for循环可以按照原本设计的功能执行。
4. 要在10秒后调用checkState,下列哪个是正确的
A.window.setTimeout(checkState(), 10000);
B.window.setTimeout(checkState, 10000);
正解:B
解析:记住setTimeout传入的值应该是函数名,也就是说如果传入”checkState()”也是正确的,带括号的函数我们知道是一个立即执行函数,这个时候传入的值会是函数的返回值。
5. 以下代码执行后,console 的输出是?
function Foo(){'use strict'
console.log(this.location);
}
Foo()
A.当前窗口的 Location 对象
B.undefined
C.null
D.TypeError
正解:D
解析:这题突破点在于严格模式的使用。首先了解严格模式可以对于全局也可以对于单个函数来使用,其次在这道题里面,this是不能指向全局对象,常见的就是window,所以在这个函数中调用this.location是window的属性,自然会报错TypeError,因为此时的this为undefined。至于其他严格模式下的规定可以查看这个网址。
6.以下哪些选项可以将集合A转化为数组?
A.Array.form(A)
B.[].slice.apply(A)
C.[…A]
D.[].map.call(A, o => o)
正解:ABCD
解析:这里的选项基本都是在ES6中关于array对象的扩展。A,Array.from(arr, mapfn,thisArg)方法,用于将两类可以把对象转换为真正的数组:类似数组的对象和可遍历的对象(部署了Iterator接口的,String,ES6新增的Map和Set)。可以传3个参数,其中第一个是数组,必传;第二个是一个函数(类似map函数),对数组元素进行操作后再返回数组,可选;第三个是对于this关键字的指向,可选。B.是ES5中的写法,apply将slice函数的this指向A,对A进行slice,存到这个空数组里面。C,也是ES6的新写法…是扩展运算符,就是将数组变成一个参数序列。D.ES5写法,与B选项原理类似,通过call方法将map函数的this指向A,map的回调函数把每个元素直接返回出来。 这里建议通读一下ES6规范中关于数组的扩展部分。
总结
基础知识仍然不够扎实,ES6规范要赶紧通读一下了。