- 数据类型有两种:原始数据类型(又称基础数据类型、可变数据类型)和复杂数据类型(又称对象、不可变数据类型)。
- 原始数据类型包括:undefined,null,number,string,boolen,Symbol(ES6 新加入的类型)
- 复杂数据类型包括:包括对象
- 其中对象包括:内部对象(Array、String等),宿主对象(window)和自定义对象。
如果是ES5环境的话,可以用Array.isArray()方法。
如果不确定运行环境的话,可以用Object.prototype.toString.call()的方法来确认,如果结果是[object Array]则认为数组。
相同点:
- 这两个数据类型都只有一个值
- 都没有方法
- 都表示“无”
- 转化为布尔类型时,都是false
不同点:
- null是一个关键字,而undefined不是一个关键字。所以,var undefined = 1 ;//这是可以的,虽然这里undefined的值是不会改变的。var null = 1;//这样是报错的。
null的实质是一个空的对象,而undefined是window的一个属性。进行数字类型转换时,null返回0,undefined返回NaN
对象转成原始数据类型时,先调用对象的valueOf方法,如果返回结果不是原始数据类型的值,再调用toString方法。
原始类型之间转换时,
原始类型转原始类型时,直接调用对应的构造函数进行转换
包括下面这个六种:
0、-0、undefined、null、空字符串、NaN
Symbol是ES6中新加的一个原始类型,他的每个值都是唯一的,即使是用两个完全一样的变量构造出来的Symbol也不相等。
原始类型传入Symbol方法时,会进行转换成字符串 再转成Symbol类型值;如果是对象的话,会先调用改对象的toString方法再转成Symbol类型的值。
Symbol是最大的用处是用来消除“魔法字符串”的。
可以利用字符串的join方法,也可以用下面的一题中的方法。
是如果是ES6,可以用Array.from()方法。
如果不确定环境的话,可以用Array.prototype.slice.call()的方法,将类似数组转换为。
function getType(value) {
// 判断数据是 null 的情况
if (value === null) {
return value + "";
}
// 判断数据是引用类型的情况
if (typeof value === "object") {
let valueClass = Object.prototype.toString.call(value),
type = valueClass.split(" ")[1].split("");
type.pop();
return type.join("").toLowerCase();
} else {
// 判断数据是基本数据类型的情况和函数的情况
return typeof value
}
}
let 是 ES6新增的变量类型,用来代替 var 的一些缺陷,跟 var 相比主要有以下区别:
- let 使用块级作用域
- let 约束了变量提升而不是没有变量提升:let声明的变量存在变量提升, 但是由于死区我们无法在声明前访问这个变量。
- let 禁止重复声明变量
- let不会成为全局对象的属性(window.访问不到 var可以 )
const 声明的常量:
以上 let 的规则同样适用于 const,但是跟 let 的区别是 const 声明的变量不能重新赋值,所以 const 声明的变量必须经过初始化。