JavaScript数据类型

ECMAScript中有5中简单的数据类型(也称为基本数据类型):Undefined、Boolean、Null、String和Number。还有一种复杂数据类型——Object。

typeof操作符

typeof用来检测给定变量的数据类型。typeof通常会返回以下字符串:

  • “Undefined“——如果这个值未定义;
  • “boolean”——如果这个值是布尔值;
  • “string”——如果这个值是字符串;
  • “number”——如果这个值是数值;
  • “object”——如果这个值是对象或null;
  • “function”——如果这个值是函数。

typeof不是函数,typeof返回值是字符串类型。

Undefined类型

当声明一个变量,未对变量进行初始化时,使用typeof操作符时,返回值为undefined。

var a;
console.log(typeof(a)); //undefined

var a = undefined;
console.log(a == undefined);    //true

console.log(b); //ReferenceError

console.log(typeof(a)); //undefined
console.log(typeof(b)); //undefined

Null类型

null表示一个空对象指针,这也是使用typeof操作符检测null值时,会返回“Object”的原因。

var a = null;
console.log(typeof(a)); //object

如果要创建一个空对象时,最好将对象赋值为null,这样在以后使用时,只需要检测null值就可以知道变量是否已经保存了对象的引用。

var person = null;
if (car != null) {
    //  对person对象进行操作
}

undefined值是派生自null值得,因此ECMA-262规定对它们的想等性测试返回true

console.log(null == undefined); //true

建议:声明空变量时,不用将其赋值为undefined,即undefined一般不显示使用;声明空对象时,应将其赋值为null,这体现了null表示一个空对象指针。

Boolean类型

Boolean类型有两个值,即true和false,并且Boolean类型区分大小写,因此不能将true写成True,不能讲false写成False。

Boolean字面值只有两个,但ECMAScript中所有类型的值都有与这两个Boolean值等价的值。将一个值转换为Boolean类型,只需要调用Boolean()函数即可。

var message = "hello world";
var messageAsBoolean = Boolean(message);
console.log(`${messageAsBoolean} : ${typeof messageAsBoolean}`)     //true : boolean
数据类型 true false
Boolean true false
String 任何字符串 “ ”(空字符串)
Number 任何非零数(包括无穷大) 0和NaN
Object 任何对象 null
Undefined 不适用 undefined

因为存在任何类型可以转换为Boolean类型,所以对理解流程控制语句自动执行响应Boolean转换非常重要。

var message = "hello world";
if (message) {
    console.log(message);
}

Number类型

在进行算术计算时,所有以八进制和十六进制表示的数值都将转换成十进制。浮点数需要的空间是整数需要空间的两倍,因此ECMAScript会尽可能的将其保存为整数类型。使用Number类型时,对于较大的数字可以采用科学技术法,如31250000可以表示为3.125e7

由于内存的限制,ECMAScript保存的数值是有大小的,最大值保存在Number.MAX_VALUE中,最小值保存在MIN_VALUE中。如果超过了这两个范围就会将其转换为infinity(无穷大)。使用isFinite()函数可以判断一个数是否在有效的范围内,如果不在有效的范围内,将不能继续执行运算。

NaN数据类型

NaN,即非数值(Not a Number)是一个特殊的数值,用于表示一个本来要返回数值的操作数未返回数值的情况。NaN有两个非同寻常的特点:==任何涉及NaN的操作都会返回NaN;NaN与任何值都不相等,也包括本身==。

console.log(NaN == NaN)     //false

可以使用isNaN()函数来判断一个数是否是NaN类型,isNaN()函数接收一个值时,会尝试将这个值转换为一个数。

console.log(isNaN(NaN));        //true
console.log(isNaN(10));         //false     
console.log(isNaN("10"));       //false
console.log(isNaN("blue"));     //true
console.log(isNaN(true));       //false

isNaN()也可以用于对象,对象调用isNaN()时,会首先调用valueOf()方法,然后确定该方法返回值是否可以转换为数值。如果不能基于这个值调用toString()方法,在测试返回值。

数值转换

Number()、parseInt()和parseFloat()可以将非数值转换为数值类型。

Number()函数的转换规则:

  • 如果是Boolean值,true转为1,false转为0;
  • 如果是null,返回0;
  • 如果是undefiend值,返回NaN;
  • 如果是字符串
    • 如果字符串中包含数字就转换为十进制数值,且把前面的0去了。如“123”转为123,“011”转为11;
    • 十六进制会转为十进制;
    • 空字符串转为0;
    • 如果是其他字符串时,将其转为NaN;
  • 如果是对象,则调用valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用toString()方法,然后依次按照前面的规则进行转换。
var num = Number("hello world");        //NaN

一元加操作与Number()函数相同。

parseInt()函数的转换规则:

  • 如果第一个字符串不是数字字符或者符号,返回NaN;
var num1 = parseInt("1234blue");        //1234
var num2 = parseInt("")                 //NaN
var num3 = parseInt("0xA");             //10
var num4 = parseInt("22.5");            //22
var num5 = parseInt("070");             //56
var num6 = parseInt("70");              //70
var num7 = parseInt("0xf");             //15

parseInt()函数会接受第二个参数,指定转换时使用的基数。

parseFloat()同parseInt(),唯一不同是,parseFloat()会忽略前导的0,==parseFloat只解析十进制==。

var num1 = parseFloat("1234blue");      //1234
var num2 = parseFloat("0xA");           //0
var num3 = parseFloat("22.5");          //22.5
var num4 = parseFloat("22.34.5");       //22.34
var num5 = parseFloat("0908.5");        //908.5
var num6 = parseFloat("3.125e7");       //31250000

String类型

String字符串一旦创建就不可以改变,除非先销毁原字符串在重新进行赋值。

转换为String类型

使用几乎每个值都有的toString()方法。除了null和undefined没有toString()方法外,数值、布尔值、字符串和对象都有toString()方法。

var age = 11;
var ageAsStr = age.toString();      //"11"
var found = true;
var foundAsStr = found.toString();      //"true"

在调用数值的toString()方法时,可以传递一个参数:输出数值的基数。默认情况,toString()以十进制格式返回数值的字符串表示。

var num = 10;
console.log(num.toString())         //"10"
console.log(num.toString(2))        //"1010"
console.log(num.toString(8))        //"12"
console.log(num.toString(10))       //"10"
console.log(num.toString(16))       //"a"

在不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。使用String()方法时,如果要转换的值有toString()方法,则调用这个方法,如果是null则返回“null”,如果是undefined则返回“undefined”。

var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
console.log(String(value1));        //"10"
console.log(String(value2));        //"true"
console.log(String(value3));        //"null"
console.log(String(value4));        //undefined

要把某个值转换为字符串,可以使用加号操作符把它与一个“”(空字符)加在一起。

Object类型

浏览器环境中的对象,比如,BOM和DOM中的对象,都属于宿主对象,它们是由宿主实现提供和定义的。

对象详细将会单独写出。

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

推荐阅读更多精彩内容