看微博的时候看到一个链接,是JS的14道题,地址:http://sentsin.com/jsquiz ,然后好奇的做了一下,结果,哈哈,错了一大半,所以就记下来,当复习JS吧~
typeof的解析链接
简单点说,typeof是一个一元运算符,返回值是一个字符串,该字符串说明运算数的类型。
typeof的返回值有7种,分别是:
result | typeof |
---|---|
“undefined” | undefined |
“object” | null、{}、[],正则(Safar5,Chrome7之前的版本是”function”) |
“boolean” | Boolean |
“number” | Number,NAN |
“string” | String |
“function” | Function |
“symbol” | Symbol (ES6) |
注
已声明但没赋值的的变量,它的值是undefined。
如:var a; ==>undefined
而未定义的值指没有被声明就直接进行运算的变量。
typeof并不区分这两种情况的值,输出的结果都为”undefined”
如:
var a;
typeof a; //undefined
typeof b; //undefined
但对未声明的变量使用除typeof之外的运算符时,则会报错。因为这些运算符只能使用已声明的变量。
如:function a(){}。
a指的是函数本身,而a()则是函数的返回结果(有return 就返回return的值,没有return,就返回undefined)
所以typeof a 求的是a的类型==>”function”,
而 typeof a() 求的是a函数的返回结果的类型。
写了这么多typeof的部分知识点,言归正传,分析分析那几道题(多数是和typeof有关的)
(function(){
return typeof arguments;
})();
答案:”object”
大家都知道的,arguments是类似Array,但实际上又不是一个Array实例。
在控制台里输出看了一下,arguments是继承于object的。
var f = function g(){
return 23;
};
typeof g();
答案:Error
具体解析:函数的声明
函数的声明有以下形式
(function(x){
delete x;
return x;
})(1);
答案:1
具体解析:javascript 中的 delete
delete 是用于删除对象的属性。但delete不是所有变量都能删除的。
Throws in strict mode if the property is an own non-configurable property (returns false in non-strict). Returns true in all other cases.
delete不能删除是non-configurable(ES5)或DontDelete的属性,(严格模式下报错,非严格模式下是返回false。)其他的属性则返回true。
var a=123;
console.log(delete a);//false
b=123;
console.log(delete b);//true
好吧,说了这么多,还是不懂。。自己的理解吧,总结一句,delete只能删除对象的属性,但不是所有的对象属性都能删。
so… 函数参数的 properties 创建时也被赋予了 DontDelete 标志,所以删不了
var y = 1, x = y = typeof x;
x;
答案:”undefined”
其实我也不知道这是考的是什么知识点。如果是连等赋值问题的话,那从右至左。
y一开始赋值为1,typeof x为”undefined”,y再被赋值为”undefined”,最后将y的值赋给x。
附:不要在JS中使用连等赋值操作
(function f(f){
return typeof f();
})(function(){ return 1; });
答案:”number”
立即执行函数不用说了吧,函数中传入的是一个函数参数,然后问函数参数的返回结果的类型。
var foo = {
bar: function() {
return this.baz;
},
baz: 1
};
(function(){
return typeof arguments[0]();
})(foo.bar);
答案:”undefined”
When a function of an object was called, the object will be passed into the execution context as this value
即,function的this永远指向调用它的对象。
如本题的arguments[0]函数所在对象是arguments,所以this指向的是arguments对象,而arguments对象没有baz属性,所以返回”undefined”
var foo = {
bar: function(){
return this.baz;
},
baz: 1
}
typeof (f = foo.bar)();
答案:”undefined”
同上,这里的this指向的是函数f的对象,而f是全局变量(浏览器的window)的属性,所以this指向的(浏览器的)window,window没有baz属性,所以…
var f = (
function f(){
return "1";
},
function g(){
return 2;
}
)();
typeof f;
答案:”number”
逗号运算符可以在一条语句中执行多个运算,它将先计算左边,再计算右边。然后返回最右边的值。
var a=1,b=2;
var f=(a++,b++);
console.log(a);//2
console.log(b);//3
console.log(f);//2
所以在这题中函数g的返回值2被赋值给变量f。
var x = 1;
if (function f(){}) {
x += typeof f;
}
x;
答案:”1undefined”
不懂这题,下面的只是个人认为。。
是否可以将这题理解成
var x=1;
var fa=function f(){};
if(fa){
x+=typeof f;
}
x;
首先if的判断条件是否为真?
function a(){};
//不带括号的,如果定义了就是真,没有定义会报错
if(a){
console.log("true a");
}
else{
console.log("false a");
}
//输出 true a
//带括号的,其实相当于调用函数,自然是根据函数的返回值判断真假
if(a()){
console.log("true a");
}
else{
console.log("false a");
}
//输出 false a
所以题目中的if语句是执行的,那typeof f的值又是什么了?
如果可以像我所理解那样的话,f在函数体外部是没定义的,所以typeof f应该是”undefined”。
var x = [typeof x, typeof y][1];
typeof typeof x;
答案:”string”
y没定义,所以第一个语句中,x被赋值”undefined”,所以连续求2次typeof还是”string”。
(function(foo){
return typeof foo.bar;
})({ foo: { bar: 1 } });
答案:”undefined”
函数参数foo={foo:{bar:1}}
这个没什么好解释的吧。。。
(function f(){
function f(){ return 1; }
return f();
function f(){ return 2; }
})();
答案:2
如果同一个函数被多次声明,后面的声明就会覆盖前面的声明。由于函数名的提升,前一次声明在任何时候都是无效的。
和以下情况区分(变量名提升)
(function f(){
var f= function{ return 1; }
return f();
var f= function{ return 2; }
})();
//输出 1
function f(){ return f; }
new f() instanceof f;
答案:false
具体参考javascript构造函数返回值
new操作符的作用就是实例化一个对象类型
当new foo(…)这行代码执行时,有下列事情依次发生:
1:一个对象将被创建,它将继承foo.prototype。
2:这个构造函数foo将连同指定的参数被调用,this指针将绑定到新创建的对象上。
3:一个对象将通过foo构造函数返回,返回的值将是整个new表达式执行的结果。假如这个foo构造函数没有明确返回一个对象,那么这个对象的创建过程将回到第一步。
所以在这题中,构造函数中返回的是函数f,所以子new f()后返回的是函数f,而不是继承f.prototype
with (function(x, undefined){}) length;
答案:2
with 语句用于设置代码在特定对象中的作用域。
本题中的对象是匿名函数,即求这个函数的length,就是形参的个数。
该怎么说了,这些题目的考点,我想,刚开始学JS的人,都不会注意这些考点的吧,有点偏。但却是笔试的时候部分经常出的考点。但多学学是没错的啦~像自己去深究这些题目的原因时,自己在这个过程里也学了好多JS的知识哦,至少以后可以少给自己挖坑,跳进坑了,也知道怎么爬上来吧~最后一句,没事还是多看看权威指南~