Javascript高级编程 3章23页 数据类型

174 阅读8分钟

数据类型

  • ECMAScript 有5种 简单数据类型
    • Undefined
    • Null
    • Boolean
    • Number
    • String
  • ECMAScript 有1种 复杂数据类型
    • Object:本质上是 由一组无序的名值对组成

ECMAScript不支持任何创建自定义类型的机制,所有的值最终都是上述6种类型之一

typeof 操作符

对一个值使用typeof操作符,返回如下字符串

  • "undefined" 此值未定义
  • "boolean" 此值是布尔值
  • "string" 此值是字符串
  • "number" 此值是数值
  • "object" 此值是对象null
  • "function" 此值是函数
var message = "some string";
alert(typeof message);  // "string"

//typeof是操作符不是函数,因此括号虽可用,但不是必需的
alert(typeof(message));  //"string"

//操作数可以是字面量
alert(typeof 95);   //"number"

// typeof null //"object"

//typeof 正则表达式  //"object"或"function",视浏览器而定

Undefined 类型

  • Undefined类型只有一个值,那就是undefined
  • 字面值undefined:
    • 主要目的是,用于比较
    • 引入它,是为了正式区分 空对象指针未经初始化的变量
    • 无论在什么情况下,都没有必要把一个变量的值,显式地设为undefined
//message包含undefined值
var message = undefined;

//一般来说,没必要显式初始化为undefined,默认就会是这个值
alert(message)  //"undefined"

//从比较的角度来说,与上面的例子等价
alert(message == undefined); //true

alert(typeof message) //"undefined"

尚未声明的变量

var message, message尚未声明的变量

  • 只能执行一项操作, 那就是typeof操作符检测其数据类型
  • delete操作,在严格模式下,会有错误。
//message是尚未声明的变量,自动取得undefined的值。
var message;

//undefined字面值,用于比较
alert(message == undefined); //true

alert(message)  //产生错误

alert(typeof message)  //"undefined"

被显式初始化为包含undefined值的变量尚未声明的变量,还是不一样的:例如,而前者alert()返回"undefined",后者alert()会产生错误

Null类型

  • Null类型只有一个值,那就是null
  • null值,表示一个空对象指针
  • undefined值,派生自,null
  • 只要意在保存对象的变量,还没有真正保存对象,就应该让该变量先保存着null
var car = null;

alert(typeof car)  //"object"

alert(null == undefined)  //true
//在这里,操作符==, 为了比较,会转换操作数

if(car != null) {

}

Boolean类型

  • 只有两个字面值truefalse
    • 大小写敏感

    • 和数字值不是一回事,true不一定等于1, false也不一定等于0

    • ECMAScript中所有类型的值,都有与truefalse等价的值。可以用Boolean()函数,来得到一个值对应的Boolean值

类型转换为false的值转换为true的值
Booleanfalsetrue
String"" (空字符串)非空字符串
Number0和NaN非零数字(包括无穷大)
Objectnull任何对象
Undefinedundefinedn/a(或者N/A), not applicable, 表示不适用

Number类型

  • 包括,整数浮点数(双精度数)
  • 数值字面量格式
    • 十进制,例如 55
    • 八进制,例如 080
      • 第一位必须是0
      • 后跟(0 ~ 7)
      • 若超出范围,则第一位的0会被忽略,按照十进制来解析
      • 八进制字面量在严格模式下无效
    • 十六进制,例如0xA
      • 前两位必须是0x
      • 后跟(0 ~ 9, A ~ F 或 a ~ f)

算术计算时,八进制和十六进制,都会被转换成十进制

浮点数值

  • 浮点数:必须包含一个小数点,且小数点后必须至少一位数字
  • 浮点数占用的内存空间是整数的两倍,因此ECMAScript会趁机姜浮点数值转换为整数值。
  • ECMAScript会趁机将小数点后带有6个0及以上的数值转换为科学计数法表示的数值。
  • 浮点数最高精度是17位小数
  • 0.1 + 0.2 结果不是0.3, 而是0.30000 00000 00000 04。这是舍入误差
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1 //不推荐,但有效

var floatNum4 = 1. //解析为整数值 1
var floatNum5 = 10.0  //解析为整数值 10

var floatNum6 = 3.125e7;  //科学计数法,等于31250000

if(a + b == 0.3)  //由于舍入误差,因此不要,这样测试,特定浮点数值
{
    alert("you got 0.3");
}

数值范围

  • ECMAScript能表示的
    • 最小数值,Number.MIN_VALUE = 5e-324
    • 最大数值,Number.MAX_VALUE = 1.7976931348623157e+308
  • 超出范围时
    • 自动转换为Infinity,Number.POSITIVE_INFINITY
    • 或者-Infinity, Number.NEGATIVE_INFINITY
    • Infinity,无法参与下一次计算
  • isFinite() 方法
var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result))  //false

NaN

  • Not a Number
  • 是一个特殊的数值
  • 表示本来要返回数值的操作数未返回数值的情况
  • 这样就不会抛出错误了
  • 任何涉及NaN的操作,都返回NaN
  • NaN与任何值都不相等,包括NaN本身
  • isNaN()
    • 尝试将参数转换为数值
      • 若能,返回false
      • 若不能,返回true
    • 参数可以是任何类型
      • 若是对象, 首先调用对象的valueOf()方法,得到返回值尝试将返回值转换为数值
        • 若能,返回false
        • 若不能,对返回值调用toString()方法,得到返回值尝试将返回值转换为数值
          • 若能,返回false
          • 若不能,返回true

数值转换

有三个函数, 把非数值,转换成数值。它们对于相同的输入,会有不同的返回结果

  • Number(),可用于任何类型
  • parseInt(), 专门用于字符串类型
  • parseFloat(),专门用于字符串类型

Number()

处理方式
Boolean值true返回1, false返回0
数字值返回原样
null返回0
undefined返回NaN
字符串见下
对象见下

字符串的处理方式:

字符串情况处理方式注释
只包含数字转换为十进制包括正负号,忽略前导0
包含有效的浮点格式转换为浮点数值忽略前导0
包含有效的十六进制格式转换为相等的十进制
空字符串转换为0
以上其他格式转换为NaN

对象的处理方式:

  • 首先调用对象的valueOf()方法,得到返回值尝试对返回值使用Number()
    • 若转换结果不为NaN,返回转换结果
    • 若转换结果为NaN,对对象调用toString()方法,得到字符串尝试对字符串使用Number()

parseInt()

  • Number()在处理字符串时,比较复杂,且不够合理
  • 因此处理字符串时,更常用parseInt() 规则:
  • 忽略前面的空格
  • 如果第一个字符不是数字或者负号,则返回NaN
  • 继续解析第二个字符
    • 直到解析完所有
    • 或者遇到一个非数字字符(小数点也算非数字字符)
  • 能够识别各种整数格式
    • 八进制,0 (ECMAScript 5开始,不能解析八进制)
    • 十六进制,0x
  • 为了避免自行解析不同整数格式时,不同ECMAScript行为不同而产生困惑,建议显示指定几进制

parseFloat()

  • parseFloat()parseInt()很相似 parseFloat()的不同之处:
  • 从前往后,第一个小数点是有效的
  • 始终忽略前导0,意味着只能解析十进制
  • 如果字符串实际上包含一个整数,则实际上会返回整数

String类型

  • 16位的Unicode字符组成
  • 字符个数,0个或多个
  • 单引号和双引号,都一样
  • 字符串不可变
    • 一旦创建,值就不能变
    • 变量改变值,只能销毁原来的字符串,用新字符串填充该变量

字符字面量

  • String类型有一些特殊的字符字面量,也叫转义序列
  • 表示非打印字符,或其他用途
  • 可以出现在字符串中的任意位置
  • 被作为一个字符来解析
字面量含义
\n换行
\tTab
\b退格
\r回车
\f进纸
\\斜杠
\'单引号
\"双引号
\xnn一个字符,占16bit,由2个16进制数表示
\unnnn一个Unicode字符,占32bit (双字节字符),由4个16进制数表示

转换为字符串

有3种方法

  • tostring()方法
  • String()方法
  • +,与一个字符串"",加到一起

tostring()方法

  • 不是所有的值,都有tostring()方法
    • 数值,布尔值,对象,字符串:有
    • null值,undefined值:没有
  • 对于数值,可以指定转换为几进制
var age = 11;
var ageAsString = age.tostring() //"11"

var found = true;
var foundAsString = found.tostring() //"true"

var num = 10;
alert(num.tostring(16)) //"a"

String()方法

  • 该值有tostring()方法,就用之
  • 该值没有tostring()方法:
    • null值,返回"null"
    • undefined值,返回"undefined"
var value1 = null;
alert(String(value1)) //"null"

var value2;
alert(String(value2))  //"undefined"

Object 类型

var o = new Object();

var o = new Object; //有效。括号可以省略,但不推荐
  • 创建Object类型,为其添加属性或方法,就可以创建自定义对象
  • Object类型的所有方法和属性,也存在于更具体的对象
Object的属性或方法
构造函数Object()
hasOwnProperty()当前对象实例(而非实例原型)是否包含给定属性
isPrototypeOf()传入对象,是否为当前对象实例的原型
propertyIsEnumerable()当前对象实例给定属性,是否能用for-in来枚举
toLocaleString()当前对象实例的字符串表示,当地的
toString()当前对象实例的字符串表示
valueOf()当前对象实例的字符串表示, 或数值表示,或布尔表示。通常与toString()相同

ECMA-262中对象的行为不一定适用于Javascript中的其他对象,例如宿主对象

  • 浏览器环境中的对象,例如BOMDOM,都属于宿主对象
  • 宿主对象,由宿主提供和定义。
  • 因此宿主对象,可能会继承Object,也可能不会