带你规避一些JS容易出错的坑

变量提升


  1. var name = 'World!'
  2. (function () { 
  3.     if (typeof name === 'undefined') { 
  4.         var name = 'Jack'
  5.         console.log('Goodbye ' + name); 
  6.     } else { 
  7.         console.log('Hello ' + name); 
  8.     } 
  9. })(); 

在 JavaScript中, Fun 和 var 会被提升

相当于


  1. var name = 'World!'
  2. (function () { 
  3.     var name
  4.     if (typeof name === 'undefined') { 
  5.         name = 'Jack'
  6.         console.log('Goodbye ' + name); 
  7.     } else { 
  8.         console.log('Hello ' + name); 
  9.     } 
  10. })(); 

巩固一下:


  1. var str = 'World!';    
  2.    (function (name) { 
  3.    if (typeof name === 'undefined') { 
  4.        var name = 'Jack'
  5.        console.log('Goodbye ' + name); 
  6.    } else { 
  7.        console.log('Hello ' + name); 
  8.    } 
  9.    })(str); 
  10.    答案:Hello World 因为name已经变成函数内局部变量 

最大整数


  1. var END = Math.pow(2, 53); 
  2. var START = END – 100; 
  3. var count = 0; 
  4. for (var i = START; i <= END; i++) { 
  5.     count++; 
  6. console.log(count); 

一个知识点:Infinity


  1. 在 JS 里, Math.pow(2, 53) == 9007199254740992 是可以表示的最大值. 最大值加一还是最大值. 所以循环不会停. 

稀疏数组与密数组


  1. var ary = [0,1,2]; 
  2. ary[10] = 10; 
  3. ary.filter(function(x) { return x === undefined;}); 

执行结果如何呢?

做这个题目,你需要了解稀疏数组和密集数组

  • 译 JavaScript中的稀疏数组与密集数组
  • Array/filter

看过源码的同学应该知道,filter源码中,会去判断数组的这个索引值是不是数组的一个属性,有兴趣的同学可以看看我写的这篇关于数组的:[干货👍]从详细操作js数组到浅析v8中array.js


  1. in ary; => true 
  2. in ary; => false 
  3. 10 in ary; => true 
  4. 也就是说 从 3 – 9 都是没有初始化的'坑'!, 这些索引并不存在与数组中. 在 array 的函数调用的时候是会跳过这些'坑'的. 

所以答案就是[]

浮点运算


  1. var two   = 0.2 
  2. var one   = 0.1 
  3. var eight = 0.8 
  4. var six   = 0.6 
  5. [two – one == one, eight – six == two] 

你认为结果是多少呢?面试遇到这个问题,应该怎么回答呢?


  1. [true,false

可以看看这些文章:

  • 探寻 JavaScript 精度问题以及解决方案
  • 从0.1+0.2=0.30000000000000004再看JS中的Number类型

Switch


  1. function showCase(value) { 
  2.     switch(value) { 
  3.     case 'A'
  4.         console.log('Case A'); 
  5.         break; 
  6.     case 'B'
  7.         console.log('Case B'); 
  8.         break; 
  9.     case undefined: 
  10.         console.log('undefined'); 
  11.         break; 
  12.     default
  13.         console.log('Do not know!'); 
  14.     } 
  15. showCase(new String('A')); 

运行结果如何呢?

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章