之前我们说到数据结构,那是针对计算机科学的,适用所有开发语言,今天要说的JS数据类型,当然只针对JavaScript而言,大家不要混淆。
JS数据类型分为两大类:
一、值类型(基本类型)
字符串(String)、
数字(Number)、
布尔(Boolean)、
空(Null)、
未定义(Undefined)、
Symbol
注:Symbol 是 ES6 引入了一种新的原始数据类型,表示独一无二的值。
二、引用数据类型(对象类型):
对象(Object)、
数组(Array)、
函数(Function),
还有两个特殊的对象:
正则(RegExp)和日期(Date)
JavaScript 拥有动态类型
JavaScript 拥有动态类型。这意味着相同的变量可用作不同的类型:
var x; // x 为 undefined
var x = 5; // 现在 x 为数字
var x = "John"; // 现在 x 为字符串
变量的数据类型可以使用 typeof 操作符来查看:
typeof "John" // 返回 string
typeof 3.14 // 返回 number
typeof false // 返回 boolean
typeof null // 返回 object
typeof [1,2,3,4] // 返回 object
typeof {name:'John', age:34} // 返回 object
最后两行可以看出, typeof无法具体区分引用数据类型。
这时可以使用
Object.prototype.toString.call(1); // [object Number]
Object.prototype.toString.call('1'); // [object String]
Object.prototype.toString.call([]); // [object Array]
Object.prototype.toString.call({}); // [object Object]
Object.prototype.toString.call(null) // [object Null]
Object.prototype.toString.call(undefined) // [object Undefined]
String
字符串是存储字符(比如 “Bill Gates”)的变量。
字符串可以是引号中的任意文本。您可以使用单引号或双引号:
var carname = "Volvo XC60";
var carname = 'Volvo XC60';
您可以在字符串中使用引号,只要不匹配包围字符串的引号即可:
var answer = "It's alright";
var answer = "He is called 'Johnny'";
var answer = 'He is called "Johnny"';
Number
JavaScript 只有一种数字类型。数字可以带小数点,也可以不带:
var x1 = 34.00; // 使用小数点来写
var x2 = 34; // 不使用小数点来写
极大或极小的数字可以通过科学(指数)计数法来书写:
var y = 123e5; // 12300000
var z = 123e-5; // 0.00123
Boolean
布尔(逻辑)只能有两个值:true 或 false。
var x = true;
var y = false;
Symbol
JavaScript中的Symbol是一种特殊的数据类型,它是一种原始数据类型,表示独一无二的值。在JavaScript中,每个Symbol值都是唯一的,不会相等。Symbol通常用作对象属性的标识符。使用Symbol可以创建一个唯一的属性名,避免属性名冲突。
对于应用开发者,Symbol 可以有这样的使用场景:你从某第三方代码获得了一个对象,你想在该对象上存储自己的属性,但该第三方代码是不透明的,或者不受你控制,所以你无从得知第三方代码会在该对象上设置什么属性,此时就可以使用 Symbol key 属性,既能确信不会和已有属性冲突,也能确信第三方代码不会意外地修改你设置的属性;
注意:
1、for in / of循环、Object.keys、Object.values无法读取Symbol
2、Symbol只能用[]读取,.不行
3、Symbols 也被排除在外JSON.stringify()输出,这使得它们非常适合存储最终用户不应该看到的纯程序数据。
4、Symbol是基本数据类型!!!!不要加new哦
5、后面括号可以传入一个字符串,只是一个标记,方便我们阅读,没有任何意义,类型转化的时候不可转化为数值
6、没有两个 Symbols 永远相等 。 即使两个 Symbols 具有相同的描述,它们也不相等
可以遍历到symbol的方法:
Object.getOwnPropertySymbols() :返回对象中只包含symbol类型key的数组
Reflect.ownKeys() :返回对象中所有类型key的数组(包含symbol)
// 创建一个Symbol
const symbol = Symbol('number');
console.log(typeof symbol); // 输出:symbol
let obj = {
[symbol]: 110,
name: 'li'
};
console.log(obj[symbol]); // 110
// 遍历对象的Symbol属性名
const symbolKeys = Object.getOwnPropertySymbols(obj);
console.log(symbolKeys); // 输出:Symbol(number)
console.log(symbolKeys[0]); // 输出:Symbol(number)
const allKeys = Reflect.ownKeys(obj);
console.log(allKeys); // 输出 ['name', Symbol(11)]
Array
下面的代码创建名为 cars 的数组:
var cars = new Array();
cars[0] = "Saab";
cars[1] = "Volvo";
cars[2] = "BMW";
或者 (condensed array):
var cars = new Array("Saab","Volvo","BMW");
或者 (literal array):
var cars = ["Saab","Volvo","BMW"];
数组下标是基于零的,所以第一个项目是 [0],第二个是 [1],以此类推。
Object
对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。属性由逗号分隔:
var person = { firstname: "John", lastname: "Doe", id: 5566 };
上面例子中的对象 (person) 有三个属性:firstname、lastname 以及 id。
空格和折行无关紧要。声明可横跨多行
var person={
firstname: "John",
lastname : "Doe",
id: 5566
};
对象属性有两种寻址方式:
let name = person.lastname;
let name = person["lastname"];
Undefined 和 Null
Undefined 这个值表示变量不含有值。
可以通过将变量的值设置为 null 来清空变量。
cars = null;
person = null;
之前我们的例子中有一个 typeof null 返回 object,null是一个对象吗?
可以说null不是一个对象。但是我们通过 typeof 可以发现它输出是一个Object。那这是为什么呢?
Javascript的值实质是由两部分组成,一部分表示类型的标签和实际的数据值构成的。对象的类型标签为0。而null表示空指针,在大多数平台下表示(0x00),即null的标签类型也就变为了0,所以typeof就错误的返回了object。