手机版

14个折磨人的JavaScript面试问题

时间:2021-09-07 来源:互联网 编辑:宝哥软件园 浏览:

翻完这篇小测验——图例讲解Javascript小测验,我想挪到这里供大家学习、理解、背诵和批判。

问题一

(function(){返回参数类型;//' object ' })();参数是一个类似数组的对象,它对应于传递给函数的参数列表。你可以在任何函数中直接使用这个变量。typeof运算符只返回字符串类型的结果。请参考下面的列表,了解对应于不同数据的类型返回了哪些值:

由此我们推断,参数的类型是对象

问题2

var f=函数g(){ return 23;};type of g();//错误:这是一个函数表达式,名字是g,然后赋给变量F.函数名G和它分配的变量F有以下区别:函数名G不能更改,但变量F可以重新分配。函数名G只能在函数体内部使用。试图在函数外使用G将会报告一个错误

问题3

(函数(x){ delete x;返回x;//1})(1);删除操作符可以从对象中删除属性,正确用法如下:删除对象。属性删除对象['属性']删除操作符只能作用于对象的属性,但对变量和函数名没有影响。也就是说,删除x是没有意义的。

你最好知道删除不会直接释放内存,它只会间接中断对象引用

问题4 var y=1,x=y=的类型;x;//'undefined '我们尝试将上述代码分解为以下两个步骤:var y=1;//step 1 var x=y=type of x;//第二步第一步应该没有异议。我们直接看第二步。1.赋值表达式从右向左执行。2.y作为x类型的结果被重新赋值,即undefined3.x被赋值为正确的表达式(y=类型)。结果未定义。

问题5

(函数f(f){返回类型f();//' number ' })(function(){ return 1;});直接在注解上解释:

(函数f(f){ //f这里是传入的参数function(){ return 1;}//执行的结果自然是1返回type of f();//所以根据问题一的表格,我们知道typeof 1的结果是‘number’})(function(){ return 1;});问题6

var foo={ bar : function(){ return this . baz;},baz : 1 };(function(){返回参数[0]的类型();//' undefined ' })(foo . bar);这里你可能会误以为最后的结果是数字。将参数传递给函数可以被视为赋值,因此参数[0]获取的是真实bar函数的值,而不是引用foo.bar,因此这自然不会指向foo,而是指向window。

问题7

var foo={ bar : function(){ return this . baz;},baz : 1 } type of(f=foo . bar)();//'undefined '这是与上一个问题相同的问题。(f=foo.bar)返回bar的值,而不是它的引用,因此这并不引用foo。

问题8

var f=(函数f(){ return ' 1 ';},函数g(){ return 2;})();f型;//“number”逗号运算符计算每个操作数(从左到右),然后返回最后一个操作数的值

因此(函数f(){ return ' 1 ';},函数g(){ return 2;})的返回值是函数g,然后执行她,那么结果是2;最后,类型2,根据问题1的表格,结果自然是数字

问题9

var x=1;if(function f(){ }){ x=type of f;} x;//‘1 undefined’,这个问题的关键点,就像我们在问题2中讲到的,函数表达式中的函数名f不能在函数体之外访问

问题10

var x=[typeof x,type of y][1];x的类型;//“字符串”1。由于变量y尚未声明,y的类型返回“undefined”2。将y类型的结果赋给x,这意味着x现在是“未定义的”3。那么x的类型当然是“字符串”4。最后,“字符串”类型的结果仍然是“字符串”

问题11

(function(foo){ return type of foo . bar;//' undefined ' })({ foo : { bar : 1 } });这是一个纯视觉的把戏,注释

(function(foo){ //foo这里是{foo: {bar: 1}},没有bar属性。//bar属性位于foo.foo//so下,这里的结果是foo.bar的“undefined”返回类型;})({ foo : { bar : 1 } });问题12

(函数f(){函数f(){ return 1;}返回f();//2函数f(){ return 2;}})();函数声明所声明的函数甚至可以在声明之前使用,这就叫做延迟。所以上面的代码实际上是由运行环境这样解释的:

(函数f(){函数f(){ return 1;}函数f(){ return 2;}返回f();})();问题13

函数f(){ return f;}新f()实例f;//false当执行新代码f()时,会发生以下情况:1。将创建一个新对象。它继承自f.prototype2 .执行构造函数f。执行时,相应的传输将被传入,并且上下文(this)将被指定为这个新实例。New f相当于new f(),只能在不传递任何参数的情况下使用。3.如果构造函数返回一个“对象”,那么这个对象将替换整个新结果。如果构造函数不返回对象,则new的结果是在步骤1中创建的对象。

Ps:通常构造函数不返回值,但是如果用户想要覆盖这个返回值,他可以选择返回一个普通对象来覆盖它。当然,返回数组会覆盖它,因为数组也是对象。

因此,我们的新f()在这里仍然返回函数f本身,而不是它的实例

问题14(函数(x,未定义){})长度;//2 with语句将对象添加到范围链的顶部。如果语句中有一个变量不使用命名空间,并且与范围链中的属性同名,则该变量将指向属性值。如果没有同名的属性,将引发ReferenceError异常。

好了,现在我们来看看,由于函数(x,undefined){}是匿名函数表达式和函数,会有一个length属性,是指函数的参数个数。所以最终结果是2

写在最后

有人认为这些问题具有欺骗性,也有人认为开阔了眼界,观点不一。但有一点是真的,不管你是不是坚定的实践者,缺乏理论基础,你绝对走不了多远——你永远看不到一个熟练的技术工人突然变成火箭专家。

看文件,看标准,结合实际,才是同志取胜之道。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:14个折磨人的JavaScript面试问题是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。