JS数据类型

JS中的变量是没有类型的,只有值才有。变量可以随时持有任何类型的值。

七大内置类型

  • 空值( null )
  • 未定义( undefined )
  • 布尔值( boolean )
  • 数字( number )
  • 字符串( string )
  • 对象( object )
  • 符号( symbol ,ES6 中新增)

按照值类型区分

  • 原始类型/基本类型:Undefined、Null、Boolean、String、Number、Symbol(共6种)
  • 引用类型:对象(Object):数组(Array)、函数(Function)

说明:

  • Number、String、Boolean属于基本数据类型
  • Object属于复合数据类型,包括:Function、Array、Date,Error,RegExp
  • Undefined 和 Null 属于特殊数据类型
  • Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值

typeof运算符

  • typeof运算符可以返回一个值的数据类型
  • 两种写法:typeof 42 、typeof(42)
  • 数值、字符串、布尔值分别返回number、string、boolean
  • 函数返回function,是Object的子类型
  • undefined返回undefined
  • 对象返回object
  • null返回object
  • symbol返回symbol
  • Object包括:引用数据类型 object、array、null
  • typeof返回的是一个字符串
  • 两次typeof返回一定是string

typeof返回值范围:

类型 示例 结果
String typeof ‘42’ ‘string’
Number typeof 42 ‘number’
Boolean typeof true ‘boolean’
Undefined typeof undefined ‘undefined’
Object typeof {a: 1} ‘object’
Null typeof null ‘object’
function函数对象 typeof function(){} ‘function’
Symbol typeof Symbol() ‘symbol’
console.log( typeof undefined ); // undefined
console.log( typeof true ); //boolean
console.log( typeof 42 ); // number
console.log( typeof '42' ); // string
console.log( typeof {a: 1} ); // object
console.log( typeof [1, 2, 3] ); // object
console.log( typeof function(){} ); // function
console.log( typeof Symbol() ); // symbol
console.log( typeof null); // object

// 判断特殊空值
var a = null;
console.log(!a && typeof a === 'object'); // true

var a;
// 未定义与未声明
console.log(a); // undefined
console.log(b); // ReferenceError: b is not defined

// 安全机制
console.log(typeof a); // undefined
console.log(typeof b); // undefined

// 两次typeof
console.log(typeof typeof a);  // string

数据类型转换

(1)强制数据类型转换(显示类型转化)
强制转换主要指使用Number()、String()和Boolean()三个函数,手动将各种类型的值,分别转换成数字、字符串或者布尔值。

字符串String() 数字Number() 布尔值Boolean() 对象
undefined “undefined” NaN false
null “null” 0 false
true “true” 1 true
false “false” 0 false
“”(空字符串) “” 0 false
“1.2”(字符数字) “1.2” 1.2 true
“1a”(字符加数字) “1a” NaN true
“one” “one” NaN true
0 “0” 0 false
-0 “0” -0 false
NaN “NaN” NaN false
Infinity “Infinity” Infinity true
-Infinity “-Infinity” -Infinity true
1(非零数字) “1” 1 true
console.log(String(undefined));
console.log(String(null));
console.log(String(true));
console.log(String(false));
console.log(String(""));
console.log(String("1.2"));
console.log(String("1a"));
console.log(String("one"));
console.log(String(0));
console.log(String(-0));
console.log(String(NaN));
console.log(String(Infinity));
console.log(String(-Infinity));
console.log(String(1));

console.log(Number(undefined));
console.log(Number(null));
console.log(Number(true));
console.log(Number(false));
console.log(Number(""));
console.log(Number("1.2"));
console.log(Number("1a"));
console.log(Number("one"));
console.log(Number(0));
console.log(Number(-0));
console.log(Number(NaN));
console.log(Number(Infinity));
console.log(Number(-Infinity));
console.log(Number(1));

console.log(Boolean(undefined));
console.log(Boolean(null));
console.log(Boolean(true));
console.log(Boolean(false));
console.log(Boolean(""));
console.log(Boolean("1.2"));
console.log(Boolean("1a"));
console.log(Boolean("one"));
console.log(Boolean(0));
console.log(Boolean(-0));
console.log(Boolean(NaN));
console.log(Boolean(Infinity));
console.log(Boolean(-Infinity));
console.log(Boolean(1));

console.log(parseInt('abc123')); // NaN
console.log(parseInt('123abc')); // 123
console.log(parseFloat('3.14')); // 3.14
console.log(parseFloat('3.1465926')); // 3.1465926
console.log(parseFloat('3.1465926').toFixed(2)); // 3.15-四舍五入

(2)自动转化(隐式类型转化)
遇到以下三种情况时,JavaScript 会自动转换数据类型,即转换是自动完成的,用户不可见。

  • 不同类型的数据互相运算
  • 对非布尔值类型的数据求布尔值。
  • 对非数值类型的值使用一元运算符(即+和-)
// 数字转化字符
console.log("a" + 1); //a1

// + - :将字符转化为number
console.log(+"123"); // 123
console.log(-"123"); // -123
console.log(+"abc"); // NaN
console.log(-"abc"); // NaN

// * / - % :将字符转化为number
console.log("3" * 2); // 6
console.log("3" / 2); // 1.5
console.log("3" % 2); //1

// > < >= <= ==:将字符转化为number
console.log("1" > 2); // false
console.log("1" < "2"); // true
console.log(1 == "1"); // true

// 两个字符比较,先转ascii,在比较
console.log("a" > "b"); // false

// 不进行隐式转换
console.log(1 === '1'); // false
console.log(NaN == NaN); // false

// 练习
console.log(2 > 1 > 3); // false
console.log(2 > 1 == 1); //true
console.log(undefined > 0); // false
console.log(undefined < 0); // false
console.log(undefined == 0); // false
console.log(null > 0); // false
console.log(null < 0); // false
console.log(null == 0); // false
console.log(undefined == null); // true
console.log(undefined === null); // false

注意:
要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,但要记住 null == undefined 会返回 true。
原因:undefined 表示一个变量自然的、最原始的状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态
所以:ECMAScript 规范认为,既然 null 和 undefined 的行为很相似,并且都表示 一个无效的值,那么它们所表示的内容也具有相似性,即有
undefined == null; //true

isNaN方法
isNaN() 函数用于检查其参数是否是非数字值。
过程:先使用Number(值),然后与NaN对比,求Boolean值,返回true标识非数,false表示数字类型。

console.log(isNaN(NaN)); // true
console.log(isNaN(123)); // false
console.log(isNaN('123')); // false
console.log(isNaN('a')); // true
console.log(isNaN(null)); // false
console.log(isNaN(undefined)); // true