定义
分为两类,原始类型和对象类型
- 原始类型
数字(Number)、字符串(String)、布尔(Boolean)、undefined、null、Symbol - 对象类型
对象是属性的集合,每个属性都由“键值对”组成。普通的js对象是命名值的无序集合(Object),还有特殊的对象——数组、函数- 数组
是带下标的值的有序集合 - 函数
是具有与它相关联的可执行代码的对象(在这里可理解为函数名是键,可执行代码为值),通过调用函数,执行对应代码,返回运算结果
- 数组
判断数据类型
1) typeof
console.log(typeof 5); // "number"
console.log(typeof undefined); // "undefined"
console.log(typeof "luyi"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof Symbol()) // "symbol"
//**************************
console.log(typeof null); // "object"
console.log(typeof {}); // "object"
console.log(typeof (() => {})); // "function"
console.log(typeof new Date()); // "object"
console.log(typeof []); // "object"
- typeof 可以判断除null外的基本类型
- 对于非基本类型只可以判断出function,其余都会当成object返回
2) instanceof
通过对象的原型链找到是不是当前类型的原型,只能判断对象类型
function Person(name) {
this.name = name;
}
const p = new Person('luyi');
console.log(p instanceof Person); // true
模拟实现
const _instanceof=(left,right)=>{
if(typeof left !=='object'){
return false
};
while(true){
if(left==null){
return false;
};
if(right.prototype==left.__proto__){
return true
};
left=left.__proto__;
}
}
3) __proto__.constructor.name
console.log((()=>{}).__proto__.constructor.name)//function
console.log([].__proto__.constructor.name)//array
console.log({}.__proto__.constructor.name)//object
console.log(1.__proto__.constructor.name)//number
console.log(false.__proto__.constructor.name)//boolean
console.log('sadsa'.__proto__.constructor.name)//string
4) Object.prototype.toString
除了对象外其他的tostring都是当前的字符串,所以要通过call或者apply来改变当前的作用域
console.log(Object.prototype.toString.call(1)); // [object Number]
console.log(Object.prototype.toString.call("luyi")); // [object String]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call(true)); // [object Boolean]
console.log(Object.prototype.toString.call({})); // [object Object]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call(function() {})); // [object Function]
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(Symbol('luyi'))); // [object Symbol]
5)ES6的新方法
isNaN----是否不是数值
isArray----是否是数组
类型转换
- 显式类型转换
原始值转换成各自的包装对象比如String()、Number()、Boolean()
对象转换为原始值toString()和valueOf()
[1,2,3].toString() //1,2,3
(function(x){console.log(x)}).toString()//"function(x){console.log(x)}"
var d=new Date(2010,0,1);
d.valueOf()//1262275200000
- 隐式类型转换
Js是弱类型的语言,程序运行时,类型会自动分配
console.log(1 + 1); // 2
console.log(1 + '1'); // '11'
console.log(1 + 'anissa');//1anissa
console.log(1 + undefined); // NaN
console.log(1 + null); // 1
console.log(1 + true); // 2
console.log(1 + false); // 1
console.log(1 + ''); // '1'
- 如果“+”运算符的一个操作数是字符串,那他会把另一个操作符转化为字符串进行拼接
- 如果“+”运算符的一个操作数是number类型,会转换为number(除了和undefined相加是NaN)
- 如果“+”运算符的一个操作数是对象,就调用valueOf() 或 toString()进行
==和===的区别
==
会先数据转换成一样的类型后,对值进行比较
===
先比较数据类型,不一样的直接为false,后再对值进行比较
var a = ?;
if(a == 1 && a == 2 && a == 3){
console.log(1);
}
会先进行隐式转换,转换成string类型
1、a={
i:1,
toString:function(){
return a.i++
}
}
2、a=[1,2,3]
a.toString=a.shift;
a.shift为a数组删掉的第一项的值,同时a数组会被删掉第一项,所以第一次a==1时,a数组变成了[2,3];
JS存储
原始数据类型,保存在栈中(占用空间小、大小固定、频繁使用);
其他Array, Object, Function 都是 引用数据类型(占用空间较大,大小不固定)