首页 ›  文章

重温Javascript:数据类型

2019-12-03

数据类型.png

类型判断 typeof

Javascript是弱类型语言,定义变量时不需要显示的指定数据类型

不初始化变量时,默认会被初始化为Undefined类型

var a; //相当于var a = undefined;

有初始化情况下,变量的类型则会根据初始化的值改变而改变

var a = 1; //此时a为数值类型
a = '1'; //此时a为字符串类型
a = false; //此时a为布尔类型

typeof 操作符可以用于判断这些变量的类型

var a = 1;
typeof a; //number

var b = 'a';
var c = "a";
typeof b; //string
typeof c; //string;

var d = true;
var e = false;
typeof d; //boolean
typeof e; //boolean

var f = null;
typeof f; //object

var h = function() {};
typeof h; //function

var a;
typeof a; //unfined

基本数据类型

Undefined类型

该类型的值只有一个值,即undefined。 在变量被定义时未初始化的时候,默认情况下,该变量被赋予了Undefined类型,即undefined。

var a;
a == undefined //true
typeof a; // undefined

需要注意的是,对于未定义的变量,使用typeof操作符也同样返回undefined,但是访问未定义的变量会报语法错误

typeof b; //假设b是未定义的变量,使用typeof依然返回undefined
alert(b); //这样使用b,则会产生语法错误

Null类型

该类型的值只有一个值,即null。 它是一个空指针对象,是一个对象类型,因此使用typeof检测返回的是object。 一般情况下,需要将变量初始化或者赋值为null,该变量的类型才算是null。

var b = null;
typeof b; //object

var a = 1;
typeof a; //number
a = null; //重新赋值
typeof a; //object

与Undefined类型的区别:

  • undefined是从null类型派生出来的,使用==做比较总是返回true

Boolean类型

该类型的变量只有两种值:truefalse

var isA = true;
var isB = false;

需要注意的是:Boolean类型的变量赋值是区分大小写的,即初始化为TrueFalse是不合法的定义。 这时候True 和 False 会被作为变量名解析,这样使用会产生语法错误

var isA = True; //错误
var isB = False; //错误

Number类型

定义

通常情况下,Number类型用于表示数字,即整型(整数)和浮点型(带小数点) 实际上,Javascript还可以使用Number类型来表示八进制十六进制的数值,八进制和十六进制在进行数值运算时会自动转换成十进制数。

八进制数

  • 第一位数字必须为0
  • 紧跟第一位数字的是0~7
  • 如果设置的数值超出了八进制的范围,第一位的0则被忽略,后面的数值自动转换为十进制数
var octalNum1 = 070; //有效的八进制数,对应十进制的56
var octalNum2 = 079; //无效的八进制,解析为79
var octalNum3 = 08;  //无效的八进制,解析为8

*需要注意的是:在严格模式下,八进制的数值是不允许的,Javascript引擎会抛出异常

十六进制数

  • 必须以0x开头
  • 后面紧跟十六进制数值,即0~9、a-z、A-Z
var hexNum1 = 0xA; //十六进制数的10
var hexNum2 = 0x1f; //十六进制数的31

浮点数值

即带小数点的数字,需要包含一个小数点,且小数点后面至少有一位数字

var a = 1.0;
var b = 1.1;
var c = .1;

如果小数点后面没有数字或者只有一个0,则会被解析成整数

var a = 1\. //解析成1
var b = 1.0 //解析成1

对于那些较大或者较小的数字,采用科学计数法来表示数字,即e表示法。

var a = 3.14e10; //3.14乘以10的10次方
var a = 2*e-2; //2乘以10的负2次方,即2/100

浮点数进行计算时,由于精度较高(最多17位小数点),因此会产生误差 例如0.1 + 0.2 = 0.3,实际结果是0.30000000000000004, 因此在做比较判断时会得到意想不到的结果

0.1+0.2 === 0.3 //返回false,因为0.3实际的值是0.30000000000000004

数值范围

由于内存的限制,Number类型并不能保存所有的数值,因此定义了最大值和最小值来限制取值的访问

  • 最大值,使用Number.MAX_VALUE表示,其值为1.7976931348623157e308
  • 最小值,使用Number.MIN_VALUE表示,其值为5e-234;

如果计算的数值已超出了取值范围,自动转换为Infinity(无穷)类型

  • 小于Number.MIN_VALUE,转换为-Infinity,即负无穷
  • 大于Number.MAX_VALUE,转换为Infinity,即正无穷

被转换为Infinity类型的数值,是不能进行数值计算的。可以通过isFinite()函数来判断一个数值是否为Infinity类型

var largeNum = Number.MAX_VALUE + Number.MAX_VALUE;
isFinity(largeNum); //true,超出了最大值范围,返回Infinity类型

NaN,非数值

用于表示一个本来返回数值的变量未返回数值(这样就不会返回错误)。 在其他编程语言中,进行数值计算时,除以0都会报错,而Javascript则返回NaN

NaN有两个特点:

  • 任何与NaN操作相关的都会返回NaN
  • NaN不等于任何的值(包含它自己)
NaN == NaN //false

isNaN()函数可以用于判断一个值是否不能返回一个数值,如果不能返回true,如果可以返回false

isNaN('123abc'); //true,不能转换为数字,所以非数值
isNaN('blue'); //true,不能转换为数字,所以非数值
isNaN('123'); //false,能转换为数字,所以为数值
isNaN(123); //false,能转换为数字,所以为数值
isNaN(true); //false,能转换为数字(false可以转换为0),所以为数值

String类型

定义

string类型是有零个或者多个16位Unicode字符组成的字符序列(即字符串)。 字符串由一对单引号(')或双引号(")包含起来

var a = 'ken';
var b = "hello";

需要注意的是,以单引号开头的字符串必须以单引号结束,以双引号开头的字符串必须以双引号结束 以下的写法都是错误的

var a = 'hello";
var b = "hello';

不可变性

Javascript中的字符串是不可变的,需要改变字符串的内容,首先消耗掉原来的字符串,然后在创建一个新的字符串

var a = 'Hello';
a += ' World'; //output:Hello World

操作流程

  1. 创建一个包含'Hello'的字符串a
  2. 修改a字符串的内容为'Hello World',先创建一个对应字符串长度的新字符串(这里是11,包含空格)
  3. 然后再讲新的内容(即'Hello World')填充到新的字符串中
  4. 原来的字符串(即'Hello')就会被丢弃掉

因此,像这类型的字符串连接在一些旧的浏览器(版本较低的浏览器,如IE6)中执行起来较慢,大部分的浏览器已进行了优化。

转义序列

字符串中的特殊字符,有些特殊字符串,虽然在代码书写中占用2个或两个以上的字符,最终还是被解析成一个字符串,比较常见的有:

字符 含义
n 换行
t 制表符,对应键盘上的tab
b 空格,对应键盘上的空格
r 回车,对应键盘上的回车
\ 斜杠
' 单引号,用于单引号字符串中的转义,如:''fasdaf''
" 双引号,用于双引号字符串中的转义,如:""fasdfasf""

以上的这些字符,在字符串中都被当成一个字符解析,如:

let a = 'Hello\r';
a.length //返回6,\r被当成一个字符解析

Object类型

复合类型,多用于定义一组数据和功能的集合

创建方式

1、使用new关键,创建一个Object空对象,并动态地设置属性和方法

var obj = new Object();
obj.name = 'Lilei';
obj.age = 10;
obj.say = function() {
    console.log('Hello');
}

上述的代码中:

  1. 创建一个名为obj的空对象
  2. 设置一个名为name的字符串类型的属性,值为'Lilei'
  3. 设置一个名为age的数值类型的属性,值为10
  4. 设置一个名为say的方法,在控制台中打印一段文字'Hello'

2、使用一对花括号( {} ),将属性和功能包含起来,采用这个方式修改上述代码

var obj = {
    name:'Lilei',
  age:10,
  say:function() {
      console.log('Hello');
  }
};

这些属性和方法都属于obj对象的成员变量,必须使用英文字符的逗号(,)隔开,否则Javascript解析报错

关键属性

  • hasOwnProperty(propertyName),判断当前对象实例中是否存在某个属性。
  • isPrototypeof(object),检查传入的对象是否是另外一个对象的原型
  • propertyIsEnumerable(propertyName),检查属性是否可以通过(for-in)枚举的方式访问
  • toLocaleString(),返回当前地区对应的执行环境下的对象字符串
  • toString(),返回对象字符串的表示
  • valueOf(),返回对象的字符串、数值、布尔值的返回值

参考资料

《Javascript高级程序设计(第3版)》第三章数据类型

原文链接:segmentfault.com

上一篇:重温Javascript:基本语法
下一篇:ajax原理及常见面试题
相关文章

首次访问,人机识别验证

扫描下方二维码回复 1024 获取验证码,验证完毕后 永久 无须验证

操作步骤:[打开微信]->[扫描上侧二维码]->[关注 FedJavaScript 的微信] 输入 1024 获取验证码

验证码有误,请重新输入