数据类型
数据类型有原始值和引用值两种
- 原始值 string number null undefined symbol boolean
- 引用值 object
数据存放,原始值放在栈中,不能进行修改,是传值。引用值是放在堆中,是传址。
var a = 123;var b = 123;a===b; // truevar a = [1,2,3];var b = [1,2,3];a===b; // falsevar c = a;c === a; // truea = [1,2,3];c === a; // false复制代码
typeof 类型
两种写法:
- typeof ();
- typeof➕空格➕参数
- typeof的返回值都是string类型
- typeof 后的数据类型有object number string function boolean
typeof [1,2]// objecttypeof 123 // numbertypeof null// object (早期null作为对象的占位符,历史遗留问题)typeof undefined // undefinedtypeof '123'// stringtypeof function(){} // functiontypeof true // boolean复制代码
未定义一个变量a会报not a defined ,但是typeof 一个未定义的变量不会报错,会返回undefined
a是一个未声明的变量typeof a // undefinedtypeof(typeof a)// string 复制代码
原始数据类型显式转换之Number();
- 语法: Number(a);
- 此方法会把所有的原始数据类型中看着像是数的值变成number类型,NaN也是属于number类型
Number(123) // 123;Number(null) // 0;Number(undefined) // NaN;Number('123') // 123;Number([1,2]) // NaNNumber(true) // 1Number('123ass')// NaN复制代码
原始数据类型显式转换之parsetInt();
- 语法: parseInt(a);
- 此方法是将其他数据类型的转换成number数据类型的整型,也就是有理数
- 不管是什么类型的数据,必须从数字开始,否则一律返回NaN.截止到非数字位(砍断原则)
parsetInt(123.78) // 123parseInt('123aaa')// 123parseInt("aaa")// NaNparseInt(null)// NaNparseInt('1a')// 1parseInt('a1a')//NaNparseInt(undefined)//NaNparseInt(true)// NaN复制代码
==未解决问题==:
parseInt([1,2])// 1parseInt({1:'damao'})//NaN复制代码
- 用法二:将目标进制的数转换为十进制的数
var a = 101010;parseInt(a,2);第二位参数是目标进制复制代码
原始数据类型显式转换之parseFloat()
- 语法: parseFloat();
- 用法:必须以数字开头,第一个小数点不中断,当遇到非数字的时候中断;
parseFloat(123.3456)// 123.3456parseFloat(null)// NaNparseFloat(undefined)//NaNparseFloat(123.aa123)// 123parseFloat(true)// NaNparseFloat([12,23])// 12复制代码
原始数据类型显式转换之String();
- 语法:String(a);
- 用法:
String(123); // '123'String(undefined);// 'undefined'String(null);// 'null' String(NaN); // 'NaN'String(true);// 'true'String([1,2]); // '1,2'复制代码
原始数据类型显式转换之Boolean();
- 语法:Boolean();
- 用法:除去 null undefined 空串 0 false NaN 这六种之外,其余的都为true
==显式转换方法之toString()==;未完成
- 语法:a.toString();
- 用法一:将原始数据类型转变成string类型,但是null和undefined会报错。
- 用法二:将10进制的数转变成目标进制的数据
var a = 15;var b = a.toString(16);console.log(typeof b);复制代码
原始数据类型隐式转换方法之isNaN();
- 隐式转换是不明确的告诉进行转换了,但实际上是进行转换了
- NaN和任何值都不相等,包括它自身 NaN === NaN // false
- isNaN是判断一个数是否是NaN的方法,它的原理是先利用Number()转换为number类型,在进行判断。
isNaN([1,3])// false复制代码
原始数据类型隐式转换之 ++ / --
- ++ / -- 在隐式转换中也是先调用Number(),然后对转换成number的类型结果在进行++或者--
var a = '123';a ++ // 124var b = '12a';b++ // NaN复制代码
原始数据类型隐式转换之 * 或者 /
同样也是需要先变成number类型
原始数据类型隐式转换之 正负号
同样也是需要先变成number类型
原始数据类型隐式转换之逻辑运算符 && || !
- 返回值是true或者false
- && 用法:第一个表达式是true,返回第二个表达式。第一个表达式是false,则返回第一个表达式。
- || 用法:第一个表达式是false,返回第二个表达式。第一个表达式是true,返回第一个表达式。
原始数据类型隐式转换之大于小于号 > <
- 返回值是true或者false
- 两边都是字符串的时候比较的是asc码
- NaN比较任何类型的数都是false
- 两边都是boolean,则转换成数字再返回
2>3<1 // true复制代码
特殊的+号
- 规则:当两边有string类型时,都转换成string类型,变成字符串
- 规则2:当两边不是string类型时,变成number类型
- 减号不同的是 - 会转换成number,比如 123 - '12' = 111 {number 类型};
123 + 123 // 246;123 + "123"// '123123'123 + null //123123 + undefined // NaN123 - undefined // 复制代码
零碎的小知识
- null == undefined // true
- JavaScript的最初版本是这样区分的:null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。