美文网首页
中卷(1.1)

中卷(1.1)

作者: 风声233 | 来源:发表于2018-08-12 15:18 被阅读9次

内容大纲:
js 有七种内置类型:null、undefined、boolean、numebr、string、object 和 symbol,可以使用 typeof 运算符来查看。
变量没有类型,但他们持有的值有类型。类型定义了值的行为特征。
很多开发人员将 undefinedundeclared 混为一谈,但在 js 中它们是两码事。undefined 是值的一种。而 undeclared 则表示变量还没有被声明过。
遗憾的是 js 却将它们混为一谈,在我们试图访问“undeclared”变量时这样报错:Refference Error: a is not defined,并且 typeof 对 undefined 和 undeclared 变量都返回“undefined”。
然而,通过 typeof 的安全防范机制(阻止报错)来检查 undeclared 变量,又是是个不错的方法。

内置类型

  • 空值(null)
  • 未定义(undefined)
  • 布尔值(boolean)
  • 数字(number)
  • 字符串(string)
  • 对象(object)
  • 符号(symbol,ES6中新增)

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

typeof 能返回类型的字符串值,但是typeof对 null 的处理会有问题

typeof null === "object"; // true 

这个bug由来已久,也许永远不能修复,因为这牵涉到太多的Web系统。“修复”它可能会产生更多的bug。
我们需要用复合条件来检测null值的类型:

var a = null;
(!a && typeof a === "object"); // true

还有一种情况:

typeof function a(){/* .. */} === "function" // true

这样看来,函数也是js的一个内置类型。然而查阅规范就会知道,它实际上是object的一个“子类型”。具体来说,函数是“可调用对象”,他有一个内部属性[[Call]],该属性使其可以被调用。

值和类型

js中变量是没有类型的,只有值才有。变量可以随时持有任何类型的值。

var a = 42;
typeof a; // "number"
a = true;
typeof a; // "boolean"

undefined 和 undeclared

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

var a;
a; // undefined
b; // ReferenceError: b is not defined

浏览器对这类情况的处理令人抓狂。上例中,“b is not defined” 容易让人误以为是 “b is undefined”。其实,“undefined” 和 “is not defined” 是两码事。此时如果浏览器报错成 “b is not found” 会更准确。

更让人抓狂的是typeof处理 undeclared 变量的方式。例如:

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

请注意,b是一个undeclared的变量,但 typeof b 并没有报错是因为它有一个特殊的安全防范机制。

基于 typeof Undeclared 的安全防范机制

举个例子:

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

问题是如何在程序中检查全局变量 DEBUG 才不会出现 ReferenceError 错误。这时 typeof 的安全防范机制就成了我们的好帮手。

// ReferenceError
if (DEBUG) {
  console.log( "Debugging is starting" );
}

// safe
if (typeof DEBUG !== "undefined") {
  console.log( "Debugging is starting" );
}

还有另一种方法,就是检查所有全局变量是否是全局对象的属性,浏览器中的全局对象是 window。

if (window.DEBUG){
  // ..
}

if (! window.DEBUG){
  // ..
}

一些开发人员不喜欢通过 window 来访问全局对象,尤其当代码需要运行在多种 js 环境中时(不仅仅是浏览器,还有服务端,如 node.js 等),因为此时全局对象并非总是 window。

阅读下一篇

相关文章

  • 中卷(1.1)

    内容大纲:js 有七种内置类型:null、undefined、boolean、numebr、string、obje...

  • 深入理解docker volume

    1 docker 数据卷 1.1 什么是Docker Volume ​ Docker Volume 即数据卷,...

  • 《清欢三卷》1.1

    不得不说,因了近三年的学科中心工作,更多的时间和精力都给了教育梦想(虽然并没有什么成就),与之匹配的自是一本...

  • 卷积神经网络基础讲解

    本文首发于:人工智能A7论坛 转载请注明出处 1什么是卷积神经网络(CNN) 1.1 什么是卷积操作 CNN中的卷...

  • 【罗织经】五《制敌卷》

    【罗织经】五《制敌卷》 1.1 人皆有敌也。人人都有宿敌。 【七绝】制敌卷11 文/林海 人存宿敌刺如...

  • 5)容器数据卷(3)-数据卷

    1. 直接命令添加 1.1 命令 1.2 查看数据卷是否挂载成功 docker inspect 容器ID 1.3 ...

  • Kubernetes-卷/存储卷(emptyDir/hostPa

    1 卷的介绍 1.1 卷的概念   在搞容器的时候,我们在处理完应用如何起,如何运行,最终落实到数据的时候,我们又...

  • DAY65:减肥日记-体重飙升

    今天又下雨,没有运动,走路1.1万步。 一、运动清单如下:跑步0公里开合跳0个卷腹摸膝0个屈腿卷腹0个抬腿卷腹0个...

  • 1.1宇宙中的地球

    1. 课程标准 描述地球所处的宇宙环境,运用材料说明地球是太阳系中的一颗既普通又特殊的行星 2. 标准解读 了解 ...

  • 《聪训斋语》卷一之1.1

    原文 圃翁曰:圣贤领要之语,曰:“人心惟危,道心惟微。”危者,嗜欲之心,如堤之束水,其溃甚易。一溃则不可复收也。微...

网友评论

      本文标题:中卷(1.1)

      本文链接:https://www.haomeiwen.com/subject/mjyjbftx.html