编程语言会有不同的数据类型,这是因为数据是对不同场景的实体的量化抽象,不同实体之间会有区别,另外,不同类型的数据的应用场景和操作也是不一样的。
例如提示的话术就应该用字符串类型,可以拼接你好,我是${name}
。而例如游戏得分应该用数值类型,可以进行加减等运算。
ECMSScript有5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number、String。还有一种复杂的数据类型——Object。
—— 《JavaScript高级程序设计》
根据《JavaScript高级程序设计》中说明,JavaScript有6种数据类型,Undefined、Null、Boolean、Number、String、Object。但实际上typeof null
的值是"object"
,另外typeof function() {}
的值是"function"
。因此我们认为null并不是一个独立的类型,null是object类型是一个值,而function也是一个独立的类型。
**js数据类型有6种:
undefined类型的值只有一个,就是undefined。
数值类型有两个特殊的值,NaN(not a number)和Infinity(无穷大)
object类型又可以分为
其中number、string、boolean、undefined是值类型,function和object是引用类型。
值类型和引用类型的区别是,值类型赋的变量直接存储数据,引用类型的变量存储数据的引用。
let a = 1;
let b = a;
b = 2;
console.log(a, b); // 1, 2
let c = {attr: 'yes'};
let d = c;
d.attr = 'no';
console.log(c.attr, d.attr); // no no
function test(arg) {
arg = 2;
}
let a = 1;
// 相当于将a的值赋给test中的参数变量,参数改变并不会影响到a
test(a);
console.log(a); // 1
function update(arg) {
arg.attr = 2;
}
let b = {attr: 1};
// 将b的引用赋给update的参数变量,参数变量改变引用指向的数据,也会影响到b
update(b);
console.log(b.attr); // 2
基础类型的数据在使用时候,js引擎会先将之包装为对象,语句执行完对象被销毁。这个过程也被称为“装箱拆箱”。例如
const arr = '1,2,3'.split(',');
字符串先包装为String对象,然后对象执行相应方法,语句执行完后,包装对象就被销毁。
再如(1).toString()将返回数据类型的包装对象转换成的字符串。
注意:1.toString()会将"."解析为小数点,因此会报语法错误
包装类型机制扩展了基本数据类型的能力,方便了日常开发。
因为基础类型也有包装类型转为对象,因此除了Symbol都有构造函数。
"1".constructor // 返回函数 String() { [native code] }
(1).constructor // 返回函数 Number() { [native code] }
false.constructor // 返回函数 Boolean() { [native code] }
[1,2,3].constructor // 返回函数 Array() { [native code] }
{}.constructor // 返回函数 Object() { [native code] }
new Date().constructor // 返回函数 Date() { [native code] }
function () {}.constructor // 返回函数 Function(){ [native code] }
本身都表示“没有”,但null表示引用类型的对象为空,undefined则表示变量未定义。
在相等判断时候,null和undefined是相等的。
但null和undefined在很多方面有区别。
null表示对象空指针,undefined表示变量未定义。
typeof nul