在 JavaScript中数据类型有分为基本的数据类型和引用数据类型。
基本数据类型
- Number(ES5): typeof()返回"number"。用于任何类型的数字:整数或者浮点数。
- String(ES5): typeof()返回"string"。用于字符串。一个字符串可以包含一个或多个字符,所以没有单独的单字符类型。
- Boolean(ES5): typeof()返回"boolean"。用于 true 和 false。
- Null(ES5): typeof()返回"object"。用于未知的值 —— 只有一个 null 值的独立类型。
- Undefined(ES5): typeof()返回"undefined"。用于未定义的值 —— 只有一个 undefined 值的独立类型。
- Symbol(ES6): typeof()返回"symbol"。用于唯一的标识符。
Undefined类型
只有一个值,即undefined值。使用var声明了变量,但未给变量初始化值,那么这个变量的值就是undefined。
Null类型被看做空对象指针,前文说到null类型也是空的对象引用。
引用数据类型(Object)
js中对象是一组属性与方法的集合。这里就要说到引用类型了,引用类型是一种数据结构,用于将数据和功能组织在一起。引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。三大引用类型:
-
Object类型
我们看到的大多数类型值都是Object类型的实例,创建Object实例的方式有两种。
第一种是使用new操作符后跟Object构造函数,如下所示
var person = new Object();
person.name = "Micheal";
person.age = 24;
第二种方式是使用对象字面量表示法,如下所示
var person = {
name : "Micheal",
age : 24
};
-
Array类型
数组的每一项可以用来保存任何类型的数据,也就是说,可以用数组的第一个位置来保存字符串,第二个位置保存数值,第三个位置保存对象....另外,数组的大小是可以动态调整的。
创建数组的基本方式有两种
第一种是使用Array构造函数,如下所示
var colors = new Array("red","blue","yellow");
第二种是使用数组字面量表示法,如下所示
var colors = ["red","blue","yellow"];
-
Function类型
每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。函数通常是使用函数声明语法定义的,如下所示
function sum(num1,num2){
return num1 + num2;
};
这和使用函数表达式定义函数的方式相差无几。
var sun = function (){
return sum1 + sum2;
};
总结
基本数据类型和引用数据类型访问
- 基本类型值:存在栈中,按值访问,操作的是他们实际保存的值;
- 引用类型值:栈中保存地址,堆中保存值,按引用访问,当查询时,我们需要先从栈中读取内存地址,然后再顺藤摸瓜地找到保存在堆内存中的值;
基本数据类型和引用数据类型复制
- 基本类型变量的传递(复制):(互不干涉)
从一个变量向一个变量复制时,会在栈中创建一个新值,然后把值复制到为新变量分配的位置上,改变源数据不会影响到新的变量; - 引用类型变量的传递(浅复制):(铁锁连横)
复制的是存储在栈中的指针,将指针复制到栈中未新变量分配的空间中,而这个指针副本和原指针执行存储在堆中的同一个对象,复制操作结束后,两个变量实际上将引用同一个对象;因此改变其中的一个,将影响另一个;
typeof 运算符可以查看变量的类型:
- 两种形式:typeof x 或者 typeof(x)。
- 返回的类型的字符串,比如 "string"。
- null 返回 "object" —— 这是语言中的一个错误,实际上它并不是一个对象
- Symbol 返回"function"
- 一般object建议用instanceof来判断类型
typeof Symbol() // 'symbol'
typeof Number() // 'number'
typeof Sring() // 'string'
typeof Function() // 'function'
typeof Objecr() // 'object'
typeof Boolean() // 'boolean'
typeof null() // 'object'
typeof undefined() // 'undefined'
typeof用于判断基本类型,instanceof 用于判断对象类型。
类型转换
-
转换为 number 类型
值 | 转换 |
---|---|
undefined | NaN |
null | 0 |
true 和 false | 1 and 0 |
string | 字符串开始和末尾的空白会被移除,剩下的如果是空字符串,结果为 0,否则 —— 从字符串中读出数字。错误返回 NaN。 |
-
使用Number()显示转换
let str = '123';
alert(str); // string
let num = Number(str);
alert(typeof num); // number
-
使用算术操作符+
let str = '123';
alert(str); // string
let num = +str;
alert(typeof num); // number
alert(str + 4); // '1234',字符串拼接
-
使用算术操作符/
alert('6'/'3'); // 2
-
使用位运算符~~
alert(typeof ~~'123'); // number
-
转换为 string 类型
-
显示转换:String()
-
隐式转化:'hello' + 123
-
转换为 boolean 类型
-
假值,比如 0、空的字符串、null、undefined 和 NaN 变成 false。
-
其他值变成 true。'0',[],' '(空格,属于非空的字符串)----true
-
操作符:Boolean()
-
操作符:!!
测试题
1、 最终输出是什么值?
var a = 100;
var b = a;
a = 200;
console.log (b);
2、 最终输出是什么值?
var a = {age : 20};
var b = a;
b.age = 21;
console.log (a.age);
3、 最终输出是什么值?
console.log("" + 1 + 0);
console.log("" - 1 + 0);
console.log(true + false);
console.log(6 / "3");
console.log("2" * "3");
console.log(4 + 5 + "px");
console.log("$" + 4 + 5);
console.log("4" - 2);
console.log("4px" - 2);
console.log(7 / 0);
console.log(" -9\n" + 5);
console.log(" -9\n" - 5);
console.log("-4\t"+6);
console.log(null + 1);
console.log(undefined + 1);
console.log(!![]);
console.log(!!'');
console.log(!!' ');