关于14 个折磨人的 JavaScript 面试题的代码示例详细分析
前端工程师有时候面试时会遇到一类面试官,他们问的问题对于语言本身非常较真儿,往往不是候选人可能期待的面向实际的问题(有些候选人强调能干活就行,至于知不知道其中缘由是无关痛痒的)。这类题目,虽然没有逻辑,但某种程度说,确实考察了候选人对于javascript
这门语言的理解。
突然想到这个话题是无聊在翻自己的Github,看看以前都写过什么丑货。然后翻到了这篇解释Javascript quiz的文章quiz-legend,反正没事儿,就想搬过来供大家学习、理解、背诵、批判。
问题一
(function(){ return typeof arguments;//"object" })();
arguments
是一个Array-like对象,对应的就是传入函数的参数列表。你可以在任何函数中直接使用该变量。
typeof
操作符只会返回string
类型的结果。参照如下列表可知对应不同数据,typeof
返回的值都是什么:
类型 | 结果 |
---|---|
undefined | 'undefined' |
null | 'object' |
Boolean | 'boolean' |
Number | 'number' |
String | 'string' |
Symbol (new in ECMAScript 2015) | 'symbol' |
Host object (provided by the JS environment) | Implementation-dependent |
Function object (implements [[Call]] in ECMA-262 terms) | 'function' |
Any other object | 'object' |
由此我们推断出,
typeof arguments
是object
问题二
var f = function g(){ return 23; }; typeof g();//报错
这是一个名字是g
的function expression,然后又被赋值给了变量f
。
这里的函数名g
和被其赋值的变量f
有如下差异:
函数名
g
不能变动,而变量f
可以被重新赋值函数名
g
只能在函数体内部被使用,试图在函数外部使用g
会报错的
问题三
(function(x){ delete x; return x;//1 })(1);
delete
操作符可以从对象中删除属性,正确用法如下:
delete object.property delete object['property']
delete
操作符只能作用在对象的属性上,对变量和函数名无效。也就是说delete x
是没有意义的。
你最好也知道,
delete
是不会直接释放内存的,她只是间接的中断对象引用
问题四
var y = 1, x = y = typeof x; x;//"undefined"
我们试图分解上述代码成下面两步:
var y = 1; //step 1 var x = y = typeof x; //step 2
第一步应该没有异议,我们直接看第二步
赋值表达式从右向左执行
y
被重新赋值为typeof x
的结果,也就是undefined
x
被赋值为右边表达式(y = typeof x
)的结果,也就是undefined
问题五
(function f(f){ return typeof f();//"number" })(function(){ return 1; });
直接上注释解释:
(function f(f){ //这里的f是传入的参数function(){ return 1; } //执行的结果自然是1 return typeof f(); //所以根据问题一的表格我们知道,typeof 1结果是"number" })(function(){ return 1; });
问题六
var foo = { bar: function() { return this.baz; }, baz: 1 }; (function(){ return typeof arguments[0]();//"undefined" })(foo.bar);
这里你可能会误以为最终结果是number
。向函数中传递参数可以看作是一种赋值,所以arguments[0]
得到是是真正的bar
函数的值,而不是foo.bar
这个引用,那么自然this
也就不会指向foo
,而是window
了。
问题七
var foo = { bar: function(){ return this.baz; }, baz: 1 } typeof (f = foo.bar)();//"undefined"
这和上一题是一样的问题,(f = foo.bar)
返回的就是bar
的值,而不是其引用,那么this
也就指的不是foo
了。
问题八
var f = (function f(){ return '1'; }, function g(){ return 2; })(); typeof f;//"number"
逗号操作符 对它的每个操作对象求值(从左至右),然后返回最后一个操作对象的值
所以(function f(){ return '1'; }, function g(){ return 2; })
的返回值就是函数g
,然后执行她,那么结果是2
;最后再typeof 2
,根据问题一的表格,结果自然是number
问题九
var x = 1; if (function f(){}) { x += typeof f; } x;//"1undefined"
这个问题的关键点,我们在问题二中谈到过,function expression
中的函数名f
是不能在函数体外部访问的
问题十
var x = [typeof x, typeof y][1]; typeof typeof x;//"string"
因为没有声明过变量
y
,所以typeof y
返回"undefined"
将
typeof y
的结果赋值给x
,也就是说x
现在是"undefined"
然后
typeof x
当然是"string"
最后
typeof "string"
的结果自然还是"string"
问题十一
(function(foo){ return typeof foo.bar;//"undefined" })({ foo: { bar: 1 } });
这是个纯粹的视觉诡计,上注释
(function(foo){ //这里的foo,是{ foo: { bar: 1 } },并没有bar属性哦。 //bar属性是在foo.foo下面 //所以这里结果是"undefined" return typeof foo.bar; })({ foo: { bar: 1 } });
问题十二
(function f(){ function f(){ return 1; } return f();//2 function f(){ return 2; } })();
通过function declaration
声明的函数甚至可以在声明之前使用,这种特性我们称之为hoisting。于是上述代码其实是这样被运行环境解释的:
(function f(){ function f(){ return 1; } function f(){ return 2; } return f(); })();
问题十三
function f(){ return f; } new f() instanceof f;//false
当代码new f()
执行时,下面事情将会发生:
一个新对象被创建。它继承自
f.prototype
构造函数
f
被执行。执行的时候,相应的传参会被传入,同时上下文(this
)会被指定为这个新实例。new f
等同于new f()
,只能用在不传递任何参数的情况。如果构造函数返回了一个“对象”,那么这个对象会取代整个
new
出来的结果。如果构造函数没有返回对象,那么new
出来的结果为步骤1创建的对象,
ps:一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。
于是,我们这里的new f()
返回的仍然是函数f
本身,而并非他的实例
问题十四
with (function(x, undefined){}) length;//2
with
语句将某个对象添加的作用域链的顶部,如果在statement
中有某個未使用命名空间的变量,跟作用域链中的某個属性同名,則這個变量将指向這個属性值。如果沒有同名的属性,则将拋出ReferenceError
异常。
OK,现在我们来看,由于function(x, undefined){}
是一个匿名函数表达式,是函数,就会有length
属性,指的就是函数的参数个数。所以最终结果就是2
了
写在最后
有人觉得这些题坑爹,也有人觉得开阔了眼界,见仁见智吧。但有一件事是真的,无论你是否坚定的实践派,缺了理论基础,也铁定走不远 - 你永远不会见到哪个熟练的技术工人突然成了火箭专家。
看文档、读标准、结合实践,才是同志们的决胜之道。
以上就是关于14 个折磨人的 JavaScript 面试题的代码示例详细分析的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Cara menggunakan WebSocket dan JavaScript untuk melaksanakan sistem pengecaman pertuturan dalam talian Pengenalan: Dengan perkembangan teknologi yang berterusan, teknologi pengecaman pertuturan telah menjadi bahagian penting dalam bidang kecerdasan buatan. Sistem pengecaman pertuturan dalam talian berdasarkan WebSocket dan JavaScript mempunyai ciri kependaman rendah, masa nyata dan platform merentas, dan telah menjadi penyelesaian yang digunakan secara meluas. Artikel ini akan memperkenalkan cara menggunakan WebSocket dan JavaScript untuk melaksanakan sistem pengecaman pertuturan dalam talian.

WebSocket dan JavaScript: Teknologi utama untuk merealisasikan sistem pemantauan masa nyata Pengenalan: Dengan perkembangan pesat teknologi Internet, sistem pemantauan masa nyata telah digunakan secara meluas dalam pelbagai bidang. Salah satu teknologi utama untuk mencapai pemantauan masa nyata ialah gabungan WebSocket dan JavaScript. Artikel ini akan memperkenalkan aplikasi WebSocket dan JavaScript dalam sistem pemantauan masa nyata, memberikan contoh kod dan menerangkan prinsip pelaksanaannya secara terperinci. 1. Teknologi WebSocket

Cara menggunakan WebSocket dan JavaScript untuk melaksanakan sistem tempahan dalam talian Dalam era digital hari ini, semakin banyak perniagaan dan perkhidmatan perlu menyediakan fungsi tempahan dalam talian. Adalah penting untuk melaksanakan sistem tempahan dalam talian yang cekap dan masa nyata. Artikel ini akan memperkenalkan cara menggunakan WebSocket dan JavaScript untuk melaksanakan sistem tempahan dalam talian dan memberikan contoh kod khusus. 1. Apakah itu WebSocket? WebSocket ialah kaedah dupleks penuh pada sambungan TCP tunggal.

Pengenalan kepada cara menggunakan JavaScript dan WebSocket untuk melaksanakan sistem pesanan dalam talian masa nyata: Dengan populariti Internet dan kemajuan teknologi, semakin banyak restoran telah mula menyediakan perkhidmatan pesanan dalam talian. Untuk melaksanakan sistem pesanan dalam talian masa nyata, kami boleh menggunakan teknologi JavaScript dan WebSocket. WebSocket ialah protokol komunikasi dupleks penuh berdasarkan protokol TCP, yang boleh merealisasikan komunikasi dua hala masa nyata antara pelanggan dan pelayan. Dalam sistem pesanan dalam talian masa nyata, apabila pengguna memilih hidangan dan membuat pesanan

JavaScript dan WebSocket: Membina sistem ramalan cuaca masa nyata yang cekap Pengenalan: Hari ini, ketepatan ramalan cuaca sangat penting kepada kehidupan harian dan membuat keputusan. Apabila teknologi berkembang, kami boleh menyediakan ramalan cuaca yang lebih tepat dan boleh dipercayai dengan mendapatkan data cuaca dalam masa nyata. Dalam artikel ini, kita akan mempelajari cara menggunakan teknologi JavaScript dan WebSocket untuk membina sistem ramalan cuaca masa nyata yang cekap. Artikel ini akan menunjukkan proses pelaksanaan melalui contoh kod tertentu. Kami

Tutorial JavaScript: Bagaimana untuk mendapatkan kod status HTTP, contoh kod khusus diperlukan: Dalam pembangunan web, interaksi data dengan pelayan sering terlibat. Apabila berkomunikasi dengan pelayan, kami selalunya perlu mendapatkan kod status HTTP yang dikembalikan untuk menentukan sama ada operasi itu berjaya dan melaksanakan pemprosesan yang sepadan berdasarkan kod status yang berbeza. Artikel ini akan mengajar anda cara menggunakan JavaScript untuk mendapatkan kod status HTTP dan menyediakan beberapa contoh kod praktikal. Menggunakan XMLHttpRequest

Penggunaan: Dalam JavaScript, kaedah insertBefore() digunakan untuk memasukkan nod baharu dalam pepohon DOM. Kaedah ini memerlukan dua parameter: nod baharu untuk dimasukkan dan nod rujukan (iaitu nod di mana nod baharu akan dimasukkan).

Pengenalan kepada kaedah mendapatkan kod status HTTP dalam JavaScript: Dalam pembangunan bahagian hadapan, kita selalunya perlu berurusan dengan interaksi dengan antara muka bahagian belakang, dan kod status HTTP adalah bahagian yang sangat penting daripadanya. Memahami dan mendapatkan kod status HTTP membantu kami mengendalikan data yang dikembalikan oleh antara muka dengan lebih baik. Artikel ini akan memperkenalkan cara menggunakan JavaScript untuk mendapatkan kod status HTTP dan memberikan contoh kod khusus. 1. Apakah kod status HTTP bermakna kod status HTTP apabila penyemak imbas memulakan permintaan kepada pelayan, perkhidmatan tersebut
