您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

JavaScript 数据类型

数据类型就是 JavaScript 中可操作的数据的类型。

数据类型分为值类型引用类型

在 ES6 之前,主要有以下数据类型:

在学习自然数学的时候,所有的加法减法等操作都是针对数字的,数字操作符让他们有了意义。

在学习语文课的时候,不同的词语可以组合成句子,主谓宾语法与词语相互结合赋予了句子意义。

在 JavaScript 中也是如此,配合数据类型才能知道怎么对数据进行操作。

上一小节有提到的字符串与数字就是如此。

3 + 4,JavaScript碰到两边都是数字,就会做对应的加法操作。

程序需要不同类型的数据表示不同的,分别做对应的处理。

字符串由字符组成,字符串在使用的时候会使用双引号(")或者单引号(')包裹。

var str1 = '字符串';
var str2 = "字符串";

console.log(str1); // :"字符串"
console.log(str2); // :"字符串"

上述例子中,两个变量都是字符串类型的,可以双引号和单引号包裹的结果是一样的。

但是如果需要在双引号包裹的字符串中使用双引号,或者在单引号包裹的字符串中使用单引号,需要使用\进行转义,否则会报错,因为 JavaScript 无法知道字符串的结束位置。

var str1 = '使\'用\'单\'引\'号';
var str2 = "使\"用\"双\"引\"号";

console.log(str1); // :"使'用'单'引'号"
console.log(str2); // :"使"用"双"引"号"

// 以下会报错
var str3 = "哼"!";
var str4 = ''哼!';

大部分开发者会使用单引号包裹字符串。

因为为了网页的动态展示、复杂交互等,需要用 JavaScript 书写 HTML 模版,而 HTML 的按照习惯是使用双引号包裹的(XML 标准允许单引号和双引号,在 HTML5 的标准中甚至不需要书写引号)。

这样如果使用 JavaScript 中的字符串表示 HTML 就会变成如下情况:

var html = "<div class=\"title text-red\" style=\"display: inline-block;\">我是红色的</div>";

为了契合书写 HTML 的习惯,防止中充斥的大量的转义,就会使用如下使用单引号的形式。

var html = '<div class="title text-red" style="display: inline-block;">我是红色的</div>';

数字是最好理解的一种类型,因为生活中都会接触到。

数字可以细分为浮点数和整数,浮点数就是带有小数位的数,但事实上在 JavaScript 只有64位的浮点数,具体的范围是 [-2^53 ~ 2^53],整数也使用浮点数表示。

数字类型也存在负数,如果数字的区间为 (0, 1),则可以省略小数点前的 0

var num1 = ;
var num2 = .;
var num3 = ;
var num4 = -;
var num5 = ;

以上是数字的一些表示方式。

如果数字的大小超过最大值或者最小值,那他的值在 JavaScript 中会表示为 Infinity-Infinity

var base = ;

var num1 =  * base;

var num2 = - * base;

console.log(num1); // :Infinity
console.log(num2); // :-Infinity

这两个值分别表示为无穷大无穷小

JavaScript 中还可以用数字表示二进制八进制十六进制

二进制是以 0b 开头的数字。

var val10 = ;
var val8 = ;

console.log(val10); // :10
console.log(val8); // :8

在的时候还是会以十进制的结果进行。

八进制则可以用 0 开头的数字表示。

var val56 = ;

console.log(val56); // :56

十六进制使用 0x 开头表示。

var val10 = ;

console.log(val10); // :10

十六进制是比较常用的一种方式,二进制和八进制的表示使用相对较少。

布尔值表示两种状态,如同使用零和一区分状态的开关一样。

布尔值两种状态对应 truefalse 两个值。

通常 true 被称为真值false 被称为假值,两者也被统一称为布尔值

var empty = true;

var isVIP = false;

通常在只有两种状态的情况下会使用布尔值。

以下值在转换成布尔值的时候会转换成 false

null是非常特殊的类型,表示对象的值未设置,也可以简单理解成什么都没有

通常null会在应该到对象,但是没到的时候进行使用,结合对象会更好理解。

在初始化变量的时候,有时候类型不确定,或者应该是对象,但还有设置值的时候会使用到null。

var obj = null;

undefined从意思上理解就是不确定或者没有定义。

变量在声明后如果没有赋值,他的值就是undefined

var age;

console.log(age); // :undefined

在没有指定返回值的时候,认就会返回undefined

function fn() {
  console.log('我是名字为fn的');
}

var val = fn();

console.log(val); // :undefined

fn没有提供返回值,但val的值为undefined

比较有趣的是,undefined既是一种数据类型,在浏览器中又是作为存在的,也就是window对象下的。

console.log('undefined' in window); // :true

使用in关键字可以校验某个对象下是否存在某个。这里的意思就是undefined是否在window对象下存在。

控制台会布尔值true,为真值,表示是确实存在的。

其实是一段 JavaScript ,就会执行中的。

使用 function 关键字就可以定义,简单的语法如下:

function (参数) {;

  return 返回值;
}

var ret = (参数) // 

名就是的名字,在的时候会被使用到。

参数则是传递给的数据,内部可以访问到传进来的参数。

return 则标志着的结束,返回值会被作为结果进行返回。

function add(arg1, arg2) {
  var sum = arg1 + arg2;

  return sum;
}

var num1 = add(, );
var num2 = add(, );

console.log(num1); // :3
console.log(num2); // :6

上面这个例子就是声明了名为 add 的,其就是把两个参数求和并返回。

可以看到让更加有 意义add 的地方可以很好的理解这里是在做求和操作,同时提高了的复用率。

对象由和组成。

其格式如下:

var obj = {: 值,
  名: 值,
  名: ,: ,
  '名3':,
};

名和名都为字符串,如果其符合变量命名规范,则可以不使用引号包裹。

本质上也可以算作,通常在对象里的值为,就会称之为。

var obj = {
  name: '小明',
  age: ,
  say: function() {
    console.log('我叫' + this.name + ', 我的年龄是' + this.age + '岁');
  },
  'father-name': '小蓝',
};

console.log(obj.name); // :小明
console.log(obj['father-name']); // :小蓝

obj.say(); //  say ,会:我叫小明, 我的年龄是12岁

上述例子中的 obj 对象具有三个(name、age、father-name)(say)。

可以是任意的数据类型,格式为名: 值,多个则由逗号(,)分隔,则只能为,通常会是匿名(相关的详细可以查阅章节)。

通过对象.就可以访问到对象的值,如果名是不符合变量命名规范的值,则可以通过对象['名']进行访问,同理,因为本质上也是。

既然可以是任意的数据类型,则也可以是对象:

var obj = {
  name: '小明',
  colors: {
    hair: 'red',
    eye: 'blue',
    skin: 'white',
  },
};

理论上在内存允许的情况下,可以进行无限层的对象嵌套。

以上的例子都是采用字面量的方式创建对象,还有许多种方式可以创建对象。

如使用Object构造新对象。

var obj = new Object();

obj.name = '小明';
obj.age = ;

obj.colors = {
  hair: 'red',
  eye: 'blue',
};

console.log(obj.colors.hair); // :red
console.log(obj.name); // :小明

obj.name = '小红';

console.log(obj); // 将会在控制台 obj 对象

通过 new Object() 就可以创建新的对象。

通过对象. = 值的方式就可以设置和值,这一方式遵循以下规则:

另外还可以使用构造Object.create等方式创建对象,具体请参考对象章节。

数组是一组数据构成的列表。

数组由中括号包裹,每一项通过逗号进行分隔:

var arr = [, '2', , , ];

console.log(arr[]); // :1
console.log(arr[]); // :"2"

和对象一样的是,数组的每一项也可以是任意类型的数据。

如果需要访问数组中的每一项可以通过数组[下标]的格式进行访问。

下标就是数组每一项的编号,这个编号从0开始,第一项为0,第二项为1,以此类推。

数组可以理解成一种特殊的对象,他原生具有一些,如遍历数组:

var arr = ['a', 'b', 'c'];

arr.forEach(function(item, index) {
  console.log(item, index); // "a" 0, "b" 1, "c" 2
});

通过数组.forEach的方式就可以遍历数组,forEach接受,这个在遍历到每一项的时候会被,并将每一项的值和下标作为参数传递过来。

既然具有一些,同样的也具有一些,最常用的就是length

var arr = [, , ];

console.log(arr.length); // :3

数组的 length 会返回数组的长度。

从内存角度出发,值类型放在内存栈中,引用类型则放在内存堆中。

引用类型的数据长度是不固定的,如对象所占用的空间很大一部分由值决定,而值又可以是任意类型。

另外最大的区别就如名一样,引用类型的数据本身是指向内存上的一块地址,操作的时候对地址上的值进行操作。

而值类型直接操作值,不论是复制或是都是直接产生新的值。

var obj1 = {
  name: '小明',
};

var obj2 = obj1;

obj2.name = '小红';

console.log(obj1.name); // :小红


var val1 = ;
var val2 = val1;

val2 = ;
console.log(val1); // :1

通过上面的例子就可以看出引用类型和值类型在 JavaScript 程序中的区别。

引用类型在进行复制的时候,其实就是多了引用,操作的值是同。

而值类型进行复制后,则是新的值。


联系我
置顶