好程序员Java教程分享JavaScript常见面试题二

   好程序员Java 教程分享JavaScript 常见面试题二:1. 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 操作符 ( 用于从对象中删除属性 ) 不能用在对象不可配置的属性上。当试图删除一个不可配置的属性时,非严格代码将默默地失败,而严格模式将在这样的情况下抛出异常。

  

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

  function foo1(){ return {

  bar: “hello”

  };

  }function foo2(){ return

  {

  bar: “hello”

  };

  }

  出人意料的是,这两个函数返回的内容并不相同。更确切地说是:

  console.log(“foo1 returns:”);console.log(foo1());console.log(“foo2 returns:”);console.log(foo2());

  将产生:

  foo1 returns:Object {bar: “hello”}foo2 returns:undefined

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

   原因与这样一个事实有关,即分号在JavaScript 中是一个可选项 ( 尽管省略它们通常是非常糟糕的形式 ) 。其结果就是,当碰到  foo2() 中包含  return 语句的代码行 ( 代码行上没有其他任何代码 ) ,分号会立即自动插入到返回语句之后。

   也不会抛出错误,因为代码的其余部分是完全有效的,即使它没有得到调用或做任何事情( 相当于它就是是一个未使用的代码块,定义了等同于字符串  “hello” 的属性  bar)

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

  

  3. NaN  是什么 ? 它的类型是什么 ? 你如何可靠地测试一个值是否等于  NaN ?

  NaN  属性代表一个“不是数字”的值。这个特殊的值是因为运算不能执行而导致的,不能执行的原因要么是因为其中的运算对象之一非数字 ( 例如,  “abc” / 4) ,要么是因为运算的结果非数字 ( 例如,除数为零 )

   虽然这看上去很简单,但 NaN  有一些令人惊讶的特点,如果你不知道它们的话,可能会导致令人头痛的 bug

   首先,虽然 NaN  意味着“不是数字”,但是它的类型,不管你信不信,是  Number

  console.log(typeof NaN === “number”); // logs “true”

   此外, NaN  和任何东西比较——甚至是它自己本身 ! ——结果是 false

  console.log(NaN === NaN); // logs “false”

   一种半可靠的方法来测试一个数字是否等于 NaN ,是使用内置函数  isNaN() ,但即使使用  isNaN()  依然并非是一个完美的解决方案。

   一个更好的解决办法是使用 value !== value ,如果值等于 NaN ,只会产生 true 。另外, ES6 提供了一个新的  Number.isNaN()  函数,这是一个不同的函数,并且比老的全局  isNaN()  函数更可靠。

  

  4. 下列代码将输出什么 ? 并解释原因。

  console.log(0.1 + 0.2);console.log(0.1 + 0.2 == 0.3);

   一个稍微有点编程基础的回答是:“你不能确定。可能会输出“ 0.3 ”和“ true ”,也可能不会。 JavaScript 中的数字和浮点精度的处理相同,因此,可能不会总是产生预期的结果。“

  以上所提供的例子就是一个演示了这个问题的典型例子。但出人意料的是,它会输出:

  0.30000000000000004false

  

  5. 讨论写函数  isInteger(x)  的可能方法,用于确定 x 是否是整数。

   这可能听起来是小菜一碟,但事实上,这很琐碎,因为ECMAScript 6 引入了一个新的正以此为目的  Number.isInteger()  函数。然而,之前的 ECMAScript 6 ,会更复杂一点,因为没有提供类似的  Number.isInteger()  方法。

   问题是,在ECMAScript 规格说明中,整数只概念上存在:即,数字值总是存储为浮点值。

   考虑到这一点,最简单又最干净的ECMAScript6 之前的解决方法 ( 同时也非常稳健地返回  false  ,即使一个非数字的值,如字符串或  null  ,被传递给函数 ) 如下:

  function isInteger(x) { return (x^0) === x; }

  下面的解决方法也是可行的,虽然不如上面那个方法优雅:

  function isInteger(x) { return Math.round(x) === x; }

   请注意 Math.ceil()  和  Math.floor()  在上面的实现中等同于  Math.round()

  或:

  function isInteger(x) { return (typeof x === ‘number’) && (x % 1 === 0);

  相当普遍的一个不正确的解决方案是:

  function isInteger(x) { return parseInt(x, 10) === x; }

   虽然这个以 parseInt 函数为基础的方法在  取许多值时都能工作良好,但一旦  取值相当大的时候,就会无法正常工作。问题在于  parseInt()  在解析数字之前强制其第一个参数到字符串。因此,一旦数目变得足够大,它的字符串就会表达为指数形式 ( 例如,  1e+21) 。因此, parseInt()  函数就会去解析  1e+21 ,但当到达  e 字符串的时候,就会停止解析,因此只会返回值  1 。注意:

> String(1000000000000000000000)’1e+21′> parseInt(1000000000000000000000, 10)1> parseInt(1000000000000000000000, 10) === 1000000000000000000000false

 

    原文作者:好程序员IT
    原文地址: http://blog.itpub.net/69913892/viewspace-2661619/
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞