你不知道的JavaScript——类型
一、ECMAScript语言中所有的值均有一个对应的语言类型。ECMAScript语言类型包括Undefined、Null、Boolean、String、Number和Object。
我们这样来定义类型:对于语言引擎和开发人员来说,类型是值的内部特征,它定义了值的行为,以使其区别于其它值。
JS有七种内置类型:
- 空值(null)
- 未定义(undefined)
- 布尔值(boolean)
- 数字(number)
- 字符串(string)
- 对象(object)
- 符号(symbol,ES6中新增)
注意:除了对象外,其他统称为“基本类型”。
我们可以用typeof运算符来查看值的类型,它返回的是类型的字符串值。例如:
- typeof undefined === "undefined";
- typeof true === "boolean";
- typeof 42 === "number";
- typeof "42" === "string";
- typeof { life:42 } === "object";
- 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;//
无独有偶,数组也是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; //undefined 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浏览器不会!
你不知道的JavaScript——类型的更多相关文章
- 你不知道的JavaScript之类型
JavaScript是一门简单易用的语言,应用广泛,同时它的语言机制又十分复杂和微妙,即使经验丰富的开发人员也需要用心学习才能真正掌握. <你不知道的JavaScript>中是这样定义类型 ...
- 《你不知道的JavaScript》整理(二)——this
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,这次研究了一下“this”. 当一个函数被调用时,会创建一个活动记录(执行上下文). 这个记录会包含函 ...
- 《你不知道的JavaScript》整理(一)——作用域、提升与闭包
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,里面分析了很多基础性的概念. 可以更全面深入的理解JavaScript深层面的知识点. 一.函数作用域 ...
- 你不知道的Javascript(上卷)读书笔记之一 ---- 作用域
你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此 ...
- 你不知道的JavaScript上卷笔记
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...
- 【读书笔记】-- 你不知道的JavaScript
<你不知道的JavaScript>是一个不错的JavaScript系列书,书名可能有些标题党的意思,但实符其名,很多地方会让你有耳目一新的感觉. 1.typeof null === &qu ...
- 读书笔记-你不知道的JavaScript(上)
本文首发在我的个人博客:http://muyunyun.cn/ <你不知道的JavaScript>系列丛书给出了很多颠覆以往对JavaScript认知的点, 读完上卷,受益匪浅,于是对其精 ...
- 读《你不知道的JavaScript(上卷)》后感-作用域闭包(二)
github原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们, ...
- 你不知道的javaScript上卷(第一章 作用域是什么)
在写这篇博客时这本书我已经是看过一遍了,为了加深印象和深入学习于是打算做这系列的前端经典书籍导读博文,大家如果觉得这本书讲的好可以自己买来看看,我是比较喜欢看纸质版书的,因为这样才有读书的那种感觉. ...
随机推荐
- 隐马尔可夫模型(HMM)
隐马尔可夫模型 (Hidden Markov Model,HMM) 最初由 L. E. Baum 和其它一些学者发表在一系列的统计学论文中,随后在语言识别,自然语言处理以及生物信息等领域体现了很大的价 ...
- 深入分析动态管理Fragment
一.Fragment与Activity的关系 要理解动态管理Fragment首先要理解一下Fragment与Activity的关系 Fragment可以理解为将Activity划分为若干个片段,Fra ...
- Go语言中函数的实现
Go 语言函数 函数是基本的代码块,用于执行一个任务. Go 语言最少有个 main() 函数. 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务. 函数声明告诉了编译器函数的名称,返回 ...
- KeepAlived+Nginx实现高可用负载
一.环境及安装版本: centos6.5.Nginx1.4.7.keepalived1.3.2 虚拟IP 真是IP Nginx端口 主从分配 10.0.90.215 10.0.90.217 80 MA ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(三)用户接口层之RTSP命令
截至版本1.2.3,myRtspClient函数库共支持以下6个RTSP命令: (1)OPTIONS (2)DESCRIBE (3)SETUP (4)PLAY (5)PAUSE (6)TEARDOWN ...
- 高效查看MySQL帮助文档的方法 (转)
在mysql的使用过程中, 可能经常会遇到以下问题: 某个操作语法忘记了, 如何快速查找? 如何快速知道当前版本上某个字段类型的取值范围? 当前版本都支持哪些函数?希望有例子说明.. 当前版本是否支持 ...
- EasuUI-js(EasyUI formatter格式化教程)常用判断收集
YN标记: formatter : function(c1, row,index) { var a = ""; if(c1 == "Y"){ a = a + & ...
- Servlet---基础、转发重定向、编码问题解析
servlet 是运行在服务器端的三大web组件之一 [web三大组件:Servlet Filter Listener] 是处理客户端请求的 还有表单提交的请求 接 ...
- Java内存模型_基础
线程之间的通信机制有两种: 1.共享内存:线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式的通信. 2.消息传递:线程之间没有公共状态,线程之间必须发送消息来显示的进行通信 同步:是指程 ...
- POI 自用API
poi包下载 API 使用POI生成Excel,大家都是赞个.可是狐狸觉得毕竟不是微软的产品,使用没有C#语言的好用,方法还是存在极限的. 下面总结狐狸自己用过的方法: import org.apac ...