前端那些事系列之基础篇JS数据类型(五)

定义

分为两类,原始类型和对象类型

  • 原始类型
    数字(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 都是 引用数据类型(占用空间较大,大小不固定)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值