前端JS数据类型、Symbol、判断数据类型的方法

1、JS中null和undefined的区别
null和undefined在if语句中都会被转成false,且null==undefined的返回值是true。其实这是一个历史遗留问题,JS最初被设计时只有null用来表示无。但是大家使用typeof可以发现null其实是一个 对象,相当于没有对象。JS的设计者觉得表示‘无’的最好不要是一个对象;其次JS最初没有错误处理机制,数据类型不匹配时往往自动转换数据类型或者报错,null转化为0则不容易 发现错误,所以又添加了undefined。理解来看两者的区别,null想要表达的像是”没有值”,而undefined想表达的更像是 “缺少值”。当你声明一个变量但没有为其赋值时,这个变量就是undefined,或者一个函数没有返回值,默认返回undefined

2、JS的数据类型
JS的数据类型可以分为原始类型对象类型,而null和undefined通常被认为是各自特殊类型的唯一成员,ES6新增了一种特殊的数据类型Symbol用于对语言进行扩展。原始类型(基本类型)包括Number、Boolean、String、null、undefined、Symbol;而任何不是数值、文本、字符串、符号、null、undefined的都是对象。对象数据类型包括 function、object、array、date、RegExp以及ES6新增的Set和Map等可以可以使用new创建的数据,又叫对象类型

3、Symbol
符号 (Symbol)是ES6新增的一种原始类型,用作非字符串的属性名。Symbol本质上是一种唯一标识符, let id = Symbol(‘描述’) 这样id就变成了一个唯一值,可以把id当做对象的属性名并设置属性值,这样即使别人又在这个对象中定义了一个叫id的属性,也不会覆盖你设置的属性。Symbol()能传入字符串值作为描述,且仅能作为描述,即使是传入相同的描述字符串,得到的值仍然不相等。symbol.for()方法可以注册或者获取symbol

let id = Symbol.for("id"); //获取description为id的symbol  无则创建
let id1 = Symbol.for("id"); //获取description为id的symbol	有则获取
console.log(id == id1); //true
//keyFor()可以获取symbol的description
let  id2 = Symbol.for("name");
console.log(Symbol.keyFor(id2)); // name

Symbol还有一个特点是具有隐藏性,使用Symbol作为属性的key时,for…in遍历不到

4、JS判断数据类型的方法
1、typeof

    var num = 123
    var arr = [1,2,3]
    console.log('测试typeof:',typeof(num));//number
    console.log('typeof验证null:',typeof(null));//object
    console.log('typeof验证数组:',typeof(arr));//object

返回一个表示数据类型的字符串,不能判断null和数组,返回的都是object。null会被视为空指针,当用typeof判断引用数据类型的时候它不能准确地判断出具体是哪一种

2、instanceof

object instanceof constructor

instanceof用来判断constructor.prototype是否存在于object的原型链上。只能判断对象,不是对象就直接返回false。instanceof不能判断null和undefined

    var num = 123//非对象
    var num1 = new Number(123)
    console.log('instanceof判断基本数字:',num instanceof Number);//非对象返回false
    console.log('instanceof判断对象数字:',num1 instanceof Number);//返回true
    console.log(String instanceof String);//返回false 

3、Object.prototype.toString.call()
一般数据类型都能判断,最准确的一种方法。这个方法的原理,其实就是用了Object原型的toString方法,在JS中所有的类都继承自Object,当然所有的类也都继承了Object的toString方法,那为什么不用类本身的toString而是使用Object原型的toString,因为类在继承Object原型的toString方法时改写了这个方法,如下:

    var num = 123
    console.log(Object.prototype.toString.call(num));//[object Number]
    console.log(num.toString());//123

以Number为例可以看到,Object原型的toString方法可以输出数据的类型,而Number类本身的toString方法只是把数据转化成字符串输出。而实际上除了Number,String、Boolean、Function、Array等类也都重写了toString方法,大家可以自己验证一下。而在最后加上call方法,作用是将this指向输入的参数,因为toString是Object类的原型调用的,默认是判断object,也就是说不加call的话,this是指向object的

console.log(Object.prototype.toString());//[object Object]
console.log(Object.prototype.toString.call(num));//[object Number]

4、constructor
与instanceof类似,但是constructor可以判断基本数据类型

    console.log(num.constructor === Number );//true
    console.log(arr.constructor === Array );//true

这个方法就是通过判断构造函数来判断类型,但是不能判断null和undefined,因为这两个没有constructor。但是这个方法也有缺陷,因为constructor可能会被重写,会使判断结果不准确。还有一个缺陷就是constructor在继承时会出错,举个例子,A继承自B,而A的实例a的constructor并不是指向A的,而是指向B

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值