数据类型

JavaScript 拥有动态类型。这意味着相同的变量可用作不同的类型,如:

var x                // x 为 undefined
var x = 6;           // x 为数字
var x = "Bill";      // x 为字符串

但是 JavaScript 是有类型的。 其中每一个变量都是有类型的,JavaScript 的数据类型,共有六种:(ES6又新增 Symbol 类型,在此不介绍。)

  • 数值(number)
  • 字符串(string)
  • 布尔值(boolean)
  • 对象(object)
  • undefined
  • null

字符串(string)

字符串是存储字符(比如 "Bill Gates")的变量。 字符串可以是引号中的任意文本。可以使用单引号或双引号:

var carname="Bill Gates";
var carname='Bill Gates';

当字符串本身包含引号的时候,可以使用合理使用单引号或者双引号避开:

var answer="Nice to meet you!";
var answer="He is called 'Bill'";
var answer='He is called "Bill"';

数值(number)

JavaScript 只有一种数字类型。数字可以是整数,也可以是浮点数(可以带小数点,也可以不带):

var x1=34.00;      //使用小数点来写
var x2=34;         //不使用小数点来写

极大或极小的数字可以通过科学(指数)计数法来书写:

var y=123e5;      // 12300000
var z=123e-5;     // 0.00123

数值范围

JavaScript Number不能表示所有数字,有个范围

  • Number.MIN_VALUE: 5e-324
  • Number.MAX_VALUE: 1.7976931348623157e+308

如果超过这个范围数字会被转为特殊的Infinity值表示无穷,-Infinity表示负无穷

可以通过函数isFinite判断数字是否是无穷

isFinite(Number.MAX_VALUE + 1); // true
isFinite(Infinity);  // false
isFinite(NaN);       // false
isFinite(-Infinity); // false

isFinite(0);         // true
isFinite(2e64);      // true

isFinite("0");       // true

NaN

NaN含义是Not a Number,表示非数字,NaN和任何值都不相等,包括自己

NaN == NaN; //false

布尔值(boolean)

布尔(逻辑)只能有两个值:true 或 false。

var x=true
var y=false

布尔值多数用于条件语句中

对象(object)

对象又可以分成三个子类型。

  • 狭义的对象(object)
  • 数组(array)
  • 函数(function)

狭义的对象和数组是两种不同的数据组合方式,而函数其实是处理数据的方法。在 JavaScript 中函数是一等公民,可以其他类型的数据一样,进行赋值和传递,体现了JavaScript作为“函数式语言”的本质。

狭义的对象(object)

对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。属性由逗号分隔:

var person={firstname:"Bill", lastname:"Gates", id:5566};

我们可以通过两种方式取出对象中的数据:

name=person.lastname;
name=person["lastname"];

这里需要明确的是,JavaScript的所有数据,都可以视为广义的对象。不仅数组和函数属于对象,就连原始类型的数据(数值、字符串、布尔值)也可以用对象方式调用。

var t = 5
t.toString() // "5"
t = true
t.toString() // "true"

但是,对于字面量,不可以直接调用函数

5.toString() // err

为了避免混淆,此后除非特别声明,本教程的”对象“都特指狭义的对象。

数组(array)

数组对象用来在单独的变量名中存储一系列的值。 我们使用关键词 new 来创建数组对象。下面的代码定义了一个名为 myArray 的数组对象:

var myArray=new Array()

有三种向数组赋值的方法(你可以添加任意多的值,就像你可以定义你需要的任意多的变量一样)。

  1. 使用 new Array() 新建数组
    var mycars=new Array()
    mycars[0]="Saab"
    mycars[1]="Volvo"
    mycars[2]="BMW"
    
    也可以使用一个整数自变量来控制数组的容量:
    var mycars=new Array(3)
    mycars[0]="Saab"
    mycars[1]="Volvo"
    mycars[2]="BMW"
    
  2. var mycars=new Array("Saab","Volvo","BMW")
    
  3. var mycars=["Saab","Volvo","BMW"]
    

我们可以工作数组下标取出数组中的数据

mycars[0] // "Saab"

函数

数是由事件驱动的或者当它被调用时执行的可重复使用的代码块。

我们可以用如下方法声明函数:

function name(){
  // 这里是要执行的代码
}

JS 中函数比较复杂,后面我们会有专门章节介绍

类型转换

ECMAScript 给开发者提供了大量简单的类型转换方法。

大部分类型具有进行简单转换的方法,还有几个全局方法可以用于更复杂的转换。无论哪种情况,在 ECMAScript 中,类型转换都是简短的一步操作。

转换成字符串

ECMAScript 的 Boolean 值、数字和字符串的原始值的有趣之处在于它们是伪对象,这意味着它们实际上具有属性和方法。我们可以使用 toString() 方法将他们转换为字符串

var bFound = false;
bFound.toString();    // "false"

var iNum1 = 10;
var iNum2 = 10.0;
iNum1.toString();    // "10"
iNum2.toString();    // "10"

Number 类型的 toString() 方法比较特殊,它有两种模式,即默认模式和基模式。采用默认模式,toString() 方法只是用相应的字符串输出数字值(无论是整数、浮点数还是科学计数法),如下所示:


var iNum = 10;
iNum.toString(2);    // "1010"
iNum.toString(8);    // "12"
iNum.toString(16);    // "A"

转化为数字

ECMAScript 提供了两种把非数字的原始值转换成数字的方法,即 parseInt() 和 parseFloat()。

前者把值转换成整数,后者把值转换成浮点数。只有对 String 类型调用这些方法,它们才能正确运行;对其他类型返回的都是 NaN。

var iNum1 = parseInt("12345red");    //返回 12345
var iNum1 = parseInt("0xA");    //返回 10
var iNum1 = parseInt("56.9");    //返回 56
var iNum1 = parseInt("red");    //返回 NaN
var fNum1 = parseFloat("12345red");    //返回 12345
var fNum2 = parseFloat("0xA");    //返回 NaN
var fNum3 = parseFloat("11.2");    //返回 11.2
var fNum4 = parseFloat("11.22.33");    //返回 11.22
var fNum5 = parseFloat("0102");    //返回 102
var fNum1 = parseFloat("red");    //返回 NaN

当然有更简单的方法

var str = "5.1"
var num = +str // 5.1

转化为布尔值

var t = 0
var b = !!t // false

强制类型转换

ECMAScript 中可用的 3 种强制类型转换如下:

  • Boolean(value) - 把给定的值转换成 Boolean 型;
  • Number(value) - 把给定的值转换成数字(可以是整数或浮点数);
  • String(value) - 把给定的值转换成字符串;
var b1 = Boolean("");        //false - 空字符串
var b2 = Boolean("hello");        //true - 非空字符串
var b1 = Boolean(50);        //true - 非零数字
var b1 = Boolean(null);        //false - null
var b1 = Boolean(0);        //false - 零
var b1 = Boolean(new object());    //true - 对象
Number(false)    // 0
Number(true)    // 1
Number(undefined) // NaN
Number(null)    // 0
Number("1.2")    // 1.2
Number("12")    // 12
Number("1.2.3")    // NaN
Number(new object())    // NaN
Number(50)    // 50
var s1 = String(null);    //"null"
var oNull = null;
var s2 = oNull.toString();    //会引发错误

typeof运算符

JavaScript有三种方法,可以确定一个值到底是什么类型。

  • typeof运算符
  • instanceof运算符
  • Object.prototype.toString方法

instanceof运算符和Object.prototype.toString方法,将在后文相关章节介绍。这里着重介绍typeof运算符。

typeof运算符可以返回一个值的数据类型,可能有以下结果。

(1)原始类型

数值、字符串、布尔值分别返回numberstringboolean

typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"

(2)函数

函数返回function

function f() {}
typeof f
// "function"

(3)undefined

undefined返回undefined

typeof undefined
// "undefined"

利用这一点,typeof可以用来检查一个没有声明的变量,而不报错。

v
// ReferenceError: v is not defined

typeof v
// "undefined"

实际编程中,这个特点通常用在判断语句。

// 错误的写法
if (v) {
  // ...
}
// ReferenceError: v is not defined

// 正确的写法
if (typeof v === "undefined") {
  // ...
}

(4)其他

除此以外,其他情况都返回object

typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"

从上面代码可以看到,空数组([])的类型也是object,这表示在JavaScript内部,数组本质上只是一种特殊的对象。另外,null的类型也是object,这是由于历史原因造成的,为了兼容以前的代码,后来就没法修改了,并不是说null就属于对象,本质上null是一个类似于undefined的特殊值。

既然typeof对数组(array)和对象(object)的显示结果都是object,那么怎么区分它们呢?instanceof运算符可以做到。

var o = {};
var a = [];

o instanceof Array // false
a instanceof Array // true

null 和 undefined 的区别

nullundefined都可以表示“没有”,含义非常相似。将一个变量赋值为undefinednull,从语义上其实并没有什么区别。

var a = undefined;
// 或者
var a = null;

上面代码中,a变量分别被赋值为undefinednull,这两种写法的效果几乎等价。

if语句中,它们都会被自动转为false,相等运算符(==)甚至直接报告两者相等。

if (!undefined) {
  console.log('undefined is false');
}
// undefined is false

if (!null) {
  console.log('null is false');
}
// null is false

undefined == null
// true

对于nullundefined,可以大致可以像下面这样理解。

null表示空值,即该处的值现在为空。典型用法是:

  • 作为函数的参数,表示该函数的参数是一个没有任何内容的对象。
  • 作为对象原型链的终点。

undefined表示不存在值,就是此处目前不存在任何值。典型用法是:

  • 变量被声明了,但没有赋值时,就等于undefined。
  • 调用函数时,应该提供的参数没有提供,该参数等于undefined。
  • 对象没有赋值的属性,该属性的值为undefined。
  • 函数没有返回值时,默认返回undefined。
var i;
i // undefined

function f(x){console.log(x)}
f() // undefined

var o = new Object();
o.p // undefined

var x = f();
x // undefined

参考

数据类型转换

results matching ""

    No results matching ""