数据类型
最新的ECMAScript 标准定义了7种数据类型
原始类型
- 基本类型的变量是存放在栈内存(Stack)里的
- 基本数据类型的值是按值访问的
- 基本类型的值是不可变的
- 基本类型的比较是它们的值的比较
- number
- string
- null
- undefined
- boolean
- symbol
引用类型
- 引用类型的值是保存在堆内存(Heap)中的对象(Object)
- 引用类型的值是按引用访问的
- 引用类型的值是可变的
- 引用类型的比较是引用的比较
- Object
- Object、Array、RegExp、Date、Function
- Object
请注意
- NaN 的数据类型是 number
- 数组(Array)的数据类型是 object
- 日期(Date)的数据类型为 object
- null 的数据类型是 object
- 未定义变量的数据类型为 undefined
constructor 属性
- constructor 属性返回所有 JavaScript 变量的构造函数。
"John".constructor // 返回函数 String() { [native code] }
(3.14).constructor // 返回函数 Number() { [native code] }
false.constructor // 返回函数 Boolean() { [native code] }
[1,2,3,4].constructor // 返回函数 Array() { [native code] }
{name:'John', age:34}.constructor // 返回函数 Object() { [native code] }
new Date().constructor // 返回函数 Date() { [native code] }
function () {}.constructor // 返回函数 Function(){ [native code] }
- 你可以使用 constructor 属性来查看对象是否为数组 (包含字符串 "Array"):
function isArray(myArray) {
return myArray.constructor.toString().indexOf("Array") > -1;
}
- 你可以使用 constructor 属性来查看对象是否为日期 (包含字符串 "Date"):
function isDate(myDate) {
return myDate.constructor.toString().indexOf("Date") > -1;
}
显示类型转换
1. Number 函数:转换成数值
1.1 原始类型转换Number 函数
// Number函数:转换成数值
// 数值:转换后还是原来的值
console.log(Number(324)); // 324
// 字符串:如果可以被解析为数值,则转换为相应的数值,否则得到NaN。空字符串转为0
console.log(Number('324'));// 324
console.log(Number('324abc')); // NaN
console.log(Number('')); // 0
// 布尔值:true转成1,false转成0
console.log(Number(false)); // 0
console.log(Number(true));// 1
// undefined: 转成NaN
console.log(Number(undefined)); // NaN
// null: 转成0
console.log(Number(null)); // 0
1.2 对象类型转换Number 函数
- 先调用对象自身的valueOf方法,如果该方法返回原始类型的值(数值、字符串和布尔值),则直接对该值使用Number方法,不再进行后续步骤。
- 如果valueOf方法回复合类型的值,再调用对象自身的toString方法,如果toString方法返回原始类型的值,则对该值使用Number方法,不再进行后续步骤。
- 如果toString方法返回的是复合类型的值,则报错。
var a = {a: 1};
console.log('a', Number({a: 1})); // a NaN
2. String 函数:转换成字符串
2.1 原始类型转换String 函数
// 数值:转为相应的字符串
console.log(String(123)); // "123"
// 字符串:转换后还是原来的值
console.log(String('abc')); // "abc"
// 布尔值:true转为“true”,false转为“false”
console.log(String(true)); // "true"
// undefined:转为“undefined”
console.log(String(undefined)); // "undefined"
// null:转为“null”
console.log(String(null)); // "null"
2.2 引用类型转换String 函数
// 先调用toString方法,如果toString方法返回的是原始类型的值,则对该值使用String方法;
// 如果toString方法返回的是复合类型的值,再调用valueOf方法,如果valueOf方法返回的是原始类型的值,则对该值使用String方法
var b = {
b: 1,
toString: function () {
return {
b: 2,
};
},
valueOf: function () {
return 'b';
},
};
console.log('b', String(b)); // b b
3. Boolean 函数:转换成布尔值
// 以下六个值的转化结果为false,其他的值全部为true
// undefined
// null
// -0
// +0
// NaN
// ''(空字符串)
console.log('undefined', Boolean(undefined)); // false
console.log('null', Boolean(null)); // false
console.log('0', Boolean(0)); // false
console.log('NaN', Boolean(NaN)); // false
console.log('', Boolean('')); // false
4. 隐式转换的情况
- 四则运算
+ - * / - 判断语句
- navive调用
5.运算逻辑
- 运算子之中存在对象(或者准确地说,存在非原始类型的值),
- 则先调用该对象的valueOf方法。如果返回结果为原始类型的值,
- 则运用上面两条规则;否则继续调用该对象的toString方法,
- 对其返回值运用上面两条规则
[] + [] // ""
[] + {} // "[object Object]"
{} + [] // 0 (把 {} 作为代码块,然后 []调用number 规则)
{} + {} // "[object Object][object Object]" (chrome 输出 )
{} + {} // NaN (firefox 输出 )
true + true // 2
typeof
typeof的返回值共有七种:
- number, boolean, string, undefined, object, function,symbol
1、number
typeof(10);
typeof(NaN);
//NaN在JavaScript中代表的是特殊非数字值,它本身是一个数字类型。
typeof(Infinity);
2、boolean
typeof(true);
typeof(false);
3、string
typeof("abc");
4、undefined
typeof(undefined);
typeof(a);//不存在的变量
5、object
对象,数组,null返回object
typeof(null);
typeof([]);
typeof({});
typeof(window);
6、function
typeof(Array);
typeof(Date);
7、symbol
typeof Symbol() // ES6提供的新的类型