JavaScript类型介绍

个人第一篇文章

从开始学前端直至如今已有一年的时间了,期间碰见了不少事情,也经历了各式各样的技术问题,为了让本身摆脱这些这些问题,最后养成了看书的习惯。由于每次看完总以为本身内功又增了,哪怕只是一点。惋惜的是每次看完都会忘掉一些,尤为是没有本身的实践和知识点太多时总会遗忘一些,但我不但愿这种事情发生,javascript

可能只是由于这一点,之后就会找几天的bug,这是每一个程序员都不敢预想的场景。最后我决定把我天天对知识的累积,用我理解的角度去记录下来。笔记和文章惟一的不一样前者是私有,后者是公开的,但愿经过我对它理解能够帮助他人,也请你们能指出文章中的问题,感激涕零。前端

  1. 类型

ECMAScript语言中全部的值都对应一个类型。语言类型包括:Undefined,Null,Boolean,String,Number,Object。对于语言引擎和开发人员来讲,类型是值的内部特征,它定义了值的行为,是全部编程语言的共有的概念,并使其区别于其余值。java

抛开学术界对类型定义的分歧,为何说JavaScript是否有类型也很重要呢?让咱们来详细介绍一下,关于JavaScript类型这部分的知识。程序员

内置类型

首先JavaScript有七种内置类型:web

  • 空值(Null)编程

  • 未赋值(Undefined)数组

  • 字符串(String)浏览器

  • 数字(Number)安全

  • 对象(Object)编程语言

  • 布尔值(Boolean)

  • 符号(Symbol ES6中新增)

注: 除对象之外其余统称为基本类型.

下面咱们用typeof查看这七种类型值,可是结果却和它们的类型名称不尽相同。

typeof {community:"sf"} // "Object"
    typeof undefined        // "undefined"
    typeof 12               // "number"
    typeof "javascript"     // "string"
    typeof true             // "boolean"
    typeof Symbol           // "symbol"

上面的这六种类型都和我typeof出来的字符串互相对应。

咦? null 哪去了?如今我门来单独看案它的类型.

typeof null === "object"     //true

你可能会看到null并非"null",这是JavaScript一个历史悠久的bug,可是因为web系统对其的依赖,很难修复,这个bug也许会一直存在雨javascript中。咱们须要铭记在心,避免之后程序出现问题。咱们再用复合条件来检测一下null值的类型:

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

由此咱们知道,null隐式强制类型转换成了反值为true(说明null的布尔值为false),并对它的类型作出全等比较,最后返回true。

typeof function(){}  // "function"

这样看来,function也是JavaScript的一个内置类型吧?能够去查阅一下ECMAScript规范,它实际上是Object类型中的子类型,也就是说它属于Object类型范畴以内,具体来讲,函数是可调用对象,它有一个内部属性[[call]]使其能够被调用。
那么它有什么对象的特征呢?让咱们来在控制台中打印出来看一下.

图片描述

能够看到,函数当中有一些可读取属性,就好比 .length属性,表明的是其声明的参数个数,

var fun = function(a,b){}
fun.length //2

查看了function,让咱们再来查看一下Array类型.

typeof [1,2,3] === "object"  //true

它们都同属于Object子类型, 数组的元素按数字顺序来进行索引(非字符串那样经过字符串键值),其length属性是其数组元素个数。


值和类型

JavaScript中的类型是相对于他的值来定义的,也就是说衡量类型的永远都是值自己,与变量无关,变量只是储存值的一个容器,在这个容器中有不肯定的值类型

JavaScript 不作类型强制,也就是说,语言引擎不要求变量老是与初始化值同类型的值。

var a = 10;
   typeof a    // "number"

   a = true;
   typeof a    //"boolean"

typeof 总会返回一个字符串

typeof typeof 10     //string

typeof 10 返回为 "number" 以后再次使用typeof "number" 结果为 ”string“


Undeclared与Undefined

咱们都知道undefined表明未被复制,它也是咱们七大类型中的一种,以下:

var a;
     typeof a      //"undefined"
     
     var b = 20;
     var c;
     
     b = c;
     typeof b      // "undefined"
     typeof c      // "undefined"

可能有些朋友对Undeclared有些陌生,让咱们来看一下它与Undefined的定义:
在做用域中未被声明过的变量为 Undeclared。
做用域中声明了且未被赋值的为Undefined

遗憾的是咱们在js环境下测试时,两种状况却并无出现Undeclared,这是为何呢?

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

"b is not defined " 容易让人误解为与undefined的性质同样,其它们两个是两码事此时浏览器若是报成 b is not found 或者 b is not declared会更加准确。

虽然JS当中没有Undeclared的显式概念,可是咱们要知道它是存在的,Undefined 与 Undeclared 是彻底两种不一样的场景;

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

对于Undeclared照样返回了undefined。这里b虽然是一个Undeclared变量,但typeof b 它并无报错,这是由于typeof有一套安全防范机制。


typeof Undeclared

该安全机制在浏览器运行时的JavaScript代码来讲是颇有帮助的,由于多个脚本文件会在共享的全局命名空间中加载变量。

举个例子 ,若是咱们在布尔环境下为一个值作非空判断。

if(DETELE){}  // ReferenceError: detele is not defined

抛出了错误,上面已经解释过,此处再也不强调它的准确意义。为了不程序出现这种促五,咱们可使用 typeof 来对它进行改造。

if(typeof DETELE === "undefined"){  }

一样属于非空条件判断,后者的优点,我想你们已经看到了,不论什么时候它都不会报错,只是淡出的返回布尔值

能够看到 typeof 的安全防范机制为咱们提供了很是便捷的方式,还有一种方式以下:

if(window.DETELE){}

若是这个变量存在于全局中,咱们能够利用它,全局变量中默认为全局属性的特性,来经过查找对象属性的方式去查看它,固然这只是在全局条件下,当非全局条件下,咱们能够继续使用typeof去判断。

相关文章
相关标签/搜索