数据类型
Javascript(JS) 的数据类型可以分为两类:原始类型和对象。
原始类型有6种:
-
布尔 Boolean. 布尔类型与其他语言中的布尔类型一样,表示逻辑实体,只有两个值
true
或false
。 -
Null, 表示“空”,与其他语言中的Null一样, 只有一个值
null
; -
Undefined, 顾名思义表示 “未定义", 即一个变量没有被定义类型。因为JS是动态语言,变量的类型是根据赋值类型自动确定的,因此“未定义”也可以理解未赋值。另外也可以用来判断对象中某个属性有没有被定义,函数的参数有没有传入。
-
Number, 表示数字,与其他语言不同,JS 中不区分整数和浮点数,所有的数都是Number, 表示的数据范围是双精度64位二进制格式值的区间。此外,JS的Number类型还包括3个特殊的值:
+Infinity
,-Infinity
,NaN
. 数据大于范围最大值的为+Infinity
,数据小于数据最小值的为-Infinity
。计算机计算不出的是NaN
。 -
String, 与其他语言一样表示字符串。但是在JS中字符串可以用单引号表示,也可以用双引号表示。
-
Symol, 表示符号类型,是ES6新引入的。
对象可以看作是一组属性的集合,包括,标准Object,Array,function,Date,以及ES6中引入的Maps,Sets。
-
标准object,可以采用字面量的方式定义,即
{}
, 也可以采用new Object()
的方式定义。 -
Array,是以索引为键,元素为值对象。可采用字面量的方式定义,即
[]
,也可以采用new Array()
的方式定义。 -
function,是一个具有调功能的对象. 使用关键字“function”定义。
-
Date,内建对象,采用
new Date()
方式定义一个日期对象。
数据类型判断
采用typeof 运算符判断数据类型:
'''javascript
typeof "a"; // "string"
typeof 1; // "number"
typeof true; // "boolean"
typeof null; // "object"
typeof undefined; // "undefined"
typeof NaN; // "number"
typeof(+Infinity); // "number"
typeof({}); // "object"
typeof([]); // "object"
typeof(function(){}); // "function"
'''javascript
缺点:
typeof 无法区分 null,array 和 object
注意:
typeof 会返回字符串, 两个typeof 连用时会返回 "string"
.
```javascript
typeof typeof {};// "string"
```javascript
采用Object.prototype.toString.call() 精确判断
Object.prototype.toString.call({})
"[object Object]"
Object.prototype.toString.call(new FormData())
"[object FormData]"
Object.prototype.toString.call(()=>{})
"[object Function]"
Object.prototype.toString.call([])
"[object Array]"
Object.prototype.toString.call("")
"[object String]"
Object.prototype.toString.call(1)
"[object Number]"
Object.prototype.toString.call(NaN)
"[object Number]"
Object.prototype.toString.call(+Infinity)
"[object Number]"
Object.prototype.toString.call(true)
"[object Boolean]"
Object.prototype.toString.call(null)
"[object Null]"
Object.prototype.toString.call(undefined)
"[object Undefined]"
Object.prototype.toString 可以精确区分 array, object,null, 甚至 formData
数据类型转换
不同数据类型转布尔类型时,只有以下数据是转为false:
null
undefined
""
NaN
0
其他数据会转为true,常见易引起混淆的有:
+Infinity
-Infinity
[]
{}
"false"
String 类型转换为数字类型,可使用内置的Number对象的方法来实现,也可以使用JS内置的全局函数来实现。
```javascript
Number.parseFloat("1.12");//1.12/
Number.parseInt("1.12");//1/
Number("1.12");//1.12/
parseFloat("1.12");//1.12/
parseInt("1.12");//1/
```
其中Number()
函数与 parseFloat()
和parseInt()
的区别在于后者转换的是第一个无效字符之前的字符串,而前者是强制转换整个字符串,因此只要字符串中含无效字符,函数就会返回NaN
.
```javascript
parseInt("1.01a");//1
parseFloat("1.01a");//1.01
Number("1.01a");//NaN
parseInt("a1.01")//NaN
parseFloat("a1.01");//NaN
```javascript
数字转换成String 类型, 使用全局函数String()
或者使用Number
对象方法来实现。其中全局函数只能按照十进制转换。
```javascript
(1).toString();//默认按10进制转换为字符串"1"
(3).toString(2);//按2进制转换为字符串"11"
(13).toString(8);//按8进制转换为字符串"15"
(23).toString(16);//按16进制转换成字符串"17"
(1.1).toFixed(2);//转换成小数点后保留2为的字符串 "1.10"
(11.11).toPrecision(3);//转换成3位数字的字符串"11.1";
String(1);///"1"
""+1; //"1"
1+""; //"1"
```javascript
数据的传递
JS中所有原始类型的数据都是按值传递,所有对象都是按地址传递。
```javascript
var a=0;
var b=a;//将a的值复制了一份给b
var c={a:1};
var d=c;//将c地址复制一份给d,c和d指向同一片地址内存
d.a=2;
console.log(c.a);// 2
```javascript