JavaScript中的数据类型

ECMAScript中有五种基本数据类型和一种复杂数据类型
基本数据类型:Undefined、Null、Boolean、Number、String
复杂数据类型:Object
除了这六种数据类型之外,ECMAScript不允许创建任何自定义数据类型,因此,在JavaScript中,所有的值都是上述六种数据类型之一。

typeof操作符

在前面一篇文章中提到过,JavaScript中的变量都是松散类型的,有时候我们就需要一种手段来检测这个变量中的数据类型,typeof就是用来检测给定变量中数据类型的操作符。

console.log(typeof true); // Boolean
console.log(typeof 10); // Number
console.log(typeof '110'); // String
console.log(typeof {name: '张三'}); // Object
console.log(typeof ()=>{}); // function

上面列出了几种常用的数据类型以及他们的typeof判断结果,除了上面几种之外,还有一些特殊的数据类型:

  • typeof Test,如果这是后Test是一个未定义的值,返回undefined;
  • typeof null,如果typeof操作符判断的是一个值为null的数据,返回的数据类型是object,null值在这里被认为是一个空的对象引用。

Undefined类型

Undefined类型只有一个值:undefined。

  • 使用var声明变量,但是没有对变量进行初始化,这个变量会默认赋值undefined。
var test;
console.log(test); // undefined

在使用typeof操作符进行判断时,有两种情况会出现undefined:

  • 变量已经定义,但是没有初始化
  • 变量尚未定义
var one; // 变量已经定义但是没有初始化
// var two; // 变量没有定义
typeof one; //"undefined"
typeof two; //"undefined"

虽然这两种情况下typeof的值都是undefined,但是已定义未初始化的变量和未定义的变量还是不一样的:

consol.log(one); // "undefined"
console.log(two); // throw error

Null类型

Null类型同样只有一个值:null。null值表示一个空对象指针,因此typeof null返回“Object”。
在某些时候,null值和undefined值是可以看作相等的,比如使用相等操作符进行比较时:

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

=Null类型在使用中的作用:=
如果一个变量在定义之初就是被用来保存对象的,这时我们就可以在定义变量时给它显式地赋值为null(null值被看作是一个空对象指针)。

Boolean类型

Boolean类型有两个字面量:true和false。
由于JavaScript语言是严格区分字母大小写的,所有True和False都不是Boolean类型的值。

转型函数Boolean()
var me = "Tom";
var meAsBoolean = Boolean(me); // true

任何数据类型都可以调用转换函数Boolean(),函数结果会返回一个对应的Boolean值:

  • String:空字符串("")转换后值为false,其他任何非空字符串转换后都为true
  • Number:0和NaN转换后值为false,其他任何非零数字转换后都为true
  • Object:null值转换后为false,其他任何非空对象转换后都为true
  • Undefined:undefined转换后为false,因为undefined只有一个值为undefined,所有Undefined类型无法转换为true
    这个转换函数,一般在流程控制语句中经常使用到,以if语句举例:
var test = 'how are you!'
if(test){
	alert(i am fine!);
}

在上面的代码中,if(test)部分,自动执行了相应的Boolean转换。

Number类型

整数
  • Number类型数据包含了整数浮点数值(单精度数值和双精度数值)。
  • 整数可以通过十进制、八进制、十六进制的字面量来表示,其中十进制是最常使用的;
  • 八进制数值的第一位必须是0,然后是八进制数字序列,如果八进制数字序列中的数值超过了范围,这时候js引擎会忽略前置的0,然后将后面的数字序列识别为十进制数值。(八进制在严格模式下是无效的);
  • 十六进制数值的前两位必须是0x,然后是十六进制数字序列,
  • 在进行算数计算时,八进制和十六进制的数值都会被转换成十进制数值
var intNum = 10; // 十进制整数
var num2 = 070; // 八进制,转换为十进制后等于56
var num3 = 079; // 0后面的数字序列超过了7,因此等于79
var num4 = 0xA; // 十六进制,转换为十进制后等于10
浮点数值
  • 保存浮点数值需要的内存空间时保存整数值的两倍,ECMAScript会将一些可以转换成整数的浮点数值转换成整数值:
var floatnum = 1.0; // 类似这种浮点数值,就会被解析成整数值1
  • 浮点数值的最高精度是17位小数,但是浮点数值的计算精确度不如整数,因此浮点数值计算时经常会出现误差
0.1 + 0.2 = 0.30000000000000004
数值范围

因为内存有限制,所有Number类型存在最大值和最小值。

  • Number.MIN_VALUE:在JavaScript中,这个字面量代表了Number能表示的最小值
  • Number.MAX_VALUE:在JavaScript中,这个字面量代表了Number能表示的最大值
  • Number.NEGATIVE_INFINITY:在JavaScript中,这个字面量代表了负无穷
  • Number.POSITIVE_INFINITY:在JavaScript中,这个字面量代表了正无穷
  • 如果计算结果超出数值范围,计算结果自动转换为Infinity值(无穷值),分正无穷(Infinity)和负无穷( -Infinity),同时这个无穷之无法参与下一次计算
  • isFinite()函数,判断一个值是不是超过了是指范围:
console.log(Number.MAX_VALUE + Number.MIN_VALUE); // false
NaN

非数值,任何涉及到NaN的计算都会返回NaN,NaN与任何值都不想等(包括NaN本身):

console.log(NaN === NaN); // false
  • isNaN()函数,用来判断是不是数值
isNaN(NaN); // true
isNaN(10); // false
isNaN("my"); // true
isNaN("10"); // false "10"可以被转换成10
isNaN(true); // false true值可以被转换成1
数值转换
  • Number()parseInt()parseFloat()三个转型函数,可以把非数值类型的数据转换成数值。
  • Number()可以转换任何数据类型,parseInt()parseFloat()用于把字符串转换为数值
// Number()转换函数举例
Number("Hello"); // NaN
Number(""); // 0,空字符串转换为0
Number("001"); // 1,忽略前置的0
Number(true); // 1,true值转换为1

使用paresInt()转换函数时,最好使用第二个参数指定转换基数,避免出错(有一些引擎可能会出现进制分歧)

// parseInt()转换函数举例
parseInt("123rew"); // 123,第一个字符是数值,依次往后识别,直到识别到第一个不为数值的字符,忽略数值后面的非数值,返回前面的数值
parseInt("you123"); //NaN,第一个字符不是数值,直接返回NaN
parseInt(""); // NaN,parseInt识别空字符串返回NaN
parseInt(22.5); // 22,识别到小数点后停止,并返回小数点前面的数值
parseInt("070"); // 56,八进制
parseInt("0xf"); // 15,十六进制
parseInt("60"); // 60,十进制

parseInt("0xF", 16); // 56,十六进制,第二个参数指定转换时使用多少进制,如果不指定第二个参数,默认按照十进制转换

parseFloat()只能识别十进制,十六进制会始终被转换为0,八进制数值会被忽略前置的0并将后面的数字序列识别为十进制数值

// parseFloat()转换函数举例
paresFloat("1234uuu"); //1234
paresFloat("0xA"); //0, parseFloat()只能解析十进制,十六进制会被识别为0
paresFloat("22.5"); //22.5
paresFloat("22.5.3"); //22.5,parseFloat()只能识别第一个"."
paresFloat("0898.6"); //898.6,parseFloat()会忽略前置的0

String类型

  • String,字符串,零个或者多个由双引号或者单引号包裹的字符。在JavaScript中单引号和双引号的作用是一样的。
  • 字符串拼接:"hel" + "lo" = "hello""1 + 1 =" +3 = "1+1=3"(字符串拼接的过程中后台发生了什么:首先创建一个长度够用的新字符串,然后在新字符串中填充上拼接的字符串,最后销毁就的字符串)
  • toString():在六种数据类型中,Number、Boolean、Object、String类型的数据都有一个toString()方法,这几个数据类型的toString方法都会返回相应的字符串:
10.toString(); // "10"
10.toString(2); // "1010", Number类型的数据在使用toString时,可以指定一个转换基数作为参数,转换结果会根据这个转换基数先转换成对应进制的数值,再转换为字符串
true.toString(); // "true"
  • String():Number、Boolean、Object、String、Null、undefined这六种类型的数据都有String方法,调用String()方法时,会先检测当前数据是否由toString()方法,如果有,就调用toString()方法,如果没有就返回这个数据的字面量:
10.String(); // "10"
10.String(2); // "1010", Number类型的数据在使用toString时,可以指定一个转换基数作为参数,转换结果会根据这个转换基数先转换成对应进制的数值,再转换为字符串
true.String(); // "true"
null.String(); // "null"
// var ab;
ab.String(); //"undefined"

Object类型

对象,在这里就是一组数据和功能的集合。
对象实例化:var o = new Object();
对象实例化后,Object类型所有的任何属性和方法同样存在于更具体的对象中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值