分析JavaScript的数据类型与变量

发表于:2018-11-16 10:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:京东研发虚拟平台    来源:51Testing软件测试网原创

  6、加法
  加法中特别注意的是,数字和字符串相加,将数字转为字符串。
  '1' + 2 => // '12'
  1 + 2 => // 3
  对于对象和布尔值,调用它们的 toString() 方法得到对应的字符串值,然后进行字符串相加。对于 undefined 和 null 调用 String() 取得字符串 'undeifned' 和 'null'。
  { value: 1 } + true // => "[object Object]true"
  7、减法
  对于字符串、布尔值、null 或者 undefined,自动调用 Number(),转换结果若为 NaN,那么最终结果为 NaN。
  对于对象,先调用 valueOf(),如果得到 NaN,结果为 NaN。如果没有 valueOf(),则调用 toString()。
  8、乘法、除法
  对于非数值,都会调用 Number() 转型函数。
  变量提升与暂时性死区
  JS 中有三种声明变量的方式:var, let, const。
  var 声明变量最大的一个特点是存在变量提升。
   console.log(a); // undefined
  var a = 1;
  console.log(a); // 1
  第一个打印结果表示,在声明变量 a 之前,a 就已经可以访问了,只不过并未赋值。这就是变量提升现象。(具体原因,我放在后面分析作用域的时候来写)
  let 和 const 就不存在这个问题,但是又引入了暂时性死区这样的概念。
  /**
  * 这上面都属于变量 a 的暂时性死区
 * console.log(a) // => Reference Error
  */
  let a = 1;
  console.log(a); // => 1
  即声明 a 之前,不能够访问 a,而直接报错。
  而暂时性死区的出现又引出另外一个问题,即 typeof 不再安全。你可以参考这篇文章 http://es-discourse.com/t/why...
  补充:一个经典面试题
   for (var i = 0; i < 4; i++) {
  setTimeout(function(){
  console.log(i);
  }, i * 1000);
  }
  我先不再这里展开分析,我打算放到异步与事件循环机制中去分析。不过这里将 var 替换成 let 可以作为一种解决方案。如果你有兴趣,也可以先去分析。
  对于 const,这里再补充一点,用于加深对基本类型和引用类型的理解。
   const a = 1;
  const b = { value: 1 };
  a = 2; // => Error
  b.value = 2; // => 2
  b = { value: 2 }; // => Error
  本质上,const 并不是保证变量的值不得改动,而是变量指向的内存地址不得改动。
  声明全局变量
  直接通过 var 声明全局变量,这个全局变量会作为 window 对象的一个属性。
   var a = 1;
  window.a // => 1
  
  在这里提出两个问题,一是 let 声明的全局变量会成为 window 的属性吗?二是 var 声明的全局变量和直接在 window 创建属性有没有区别?
  先来回答第一问题。let 声明的全局变量不会成为 window 的属性。用什么来支撑这样的结论呢?在 ES6 中,对于 let 和 const 声明的变量从一开始就形成封闭作用域。想想之前的暂时性死区。
  第二个问题,var 声明的全局变量和直接在 window 创建属性存在着本质的区别。先看下面的代码:
   var a = 1;
  window.a // => 1
  window.b = 2;
  delete window.a
  delete window.b
  window.a // => 1
  window.b // => undefined
  我们可以看到,直接创建在 window 上的属性可以被 delete 删除,而 var 创建的全局属性则不会。这是现象,通过现象看本质,二者本质上的区别在于:
  使用 var 声明的全局变量的 [[configurable]] 数据属性的值为 false,不能通过 delete 删除。而直接在对象上创建的属性默认 [[configurable]] 的值为 true,即可以被 delete 删除。(关于 [[configurable]] 属性,在后面的文章中分析对象的时候还会提到)
  小结
  在这篇「数据类型与变量」文章中,分析了 7 个大类。再来回顾一下:
  基本类型、引用类型、参数传递方式、如何判断数据类型、数据类型如何转换、变量提升与暂时性死区、声明全局变量。
  这些不仅是校招面试中的高频考点,也是学习 JS 必不可少的知识点。

    上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号