`

一道腾讯js面试题

 
阅读更多

 

题目如下:

 

 

f = function() {return true;}; 
g = function() {return false;}; 
(function() { 
   if (g() && [] == ![]) { 
      f = function f() {return false;}; 
      function g() {return true;} 
   } 
})(); 
alert(f()); // true or false ? 
 

 

 

 

按网友的描述猜测,这应该是QQ招聘的题目,既考查了ECMAScript知识,又需要被面试者的应用实践,题目本身无标准答案,在不同浏览器下表现不同。

 

这是一道难度较大,并且出题角度比较刁钻的面试题。

 

正赶上最近在研究Javascript这部分的内容,便对该题目涉及的考察点进行了更深入的研究。以下给出简单分析。

考察点

 对作用域链(scope chain)、执行环境(execution context)、变量对象(variable object)的理解 

 命名函数表达式,参见这里 

 以上知识点在不同浏览器(主要为:IE和Firefox)的实现差异 

 相等操作符的隐式类型转换规则 

首先,代码简化为(1):

 

 

f = function() {return true;}; 
g = function() {return false;}; 
(function() { 
   alert(g()); 
   function g() {return true;} 
})(); 
 

 

 

 

上面的例子中,当控制器进入匿名函数的执行环境后,初始化活动对象,函数声明g被放到了执行环境的变量对象集合中,property为g,值为g函数对象,当执行g(),返回true。

将上面的代码稍加改变(2):

 

 

f = function() {return true;}; 
g = function() {return false;}; 
(function() { 
   alert(g()); 
   if (true) { 
      function g() {return true;} 
   } 
})(); 
 

 

 

 

上面代码,结果应该与(1)相同,但Firefox处理结果出现了不同返回false,暂且把这看作是Firefox的bug(虽然Firefox不认为这是个Bug)。

 

分析:在Firefox中,出现在条件语句中的代码块不做活动对象初始化的处理(Firefox把它当作块作用域??),即把上例的if (true) 修改为 if (false) 结果是一样的。(这点很重要,造成了if语句中的g函数没有在函数一开始被初始化

 

到此为止,已经可以确定g()执行后的值是true还是false了。

整合一下(3):

 

 

f = function() {return true;}; 
g = function() {return false;}; 
(function() { 
   if (g()) { 
      alert("能看到这个警告框,说明你的浏览器不是Firefox"); 
      function g() {return true;} 
   } 
})(); 
 

 

 

继续分解代码(4):

 

 

f = function() {return true;}; 
g = function() {return false;}; 
(function() { 
   f = function() {return false;}; 
})(); 
alert(f()); 
 

 

 

 

代码运行,无一例外的返回false,这正是我们想要的结果。

然后稍作改变(5):

 

 

f = function() {return true;}; 
g = function() {return false;}; 
(function() { 
   f = function f() {return false;}; 
})(); 
alert(f()); 
 

 

 

 

经过稍加修改后,这次掉链子的轮到IE了,IE竟然返回了true!!!这是IE的Bug,参见:

 

http://www.cn-cuckoo.com/main/wp-content/uploads/2009/12/named-function-expressions-demystified.html#named-expr

 

http://www.w3help.org/zh-cn/causes/SJ9001

 

至于[]==![]的结果,请参考本人《Javascript类型转换规则》一文,回过头来你就会轻易得出结论。

最后大整合。

 

我们不仅知道结果,而且知道为啥是这结果了(6):

 

 

f = function() {return true;}; 
g = function() {return false;}; 
(function() { 
   if (g() && [] == ![]) { 
      f = function f() {return false;}; 
      function g() {return true;} 
   } 
})(); 
alert(f()); 
 

 

 

 

没有问题的浏览器会返回:false

 

Firefox不会执行到if条件内部,返回:true

 

IE会执行到if条件内部(但把if内部的f作为局部变量处理了),最后返回:true

 

[转自:http://hi.baidu.com/xiaogui2go/blog/item/4b966b1741659d1ec93d6de0.html]

 

:针对IE,文章最后提到“IE会执行到if条件内部(但把if内部的f作为局部变量处理了),最后返回:true”,括号中那句描述容易让人产生误解:只有if内部的f会最做为局部变量处理。实际上,只要是在函数内部定义的变量,即使没有加var修饰符,也会作为该函数的局部变量。这点与其他非IE浏览器表现不一样。

 

分享到:
评论

相关推荐

    腾讯PHP面试题_腾讯php面试题_

    最新腾讯PHP面试题1. php 的垃圾回收机制 PHP 可以自动进行内存管理,清除不需要的对象。 PHP 使用了引用计数 (reference counting) GC 机制。 每个对象都内含一个引用计数器 refcount,每个 reference 连接到对象,...

    腾讯面试题解析.pdf

    腾讯面试题解析.pdf 本资源是一份详细的腾讯面试题解析文档,涵盖了 Android 面试题、网络基础、常用三方库、算法基础等多个方面的知识点。下面是对该文档的详细解析: 计算机基础面试题 在计算机基础面试题部分...

    腾讯历年面试试题汇总

    以下是一些具体的面试题及其解析: 1. 宏定义比较大小:`#define BIG_THAN(a, b) (((b) – (a)&(0x1))>>31)` 这个宏利用了二进制的位运算来比较两个数的大小。当a大于b时,b-a会产生负数,而负数的最高位(符号位)...

    腾讯前端面试题

    在腾讯的前端面试中,面试官可能会关注一系列关键知识点,这些知识点涵盖了前端开发的基础到进阶内容。以下是对这些知识点的详细解释: 1. **JSONP原理**:JSONP(JSON with Padding)是一种解决跨域数据获取的问题...

    10道腾讯的Java面试题

    10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题10道腾讯的Java面试题

    腾讯Java面试题

    【腾讯Java面试题】 在Java领域,面试是评估求职者技术实力的重要环节,而腾讯作为中国互联网巨头之一,其Java面试题往往具有很高的参考价值。这些题目不仅涵盖基础语法、数据结构、算法、多线程、JVM优化等多个...

    腾讯笔试面试题汇总

    在IT行业中,尤其是在招聘领域,腾讯作为中国最大的互联网公司之一,其笔试和面试题往往备受关注。这些题目不仅反映了腾讯对技术人才的期待,也揭示了行业内的热门技术和招聘趋势。下面,我们将深入探讨腾讯笔试面试...

    2022年最新(腾讯)前端面试题真题解析

    本资源“2022年最新(腾讯)前端面试题真题解析”汇聚了最新的腾讯前端面试题,旨在帮助求职者更好地准备面试,提升成功入职的可能性。 面试题的解析通常会涵盖以下几个关键领域: 1. **基础概念**:面试题会涉及...

    腾讯面试题 + 笔试题(全)

    《腾讯面试题与笔试题详解》 在求职的道路上,面试和笔试是必不可少的环节,尤其是对于技术人才来说,能够顺利通过大公司的面试更是彰显个人实力的重要标志。本压缩包包含两份珍贵的资料——“腾讯笔试题专辑(含...

    IT公司面试笔试题库腾讯Javascript面试题.doc

    IT 公司面试笔试题库腾讯 Javascript 面试题 本资源汇集了腾讯 Javascript 面试题,涵盖了 Javascript 语言的基础知识、事件处理、函数、对象、变量、数据类型等方面。题库共 15 道题,分别涉及到 Javascript 语言...

    腾讯系统工程师面试题

    腾讯系统工程师面试题 腾讯系统工程师面试题 腾讯系统工程师面试题

    阿里面试题 腾讯面试题 百度面试题 华为面试题 京东面试题 头条面试题 经典面试题 程序员 IT经理 项目经理 面试题

    阿里面试20题 百度面试10题 华为面试10题 京东面试13题 腾讯面试37题 头条面试10题 项目经理面试常遇问题 经典面试题 程序员 IT经理 项目经理 面试题 研发经理 高级程序员 经典面试题

    腾讯笔试面试题

    腾讯近年来笔试面试题合集 包括校园招聘与实习生招聘 主要是技术类

    一道腾讯面试题

    这道2011年腾讯校招的面试题虽然没有明确的问题描述,但从标签中我们可以推测,它可能涉及C++、.NET、Java这三种编程语言中的某一方面,或者是关于算法设计与分析。面试题通常旨在考察候选人的思维能力、编程基础...

    互联网校招题库资料笔试面试真题具体面试问题回答技巧腾讯阿里培训资料.zip

    C++面试题笔试题 C语言 IQ智力面试题笔试题 JAVA笔试面试资料 NET面试题笔试题 web开发 数据库面试题笔试题 算法 数据结构 计算机基础 计算机网络 软件测试 ava工程师面试题大全-100%公司笔试题你都能碰到几个.docx ...

    前端面试题(包括百度阿里腾讯面试题).txt

    网盘下载pdf文件,包括常见前端面试题汇总,百度、阿里、腾讯校招面试题汇总,网盘下载pdf文件,65个文件

    腾讯09年测试面试题(亲身经历)

    【腾讯09年测试面试题解析】 面试题1:QQ登陆号码边界值测试有哪些 边界值测试是一种重要的软件测试方法,主要针对输入或输出范围的边界条件进行测试。对于QQ登录号码,边界值可能包括最小值(如0,因为QQ号通常从0...

    腾讯2013面试题

    【腾讯2013面试题】相关知识点解析 在IT行业,面试是评估候选人技能、经验和潜力的关键环节,尤其对于大型科技公司如腾讯而言。2013年的腾讯面试题,反映了当时的行业趋势和技术热点,同时也揭示了腾讯对人才的需求...

    华为 腾讯 测试面试题 面试技巧

    在IT行业的求职过程中,华为和腾讯...总的来说,华为和腾讯的测试面试题涵盖的范围广泛,既要求扎实的专业技能,又看重解决问题和适应企业环境的能力。通过全面的准备和持续的学习,相信你能成功应对这样的面试挑战。

Global site tag (gtag.js) - Google Analytics