前端之美大话前端让前端飞

JS之数据类型

2018-03-08  本文已影响36人  fenerchen

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

有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个值相加时优先推断为strin类型 ,其它情况下(比如“-”。“”。“/”)都默觉得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版)

上一篇下一篇

猜你喜欢

热点阅读