你不知道的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拥有动态类型,这以为着同一个变量可用作不 ...
随机推荐
- SQL 导出数据字典
用于参考: SELECT 表名=case when a.colorder=1 then d.name else '' end, 表说明=case w ...
- centos 部署 .net core runtime 环境
除非在linux下开发才安装SDK,一般生产环境只需安装 runtime 1.添加 yum 源 sudo rpm --import https://packages.microsoft.com/key ...
- 高德SDK获取到的坐标转换为GPS真实坐标方法,Java版
发现高德SDK不提供高德的坐标转GPS坐标(GCJ_02转WGS_84),下面是一份Java版的 /**************************** 文件名:GCJ2WGS.java 创建时间 ...
- Java 自带MD5 校验文件
http://www.iteye.com/topic/1127319 前天第一次发表博客到论坛,关于Java文件监控一文,帖子地址在:http://www.iteye.com/topic/112728 ...
- C++中static和const关键字的作用
static关键字至少有下列几个作用: 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值: 在模块内的static全局变量 ...
- 第十二章 Python网络编程
socket编程 socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket ...
- node——underscore的使用
我在做新闻页面时,需要将之前存好点的data.json里的数据显示在首页上,而首页的每条新闻数据不能直接写定在上面,所以我们要将data里面的数据传递进去.我们需要使用underscore的templ ...
- Day 03 知识点[python程序运行的方式、变量、注释、内存管理、数据类型]
执行Python程序的两种方式 第一种:交互式,在cmd中运行 优点:调试程序方便,直接给出结果 缺点:无法保存,关掉cmd窗口数据就消失 第二种:命令行式通过cmd中输入Python3文本 优点:数 ...
- Kz.layedit-layui.layedit富文本编辑器拓展
项目介绍 首先欢迎使用 Kz.layedit!本项目基于layui.layedit富文本编辑器,在其之上拓展而来. 新增功能 html源码模式.插入hr水平线.段落格式.字体颜色.字体背景色.批量上传 ...
- web 安全主题