编程语言
首页 > 编程语言> > 本银钻国际客服15687949443程序的JavaScript面试问题和答案

本银钻国际客服15687949443程序的JavaScript面试问题和答案

作者:互联网

  运用 typeof bar === "object" 来确定 bar 是否是目标的潜在陷阱是什么?如何避免这个陷阱?

  虽然 typeof bar === "object" 是查看 bar 是否目标的牢靠办法,令人惊讶的是在JavaScript中 null 也被认为是目标!

  因而,令大多数开发人员惊讶的是,下面的代码将输出 true (而不是false) 到控制台:

  只要清楚这一点,一起查看 bar 是否为 null,就能够很简单地避免问题:

  要答全问题,还有其他两件作业值得留意:

  首先,上述解决方案将回来 false,当 bar 是一个函数的时分。在大多数情况下,这是希望行为,但当你也想对函数回来 true 的话,你能够修正上面的解决方案为:

  第二,上述解决方案将回来 true,当 bar 是一个数组(例如,当 var bar = [];)的时分。在大多数情况下,这是希望行为,由于数组是真正的目标,但当你也想对数组回来 false 时,你能够修正上面的解决方案为:

  或者,假如你运用jQuery的话:

  下面的代码将输出什么到控制台,为什么?

  由于 a 和 b 都界说在函数的封闭范围内,并且都始于 var关键字,大多数JavaScript开发人员希望 typeof a 和 typeof b 在上面的比如中都是undefined。

  然而,现实并非如此。这里的问题是,大多数开发人员将句子 var a = b = 3; 过错地理解为是以下声明的简写:

  但现实上,var a = b = 3; 实践是以下声明的简写:

  因而(假如你不运用严厉方式的话),该代码段的输出是:

  但是, b 如何才干被界说在封闭函数的范围之外呢?是的,既然句子 var a = b = 3; 是句子 b = 3; 和 var a = b;的简写, b 最终成为了一个全局变量(由于它没有前缀 var 关键字),因而仍然在范围内乃至封闭函数之外。

  需求留意的是,在严厉方式下(即运用 use strict),句子var a = b = 3; 将生成ReferenceError: b is not defined的运行时过错,从而避免任何不然可能会导致的headfakes /bug。 (仍是你为什么应该理所当然地在代码中运用 use strict 的最好比如!)

  下面的代码将输出什么到控制台,为什么?

  上面的代码将输出以下内容到控制台:

  在外部函数中, this 和self 两者都指向了 myObject,因而两者都能够正确地引用和拜访 foo。

  在内部函数中, this 不再指向 myObject。其成果是,this.foo 没有在内部函数中被界说,相反,指向到本地的变量self 保持在范围内,并且能够拜访。 (在ECMA 5之前,在内部函数中的this 将指向全局的 window 目标;反之,由于作为ECMA 5,内部函数中的功用this 是未界说的。)

  封装JavaScript源文件的全部内容到一个函数块有什么意义及理由?

  这是一个越来越普遍的做法,被许多盛行的JavaScript库(jQuery,Node.js等)选用。这种技能创立了一个围绕文件全部内容的闭包,也许是最重要的是,创立了一个私有的命名空间,从而有助于避免不同JavaScript模块和库之间潜在的称号冲突。

  这种技能的另一个特点是,答应一个易于引用的(假定更短的)别号用于全局变量。这一般用于,例如,jQuery插件中。jQuery答应你运用jQuery.noConflict(),来禁用 $ 引用到jQuery命名空间。在完结这项作业之后,你的代码仍然能够运用$ 运用这种闭包技能,如下所示:

  在JavaScript源文件的开头包括 use strict 有什么意义和好处?

  关于这个问题,既扼要又最重要的答案是,use strict 是一种在JavaScript代码运行时自动实行更严厉解析和过错处理的办法。那些被疏忽或静静失利了的代码过错,会发生过错或抛出反常。一般而言,这是一个很好的做法。

  严厉方式的一些首要优点包括:

  使调试更加简单。那些被疏忽或静静失利了的代码过错,会发生过错或抛出反常,因而尽早提示你代码中的问题,你才干更快地指引到它们的源代码。

  避免意外的全局变量。假如没有严厉方式,将值分配给一个未声明的变量会自动创立该称号的全局变量。这是JavaScript中最常见的过错之一。在严厉方式下,这样做的话会抛出过错。

  消除 this 强制。假如没有严厉方式,引用null或未界说的值到 this 值会自动强制到全局变量。这可能会导致许多令人头痛的问题和让人恨不能拔自己头发的bug。在严厉方式下,引用 null或未界说的 this 值会抛出过错。

  不答应重复的特点称号或参数值。当检测到目标(例如,var object = {foo: "bar", foo: "baz"};)中重复命名的特点,或检测到函数中(例如,function foo(val1, val2, val1){})重复命名的参数时,严厉方式会抛出过错,因而捕捉几乎能够肯定是代码中的bug能够避免浪费很多的盯梢时刻。

  使eval() 更安全。在严厉方式和非严厉方式下,eval() 的行为方法有所不同。最显而易见的是,在严厉方式下,变量和声明在 eval() 句子内部的函数不会在包括范围内创立(它们会在非严厉方式下的包括范围中被创立,这也是一个常见的问题源)。

  在 delete运用无效时抛出过错。delete操作符(用于从目标中删去特点)不能用在目标不行装备的特点上。当企图删去一个不行装备的特点时,非严厉代码将静静地失利,而严厉方式将在这样的情况下抛出反常。

  考虑以下两个函数。它们会回来相同的东西吗? 为什么相同或为什么不相同?

  出其不意的是,这两个函数回来的内容并不相同。更切当地说是:

  将发生:

  这不仅是令人惊讶,并且特别让人困惑的是, foo2()回来undefined却没有任何过错抛出。

  原因与这样一个现实有关,即分号在JavaScript中是一个可选项(虽然省掉它们一般是十分糟糕的方式)。其成果就是,当碰到 foo2()中包括 return句子的代码行(代码行上没有其他任何代码),分号会当即自动插入到回来句子之后。

  也不会抛出过错,由于代码的其余部分是完全有用的,即使它没有得到调用或做任何作业(相当于它就是是一个未运用的代码块,界说了等同于字符串 "hello"的特点 bar)。

  这种行为也支持放置左括号于JavaScript代码行的结尾,而不是新代码行开头的约好。正如这里所示,这不仅仅只是JavaScript中的一个风格偏好。

标签:bar,代码,JavaScript,过错,本银,var,严厉,15687949443
来源: https://www.cnblogs.com/dfsdfgdfg/p/10490709.html