《你不知道的JavaScript》读书笔记(类型、值和类型)

ES5.1中将js的类型做了这样的界定

本规范中的运算法则所操纵的值均有相应的类型,本节中定义了所有可能出现的类型。ECAMScript类型又进一步细分为语言类型和规范类型。
ECMAScript语言中所有的值都有一个对应的语言类型。ECMAScript语言类型包括Undefined、Null、Boolean、String、Number和Object

JavaScript中的类型也很重要

要正确合理地精细类型转换,我们必须掌握JavaScript中的各个类型及其内在行为。几乎所有的JavaScript程序都会涉及各种形式的强制类型转换。处理这些情况是我们需要有充分的把握和自信

强制类型转换是JavaScript开发人员最头疼的问题之一,它常备诟病为语言设计上的缺陷,太危险,应该束之高阁。

内置类型

  • 空值(null)

  • 未定义(undefined)

  • 布尔值(boolean)

  • 数字(number)

  • 字符串(string)

  • 对象(object)

  • 符号(symbol,ES6中新增)

除了对象之外,其他的类型都统称为“基本类型”

但是有意思的是,其中类型和他们的字符串值并不是一一对应的:

我们需要使用复合条件来检测null值的类型

null是基本类型中的为一个假值
还有一种情况typeof function a(){/* */} ==="function"返回true这让function函数看上去也是一个JavaScript的一个内置类型,然而查阅规范就会知道,它实际上是object的一个“子类型”。具体来说,函数调用的队形,它有一个内部属性[[Call]],该属性使其可以被调用

JavaScript支持数组,但数组也是对象

值和类型

JavaScript中的变量是没有类型的,只有才有。也就是说JavaScript不做“类型强制”,语言引擎不需要变量总是持有与初始值相同类型的值。

在对变量进行typeof操作时,得到的结果并不是该变量的类型,而是该变量持有的值的类型。

typeof总是返回一个字符串

undefined和undecared

变量在未持有值的时候为undefine,此时typeof返回的是"undefined"。

已在作用域中声明但还没有赋值的变量,是undefined,相反,还没有在作用域中声明过的变量,是undeclared。

浏览器对这类情况的处理方式让人抓狂,需要强调的是 "undefined和is not defined"是两码事
更让人抓狂的是typeof对undeclared变量的方式:

typeof a;//"undefined"
typeof b;//"undefined"

对于undeclared变量,typeof照样返回"undefined",这是因为typeof一个特殊的安全防范机制。

typeof Undecared安全防范机制

该安全防范机制对在浏览器中运行的JavaScript代码来说还是很有帮助的,因为多个脚本文件会在共享的全局命名空间中加载变量。

举个简单的例子,在程序中使用全局变量DEBUG作为“调试模式”的开关,在输出调试信息到控制台之前我们会检查DeBug变量是否已被声明。顶层的全局变量声明var DEBUG=true只在debug.js文件中才有,而该文件只有在开发和测试时才会被加载到浏览器,在生产环境中不予加载。

问题时如何在程序中检查变量DEGUG才不会出现ReferenceError错误,此时typeof安全防范机制就成了好帮手:

错误
if(DEBUG){
  console.log("Debugging is starting");
}
//这样时安全的
if(typeof DEGUG !=="undefined"){
  console.log("Debugging is starting");
}

这种处理方法不仅对用户定义对变量(比如DEBUG)有用,也对内建对API有帮助。

还有一种不通过typeof安全防范机制的方法,就是检查所有全局变量是否是全局对象的属性,浏览器的全局对象是window

与undeclared不同,访问不存在的对象属性不会产生ReferenceError错误

从技术角度看,typeof的安全防范机制对于非全局变量也很管用。

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...