JS之数据类型

5种简单数据类型:Undefined、Null、Boolean、Number和String。1种复杂数据类型-----Object

typeof

typeof操作符用来检测变量的数据类型。

值或变量描述 typeof返回字符串
未定义,没有赋值 undefined
布尔值 boolean
字符串 string
数值 number
对象或null object
函数 function

Undefined类型

Undefined类型只有一个值,undefined。使用var声明变量,但是没有对其初始化,这个变量值就是undefined。
未初始化的变量和根本不存在的变量不一样

var box;
console.log(name);

typeof box,typeof name都返回undefined,但是他们的值一个是undefined,一个是错误,尽管他们的类型都是undefined,所以在定义变量的时候,尽可能不要只声明,不赋值

Null类型

该类型只有一个值,null。表示一个空对象引用,typeof检测返回object。
如果定义的变量准备保存对象,最好初始化为null

重要说明,undefined派生子null,ECMA-262 规定对它们的相等性测试返回true。alert(undefined == null);//true,因此,未初始化的变量和赋值为null的变量会相等,但不全等(===),因为数据类型不一样

Boolean类型

两个值truefalse。而true 不一定等于1,false不一定等于0。JavaScript 是区分大小写的,True 和False 或者其他都不是Boolean 类型的值。
虽然Boolean 类型的字面量只有true 和false 两种,但ECMAScript 中所有类型的值都有
与这两个Boolean 值等价的值。要将一个值转换为其对应的Boolean 值,可以使用转型函数
Boolean()。

var hello = 'Hello World!';
var hello2 = Boolean(hello);
alert(typeof hello);

上面是一种显示转换,属于强制性转换。而实际应用中,还有一种隐式转换。比如,在
if 条件语句里面的条件判断,就存在隐式转换。

var hello = 'Hello World!';
if (hello) {
alert('如果条件为true,就执行我这条!');
} else {
alert('如果条件为false,就执行我这条!');
}
其他类型转换成 Boolean类型规则

Number类型

两种数值,整型和浮点型,由于保存浮点数值需要的内存空间比整型数值大两倍,因此ECMAScript 会自动将可以转换为整型的浮点数值转成为整型。

var box = 8.; //小数点后面没有值,转换为8
var box = 12.0; //小数点后面是0,转成为12

浮点数值的范围在:Number.MIN_VALUE ~ Number.MAX_VALUE 之间。

alert(Number.MIN_VALUE); //最小值
alert(Number.MAX_VALUE); //最大值

如果超过了浮点数值范围的最大值或最小值,那么就先出现Infinity(正无穷)或者-Infinity(负无穷)。

var box = 100e1000; //超出范围,Infinity
var box = -100e1000; //超出范围,-Infinity

也可能通过Number.POSITIVE_INFINITYNumber.NEGATIVE_INFINITY 得到
Infinity(正无穷)及-Infinity(负无穷)的值。

alert(Number.POSITIVE_INFINITY); //Infinity(正无穷)
alert(Number.NEGATIVE_INFINITY);//-Infinity(负无穷)

要想确定一个数值到底是否超过了规定范围,可以使用isFinite()函数。如果没有超过,返回true,超过了返回false

NaN,即非数值(Not a Number)是一个特殊的值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。
可以通过Number.NaN 得到NaN 值,任何与NaN 进行运算的结果均为NaNNaN 与自身不相等(NaN 不与任何值相等)

ECMAScript 提供了isNaN()函数,用来判断这个值到底是不是NaN。isNaN()函数在接收到一个值之后,会尝试将这个值转换为数值。

alert(isNaN(NaN)); //true
alert(isNaN(25)); //false,25 是一个数值
alert(isNaN('25')); //false,'25'是一个字符串数值,可以转成数值
alert(isNaN('Lee')); //true,'Lee'不能转换为数值
alert(isNaN(true)); //false true 可以转成成1

isNaN()函数也适用于对象。在调用isNaN()函数过程中,首先会调用valueOf()方法,然后确定返回值是否能够转换成数值。如果不能,则基于这个返回值再调用toString()方法,再测试返回值。

var box = {
toString : function () {
return '123'; //可以改成return 'Lee'查看效果
}
};
alert(isNaN(box)); //false

ES6提供了新方法Number.isFinite()Number.isNaN()。ES6和传统的方法isFinite()isNaN()区别:传统方法先调用Number()将非数值转化为数值,在进行判断,而新方法只对数值有效,对于非数值一律返回false。Number.isNaN()只对NaN才返回true,其他均返回false

console.log(isFinite('23'))//true
console.log(Number.isFinite('23'))//false

console.log(isNaN('23'))//false
console.log(Number.isNaN('23'))//false
console.log(Number.isNaN(NaN))//true

有3 个函数可以把非数值转换为数值:Number()parseInt()parseFloat()。Number()函数是转型函数,可以用于任何数据类型,而另外两个则专门用于把字符串转成数值。

alert(Number(true)); //1,Boolean 类型的true 和false 分别转换成1 和0
alert(Number(25)); //25,数值型直接返回
alert(Number(null)); //0,空对象返回0
alert(Number(undefined)); //NaN,undefined 返回NaN

如果是对象,首先会调用valueOf()方法,然后确定返回值是否能够转换成数值。如果转换的结果是NaN,则基于这个返回值再调用toString()方法,再测试返回值。

var box = {
toString : function () {
return '123'; //可以改成return 'Lee'查看效果
}
};
alert(Number(box)); //123

String 类型

表示字符串,单引号和双引号表示字符串,,必须成对出现,不能穿插
使用,否则会出错。

ECMAScript 中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。

var box='s';
box=box+'a';
console.log(box)//sa
box[1]='p';
console.log(box)//sa

toString()方法可以把值转换成字符串。
如果在转型之前不知道变量是否是null 或者undefined 的情况下,我们还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。

var box = null;
alert(String(box));//null,若使用toString方法,则出错

Object类型

ECMAScript 中的对象其实就是一组数据和功能的集合。对象可以通过执行new 操作符后跟要创建的对象类型的名称来创建。
var box = new Object();
Object()是对象构造函数,如果对象初始化时不需要传递参数,可以不用写括号,但这种方式我们是不推荐的。
var box = new Object;
Object()里可以任意传参,可以传数值、字符串、布尔值等。而且,还可以进行相应的计算。

var box = new Object(2); //Object 类型,值是2
var age = box + 2; //可以和普通变量运算
alert(age); //输出结果4,转型成Number 类型了

既然可以使用new Object()来表示一个对象,那么我们也可以使用这种new 操作符来创建其他类型的对象。

var box = new Number(5); //new String('Lee')、new Boolean(true)

alert(typeof box); //Object 类型

补充

JS在进行数字和字符运算时, 会在2个值相加时优先推断为string类型 ,其它情况下(比如“-”减。“”乘。“/”除)都默认number型运算*。!

console.log(3/'2');//1.5
console.log(3-'2');//1
console.log(3+'2');//32
console.log(3*'2');//6
console.log(3+ +'2');//5
console.log(1+ +"2"+"2");//32
console.log(typeof ("A"- "B"));//number
console.log("A"- "B"+2);//NaN

一元运算符,对于非数值应用一元加操作符,该操作符会像Number()转型函数一样对这个值执行转换。console.log(1+ +"2"+"2");//32+"2"相当于
Number('2')=2,
1+2=3,
3+"2"="32"
注意Number(null)=0,Number(undefined)=NaN,空字符串转换为0

参考资料:JavaScript高级程序设计(第3版)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,094评论 0 13
  • 什么是 JavaScript 语言? JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”(script...
    oWSQo阅读 1,784评论 0 1
  • 变量 声明变量 命名变量区分大小写的语言第一个字符是字母或下划线_,数字不能作为第一个字符字符必须是字母,数字或者...
    flyingtoparis阅读 779评论 0 0
  • 七星著 穷其一生,我依旧只爱美。 自古,美君,美政,美人,就是一个天下。普天之下,叫我如何不爱美?世间最基本的美、...
    一只小小小bunny阅读 409评论 2 6
  • 风萧萧,人血寒。尸山血海,杀戮漫布于整个幽魂山。 静静的山岗,双方无声的对峙。空中悬着的是一个浑身萦绕着黑气的男子...
    楼南陈阅读 593评论 7 2