你不知道的JavaScript(一)数据类型
ECMAScript 规范地址:
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
有过WEB前端开发经验的朋友都知道JavaScript是一种弱类型的语言,定义变量时无需指定变量类型,任一类型的值都可以赋值给该变量。正确的理解每一种数据类型,在适当的时候进行类型转换对我们编程是很有帮助的。
例如我们有一个多于两位的整数,抛开位数不管,我们要获取从左到右数第二位数字,这时候將整数转换为string是比较方便的。
var num = 1234566;
var strNum = num + "";
alert(strNum[1]);//值为2
这样的例子很多,笔者不做过多介绍。JavaScript总共定义了七种内置类型,分别如下:
- null
- undefined
- boolean
- number
- string
- object
- symbol—ECMAScript 6.0规范新增
接下来我们使用typeof操作符,来检查给定的值属于哪种类型,typeof操作符会返回该值的类型字符串。
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>exam_2</title>
</head>
<body>
<div>
<script type="text/javascript">
document.writeln(typeof "hello world!");
document.writeln("<br/>");
document.writeln(typeof 123.1);
document.writeln("<br/>");
document.writeln(typeof Symbol());
document.writeln("<br/>");
document.writeln(typeof [1,2,3]);
document.writeln("<br/>");
document.writeln(typeof {name:"Rongbo_J",age:23});
document.writeln("<br/>");
document.writeln(typeof /^[1-9]$/);
document.writeln("<br/>");
document.writeln(typeof true);
document.writeln("<br/>");
document.writeln(typeof undefined);
document.writeln("<br/>");
</script>
</div>
</body>
</html>
在浏览器中运行可以看到输出的类型字符串:
JS中的字符串属于string类型,数值(不区分整数和浮点数)都属于number类型,symbol类型为ECMAScript6.0规范新增,通过Symbol()调用产生。数组、对象、正则表达式都属于object类型,ture/false两个值属于boolean类型。undefined表示变量值未指定或变量未声明,单独属于一个类型undefined。
此外这里有一些特例:
document.writeln(typeof null);//输出object
null和undefined类似,一个值作为一个类型,我们使用typeof null 应该返回”null”字符串才对,那这里为什么会返回”object”呢?
你可能不知道其实这是JavaScript最初设计上的一个Bug,有很多已经存在的WEB系统都使用类似下面的代码来检测null值:
var a = null;
if(!a && typeof a == "object"){};
如果修复了这个bug,将会导致现存的WEB系统出现更多的Bug,所以这个bug一直持续了近20年,而且以后也不可能会修复。
再来看一个例子:
var func = function(){
};
document.writeln(typeof func);//页面输出function
document.writeln("<br/>");
这里我们定义一个函数,使用typeof操作符获取类型字符串,页面输出function。读者可能很容易认为function也是JS顶层的内置类型。实际上ECMAScript规范中提到,function类型属于object的”子类型”。
为了证明这个结论,我们可以这样写代码:
<script type="text/javascript">
alert(function(){}.length);
</script>
可以看到,语法上没有任何问题:
最后再来谈谈typeof操作符,下面这段代码再常见不过了:
var a = 20;
typeof a;
一些书籍中说typeof操作符用来获取变量的类型,其实这种说法不是很准确,JavaScript的变量是没有类型这个概念的,类型是和变量的值相关的。
上面的代码实际上等价于:
typeof 20;
准确的描述应该是:typeof操作符用来获取变量的值的类型。
你不知道的JavaScript(一)数据类型的更多相关文章
- javascript 之数据类型
写在前面 国庆整理资料时,发现刚开始入门前端时学习JS 的资料,打算以一个基础入门博客记录下来,有不写不对的多多指教: 先推荐些书籍给需要的童鞋 <JavaScript 高级程序设计.pdf&g ...
- javascript 之数据类型--01
写在前面 国庆整理资料时,发现刚开始入门前端时学习JS 的资料,打算以一个基础入门博客记录下来,有不写不对的多多指教: 先推荐些书籍给需要的童鞋 <JavaScript 高级程序设计.pdf&g ...
- 十分钟快速了解《你不知道的 JavaScript》(上卷)
最近刚刚看完了<你不知道的 JavaScript>上卷,对 JavaScript 有了更进一步的了解. <你不知道的 JavaScript>上卷由两部分组成,第一部分是< ...
- 《你不知道的JavaScript》整理(二)——this
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,这次研究了一下“this”. 当一个函数被调用时,会创建一个活动记录(执行上下文). 这个记录会包含函 ...
- 《你不知道的JavaScript》整理(一)——作用域、提升与闭包
最近在读一本进阶的JavaScript的书<你不知道的JavaScript(上卷)>,里面分析了很多基础性的概念. 可以更全面深入的理解JavaScript深层面的知识点. 一.函数作用域 ...
- 你不知道的Javascript(上卷)读书笔记之一 ---- 作用域
你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此 ...
- JS-安全检测JavaScript基本数据类型和内置对象的方法
前言:在前端开发中经常会需要用到检测变量数据类型的需求,比如:判断一个变量是否为undefined或者null来进行下一步的操作,今天在阅读“编写高质量代码-改善JavaScript程序的188个建议 ...
- JavaScript基础——数据类型
JavaScript使用数据类型来确定如何处理被分配给一个变量的数据.变量的类型决定了你可以对变量进行什么操作,如循环或者执行.下面描述了最常用的变量类型. 字符串(String):此数据类型将字符数 ...
- JavaScript 的数据类型 相关知识点
(1)基本数据类型介绍 JavaScript的数据类型分为两类:原始类型(primitive type)和对象类型(object type) 或者说是:可以拥有方法的类型和不能拥有方法的类型 或者说是 ...
- JavaScript的数据类型
JavaScript的数据类型 1.JavaScript的数据类型包括:字符串.数值.布尔.数组.对象.Null.Undefined. 2.JavaScript拥有动态类型,这以为着同一个变量可用作不 ...
随机推荐
- python黏包现象
#黏包:发送端发送数据,接收端不知道应如何去接收造成的一种数据混乱现象. #关于分包和黏包: #黏包:发送端发送两个字符串"hello"和"word",接收方却 ...
- POJ 2536 匈牙利算法
思路:最大匹配 (很裸) // by SiriusRen #include <cmath> #include <cstdio> #include <cstring> ...
- 顺序容器之vector
最近因为需要,在看C++ primer,哇,感觉这本书真不错,讲的细而且到位,而且大量的练习题,不愧为C++学习的经典书籍.今天看了顺序容器方面的内容,现在汇报一下: 一.什么是vector vect ...
- gbk编码
GBK 编码 GBK编码范围:8140-FEFE,汉字编码范围见第二节:码位分配及顺序. GBK编码,是对GB2312编码的扩展,因此完全兼容GB2312-80标准.GBK编码依然采用双字节编码方 ...
- webpack——bable-loader,core,preset,编译es6
//文件夹,在命令行中npm init 之后可以一直回车,答y 出现文件 然后安装bable npm install -save-dev babel-loader babel-core 文件 然后我们 ...
- Day 03 知识点[python程序运行的方式、变量、注释、内存管理、数据类型]
执行Python程序的两种方式 第一种:交互式,在cmd中运行 优点:调试程序方便,直接给出结果 缺点:无法保存,关掉cmd窗口数据就消失 第二种:命令行式通过cmd中输入Python3文本 优点:数 ...
- 算法22-----托普利茨矩阵leetcode766
1.题目 如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵. 给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True. 示例 1: 输入: matr ...
- HDU 4630 No Pain No Game (线段树+离线)
题目大意:给你一个无序的1~n的排列a,每次询问[l,r]之间任取两个数得到的最大gcd是多少 先对所有询问离线,然后把问题挂在区间的左端点上(右端点也行) 在预处理完质数,再处理一个next数组,表 ...
- QT中文字的绘制
为什么要做这次文字的介绍,因为在一般的教材中,还真没有文字的描述: 1.绘制最简单的文字. 我们更改重绘函数如下: void Dialog::paintEvent(QPaintEvent *){QPa ...
- 20130910.Windows上安装和配置MongoDB
官方文档:http://docs.mongodb.org/manual/tutorial/ 1.下载软件 http://www.mongodb.org/downloads 2.解压 解压后进入bin目 ...