JavaScript | 深入理解js的数据类型

导读

5种基本数据类型:Undefined、Null、Boolean、Number、String
1种复杂数据类型:Object


typeof操作符

检测给定变量的数据类型

var message = "abc"
var msg2;
alert(typeof (msg));     //undefined,未声明
alert(typeof (msg2));     //undefined,未初始化
alert(typeof (true));    //boolean
alert(typeof (12));      //number
alert(typeof (message)); //string
alert(typeof (null));    //object

数据类型

Undefined

只有一个值,“undefined”
看栗子:

var msg;
// var str;
alert(msg);//undefined
alert(str);//报错

对于未声明的变量,只能用typeof检测其数据类型

var msg;//msg声明后默认值是undefined
// var str;
alert(typeof (msg));//undefined
alert(typeof (str));//undefined

上述例子说明:未初始化的变量和未声明的变量用typeof检测其数据类型,都是undefined。
所以最好初始化变量,这样当typeof返回“undefined”时,就知道该变量还没有声明。


Null

只有一个值,“null”
从逻辑角度看,null值表示一个空对象指针,typeof检测null值返回”object”。

alert(typeof (null));//object

如果定义的变量将来用作保存对象,那么最好初始化为null,这样只要检查null值就能知道相应的变量是否已经保存了一个对象的引用

alert(null == undefined);//true

undefined值是派生自null值的,ECMA-262规定对他们的相等性测试要返回true。虽然这里的相等操作符(==)总是返回true,但这个操作符处于比较的目的会转换其操作数。
undefined和null用途完全不同:无论什么情况下都没必要把一个变量的值显式地设置为undefined;但意在保存对象的变量还没有真正保存对象,就明确让变量保存null值。体现null作为空对象指针的惯例,进一步区分null和undefined。

undefined 和null 常被用来表示“空的”值或“不是值”的值。二者之间有一些细微的差别:
null 指空值(empty value)
undefined 指没有值(missing value)
null 是一个特殊关键字,不是标识符,我们不能将其当作变量来使用和赋值。然而undefined 却是一个标识符,可以被当作变量来使用和赋值。


Boolean

两个字面值:true false
ES中所有类型的值都有与这两个Boolean值等价的值,转型函数Boolean()
看栗子:

var msg = "hello!"
var msgBoolean = Boolean(msg);
alert(msgBoolean);//true

Boolean()转换规则:

数据类型转为true的值转为false的值
Booleantruefalse
String任何非空字符串**(空字符串)
Number任何非零数字值(包括无穷大)0和NaN
Object任何对象null
Undefinedn/aundefined

这些转换规则对理解流控制语句自动执行相应的Boolean转换很重要,因此确切地知道流控制语句中使用的是什么变量至关重要。错误地使用一个对象而不是Boolean值,就有可能彻底改变应用程序的流程。
看栗子,应用在流控制语句中:


var msg = "hello!";
if(msg){
alert(msg);
}

拓展:

var a = null;
var b = {};
var c = {name:'xx'};
if(!b){ console.log(1);}
else if(b == a) { console.log(2);} 
else { console.log(3);}
//打印出3
if({name:'xx'})console.log("true");  // true



在此,想要说明的是null是空对象指针,里面没有东西的;而b的变量值存放了一个地址引用(也叫做地址指针),从打印的结果来看,{}能找到它的原型,证明它里面是有东西的,这个以后也能接触到,在这里就不长篇大论啦。


Number

用IEEE754格式来表示整数和浮点数值。
在进行算术计算时,所有以八进制和十六进制表示的数值最终都被转换成十进制数值(八进制字面量在严格模式下是无效的,导致支持的javascript引擎抛出错误)。
javascript可以保存正零(+0)和负零(-0),被认为相等。
浮点数值计算会产生舍入误差,是使用基于IEEE754数值的浮点计算的通病。看栗子:

var a=0.1,b=0.2;
sum=a+b;
console.log(sum);  //0.30000000000000004

如果某次计算的结果得到一个超出js数值范围的值,这个数值就被自动转换成特殊的Infinity值。如果某次计算返回了正/负的Infinity值,那么该值无法继续参与下一次的计算,这个值不是能够参与计算的数值。要想确定一个数值是不是有穷的(是不是位于最大和最小值之间),可以用isFinite()函数,这个函数在参数位于最大与最小值间返回true。
NaN:表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。eg:其他编程语言中,任何数除以0都会导致错误。从而停止代码执行,但在ES中,任何数除以0都会返回NaN,不会影响其他代码的执行。特点:①任何涉及NaN的操作,都会返回NaN,这个在多步计算中可能导致问题;②NaN与任何值都不想等,包括NaN本身。

alert( NaN == NaN );//false

有关解析字符串的两个函数:
parseInt()
parseFloat()

String

由零或多个16位的Unicode字符组成的字符序列,即字符串。

5.1 字符字面量
字面量含义
\n换行
\t制表
\b空格
\r回车
\\斜杠
\’单引号(’),在用单引号表示的字符串中使用
\”双引号(”),在用双引号表示的字符串中使用
\xnn以十六进制代码nn表示的一个字符(n为0~F)
\unnnn以十六进制代码nnnn表示的一个Unicode字符(n为0~F)
字符串特点

ES中的字符串是不可变,要改变的话只能销毁原本的字符串。
看栗子:

var lang = 'Java'
lang = lang + 'Script'

实际操作:先创建一个容纳10个字符的新字符串,字符串拼接成JavaScript之后,会销毁Java和Script两个字符串(部分旧浏览器拼接字符串慢)。

转换字符串

toString():把一个逻辑值转换为字符串,并返回结果

var num = 10;
alert (num.toString()); //除了null和undefined,其他数据类型都能用这个方法
alert(num.toString(8)); //数值可传参数,参数指定输出的值的基数(进制)

转型函数String():在不确定值是否为null和undefined时

var value1=10,value2=null,value3;
console.log(String(value1));//如果值有toString()方法,调用toString(),返回10
console.log(String(value2));//返回null
console.log(String(value3));//返回undefined

Object

JavaScript 中的所有事物都是对象:字符串、数值、数组、函数…
此外,JavaScript 允许自定义对象。对象只是带有属性和方法的特殊数据类型。
ES中的对象的行为不一定适用于js中的其他对象。浏览器环境中的对象,eg:BOM对象和DOM对象,属于宿主对象,可能会也可能不会继承Object。

参考文献:
〔1〕Nicholas C. Zakas .
Professional JavaScript for Web Developers,3rd Edition[M] . Wrox . 2012
〔2〕Kyle Simpson . You Don’t Know JS[M] . O’Reilly Media . 2014

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值