最近无聊,在网上搜了很多关于原生JavaScript的题目,一般不容易做对,稍稍做下总结!
1.NaN==NaN?
答: false。(isNaN方法可以判断是否为NaN)
考点:NaN是什么。它“not a number”的缩写,{},""等都可以是一个NaN,所以NaN!=NaN。
拓展:typeof NaN——指是number;NaN+1——NaN。
注:null == undefined
2.
var a=10; /*定义全局变量a的值为10*/ console.log(sayHi()); //NaN function sayHi () { var a=a+10 /*定义局部变量a,函数内a被重新定义,此时a不是数字*/
return a; /*return值为NaN
}
console.log(sayHi()+10) // NaN
console.log(a) // 10 /*此时指全局变量a*/
3.
var foo = { bar: function() { return this.baz; }, baz: 1 }; console.log( (function(){ return typeof arguments[0](); })(foo.bar) ) //undefined
考点:this指针。改写以上函数:
var foo = { bar: function() { return this.baz; }, baz: 1 }; console.log( (function(){ return typeof arguments[0](); })(function() { return this.baz; }) )
this指向arguments,那么baz这个属性是arguments所没有的,因此他的值为undefined。
4.
var x=1 if (function fn() {}) { x+=typeof fn; }; console.log(x) //1undefined
考点:a.function() fn{}是一个函数声明,fn此时没有定义,则为undefined。若var fn=function(){},则结果为1function;b.数字+str则是把数字与str连写成字符串;c.Boolean(function fn() {})值为true,即函数转换为布尔值都是true。
5.
console.log((function f () { function f () { return 1; } return f(); function f () { return 2 } function f () { return 3 } })()) //3
6.arguments(实参)
console.log( (function () { return typeof arguments; })() ) //object
考点:typeof 只能识别除Null之外的标准类型及函数类型,其他都识别为object。
7.
var f = function g () { return 23; } console.log(typeof g()) //报错
考点:本题是一个指定了函数名的函数表达式。首先执行一个抽象方法NewDeclarativeEnvironment,该方法创建一个空的新词法环境,并把 当前的执行环境 引用为 新的词法环境的外部词法环境。然后以新的词法环境为作用域,执行了接下来的步骤,并 最后将函数的引用交给左侧的变量。因此这里的函数名,是绑定在新的词法环境中的,外部环境也就无法找到函数名,抛出了ReferenceError
8.delete
console.log( (function (x) { delete x; return x; })(1) )
考点:在函数内部,delete无法删除形参。
9.var y=1,x=y=typeof x;
var y=1,x=y=typeof x; console.log(x) //undefined console.log(y) //undefined
考点:先定义了 y 并赋值为 1,然后将 typeof x 赋值给 y ,此时 x 未定义,故为 "undefined",最后将 y 的值赋给 x。
10.
(function f(f){ return typeof f(); })(function(){ return 1; }) //执行结果为 number
考点:一个函数名为f的自执行函数,接收一个函数作为参数。函数f内部的f则指向传入的实参而非函数f自身。
11.逗号运算符
var f = (function f(){
return "1";
},
function g(){
return 2;
})(); typeof f; //number
考点:“,“运算符的规则是:先计算左边的再计算右边的,最后返回右边的。
12.
var x = [typeof x, typeof y][1]; typeof typeof x;
考点: typeof的返回值为的类型为string
13.
console.log( (function(foo){ return typeof foo.bar; })({ foo: { bar: 1 } }) ) //undefined
考点:此题与题10类似,函数内部的foo指向实参,arguments是没有bar这个属性的。此题的实参foo等于{ foo: { bar: 1 } }
14.
with (function(x, undefined){}) length //2
考点:with只起一个临时改变作用域的作用,相当于function(x,undefined){}.length。对于函数对象,length属性对应的是参数个数,即为2.
15.
function f(){ return 1; } console.log(new f() instanceof Object) //true function f(){ return f; } console.log(new f() instanceof Function) //true
考点:“a instanceof b”指a是否是b的实例。构造函数不需要显式声明返回值,默认返回this值。当显式声明了返回值时,如果返回值是非对象(数字、字符串等),这个返回值会被忽略,继续返回this值。但是如果返回值是对象,那么这个显式返回值会 被返回。