你不知道的JavaScript——类型

一、ECMAScript语言中所有的值均有一个对应的语言类型。ECMAScript语言类型包括Undefined、Null、Boolean、String、Number和Object。

  我们这样来定义类型:对于语言引擎和开发人员来说,类型是值的内部特征,它定义了值的行为,以使其区别于其它值。

  JS有七种内置类型:

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

  注意:除了对象外,其他统称为“基本类型”。

  我们可以用typeof运算符来查看值的类型,它返回的是类型的字符串值。例如:

      1. typeof undefined   ===  "undefined";
      2. typeof true             ===  "boolean";
      3. typeof 42                    ===        "number";
      4. typeof "42"                 ===         "string";
      5. typeof { life:42 }          ===         "object";
      6. typeof Symbol             ===         "symbol";     //ES6中新加入的类型

  但是 typeof null === "object";   这个是js的一个bug,由来已久(20多年了)。

  那么我们需要符合条件来检测null值的类型

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

  函数是“可调用对象”,实际上function(函数)是object的一个“子类型”,它有一个内部属性[[Call]],该属性使其可以被调用。

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

    函数不仅是对象,还可以拥有属性。例如:

  

function a(b,c){
    /*...*/
}
//函数对象的length属性是其声明的参数的个数,那么:
a.length;//2

  无独有偶,数组也是object的一个“子类型”,数组的元素按数字来进行索引(而非普通像对象那样通过字符串键值对),其length属性是元素的个数。

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

二、值和类型

  JavaScript中的变量是没有类型的,只有值才有。变量可以随时持有任何类型的值。也就是说语言引擎不要求变量总是持有与其初始值同类型的值。

  

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

a=true;
typeof a;    //"boolean"

typeof typeof 42    //"string"

//typeof 42 首先返回字符串“number”,然后typeof “number” 返回 “string”

  undefined和undeclared完全是两回事。

变量在未持有值的时候为undefined。此时typeof 返回“undefined”:

首先看下undefined

var a;
typeof a;    //"undefined"

var b=42;
var c;

//later

b=c;

typeof b;    //"undefined"
typeof c;    //"undefined"

undefined和undeclared的区别:

var a;

a;  //fundefined

b;  //ReferenceError: b is not defined   其实这里的意思是:b is not declared 可是sb浏览器不会说那么清楚,我们需要原谅它。

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

var a;

typeof a;  //"undefined"

typeof b;  //"undefined"   而且这里没有报错,是因为typeof 有一个特殊的安全防范机制,这里typeof如果能返回undeclared而非undefined的话,多好啊,可惜sb浏览器不会!
时间: 2024-10-13 10:23:22

你不知道的JavaScript——类型的相关文章

你不知道的JavaScript之类型

JavaScript是一门简单易用的语言,应用广泛,同时它的语言机制又十分复杂和微妙,即使经验丰富的开发人员也需要用心学习才能真正掌握. <你不知道的JavaScript>中是这样定义类型的: 类型是值的内部特征,它定义了值的行为,以使其区别于其他值. 这样的定义可能略简单了一些,不够已经足够让我们去理解类型的含义. 不得不提的强制类型转换 在JavaScript中,强制类型转换无处不在,在我们的程序中,有意无意地,都经常地利用到强制类型转换.它给我们带来了许多便利,同时也容易造成某一些坑.当

你不知道的Javascript(上卷)读书笔记之一 ---- 作用域

你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此书中,开始便提出:Javascript是一门编译型语言,我一开始以为这是国内翻译的锅,翻译的不够准确,后来我还专门去github看了,作者确实是将Js描述为一门编译型语言(compiled language).然而我认为作者更想表达的是Js也拥有和Java一般的特定的编译过程.而不是传统得认为只是单纯的进行&

你不知道的javascript(中卷)笔记

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>你不知道的javascript(中卷)</title> </head> <body> <script type="text/javascript"> /* //封装对象包装 var a = new Boolean(false); if(!a)

JavaScript作用域闭包(你不知道的JavaScript)

JavaScript闭包,是JS开发工程师必须深入了解的知识.3月份自己曾撰写博客<JavaScript闭包>,博客中只是简单阐述了闭包的工作过程和列举了几个示例,并没有去刨根问底,将其弄明白! 现在随着对JavaScript更深入的了解,也刚读完<你不知道的JavaScript(上卷)>这本书,所以乘机整理下,从底层和原理上去刨一下. JavaScript并不具有动态作用域,它只有词法作用域.词法作用域是在写代码或者说定义时确定的,而动态作用域是在运行时确定的.了解闭包前,首先我

JavaScript提升(你不知道的JavaScript)

最近,在读<你不知道的JavaScript(上卷)>这本书,书中详细阐述了JavaScript众多重要但经常被大家忽略的点,在此强烈推荐!!!书中,第4章讲述了"提升",从示例出发讲述了变量和函数提升的过程,纠正了自己以前错误的理解(相信好多人理解都是错误)! 我们习惯将var a = 2;看做一个声明,而实际上JavaScript引擎不这么认为!下面几个示例让你彻底搞懂JavaScript中的变量提升! 示例1: a = 2; var a ; console.log(a)

《你不知道的JavaScript》整理(二)——this

最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,这次研究了一下“this”. 当一个函数被调用时,会创建一个活动记录(执行上下文). 这个记录会包含函数在哪里被调用(调用栈).函数的调用方法.传入的参数等信息. this就是记录的其中一个属性,会在函数执行的过程中用到. this既不指向函数自身也不指向函数的作用域. this实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用. 一.调用位置 调用位置就在当前正在执行的函数的前一个调用中

《你不知道的JavaScript》整理(一)——作用域、提升与闭包

最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,里面分析了很多基础性的概念. 可以更全面深入的理解JavaScript深层面的知识点. 一.函数作用域 1)函数作用域 就是作用域在一个“Function”里,属于这个函数的全部变量都可以在整个函数的范围内使用及复用. function foo(a) { var b = 2; function bar() { // ... } var c = 3; } bar(); // 失败 console.log( a,

《你不知道的JavaScript》系列分享专栏

<你不知道的JavaScript>系列分享专栏 你不知道的JavaScript"系列就是要让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途 <你不知道的JavaScript>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/205515.html 文章 你不知道的JavaScript--Item3 隐式强制转换 你不知道的JavaScript--Item4 基本

JavaScript类型判断

JavaScript的数据类型可以分为:标准类型和对象类型. 标准类型有:undefined Null Boolean Date Number Object 对象类型(构造器类型)有:Boolean Date Number Object Array Date Error Function RegExp 用来判断数据类型的一般有四种方式,分别是: 1.typeof 可以识别标准类型(Null除外) 不能识别对象类型(Function除外) 2.Prototype.toString() 可以识别标准