数据类型
基本数据类型
- Undefined
- Null
- Boolean
- Number
- String
引用数据类型
- Object(引用数据类型)
- Date
- Array
- Function
- RegExp
特殊数据类型 (ES6 添加的数据类型)
- Symbol
Undefined
在将变量声明但未对其进行初始化时,这个变量的值就是undefined
Null
从逻辑上看,null表示一个空对象指针,这也解释了 typeof null 为Object 的原因
如果变量将来准备保存对象,最好先将变量保存为Null
Boolean
只有两个值true和false,虽然只有两个值但是所有类型的值都有与这两个Boolean等价的值
数据类型 | 转化为true的值 | 转化为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | ""(空字符串) |
Number | 非零数值 | 零和NaN |
Object | 任何对象 | null |
Undefined | 无 | undefined |
Number
- 整数
- 浮点数
- NaN NaN是一个特殊是数值,用来表示一个本来要返回数值的操作数未返回数值的情况(代表计算出错了,但未抛出异常以NaN显示)特点:
任何涉及NaN的操作都会返回NaN,这个特点可能会有较多的影响
NaN与任何值都不相等
isNaN()函数
- 接受一个参数,判断这个参数是否‘不是数值’
- isNaN在接受一个数值后,会先对这个数值进行类型转换,任何不能转换为数值的参事都会导致这个函数返回true
console.log(isNaN(NaN)) //trueconsole.log(isNaN(10)) //falseconsole.log(isNaN('10')) //falseconsole.log(isNaN('string')) //trueconsole.log(isNaN(true)) //false复制代码数值转换
- Number()
将任何数据转换为数值
- parseInt()
将字符串转换为整数值
- parseFloat()
将字符串转换为浮点数值,只转换十进制的数值
Number(true) // 1Number(false) // 0Number(null) // 0Number(undefined) // NaNNumber('') // 0Number('123') // 123复制代码
Number()函数在转换字符串的时候存在不合理情况,所以在实际开发中用到的基本是parseInt()函数
String
- 字符串不可改变,也就是说字符串一旦创建就不可改变,要改变这个字符串就要先销毁原来的字符串,然后用一个新的字符串填充该变量
- 字符串转换方法toString(),但是null和undefined类型没有这个方法
- 转型函数String(),
String(null) // 'null'String(undefined) // 'undefined'复制代码
Object类存在较多内容,后面会单独抽出一章来写,敬请期待
类型检测
- typeof
- instanceof
- Object.prototype.toString
typeof
typeof 是确定一个变量是String、Boolean、Number和Undefined的最佳工具
typeof('1') // 'string'typeof(1) // 'number'typeof(true) // 'boolean'typeof(undefined) // 'undefined'typeof(null) // 'object'typeof(function(){}) // 'function'typeof(new Object()) // 'object'typeof([]) // 'object'复制代码
typeof 只能检测出基本数据类型,引用数据类型检测不出来。 typeof(null) == 'object' 可以理解为null是一个未被赋值的空对象,所以返回object(实际上这个是js的一个bug,)
instanceof
function Foo(){ ....}var f = new Foo();f instanceof Foo // true复制代码
instanceof操作符左边是一个对象,右边是一个函数,instanceof所做的事情是,在f的整条原型链【prototype】中是否有指向Foo.prototype的对象
instanceof函数的简单实现
! function Foo(){ console.log('333333333')}var f = new Foo();// f instanceof Foo function my_instanceof(leftObject, rightFunction){ let leftObjectPrototype = leftObject.__proto__ while(true){ if(leftObjectPrototype === rightFunction.prototype){ return true } if(leftObjectPrototype === null){ return true } leftObjectPrototype = leftObjectPrototype.__proto__ }}console.log(my_instanceof(f, Foo)) 复制代码
原型链的关系图(后期会单开一章专门写原型链)
Object.prototype.toString
es5规范说明js对象中存在[[class]]内部属性,可以表示类型属性且在类型创建时已经规定好且不能改变的,Object.prototype.toString要做的就是拿到这个属性值
Object.prototype.toString.call(null) //'[object Null]' Object.prototype.toString.call(undefined) //'[object Undefined]'Object.prototype.toString.call(1) //'[object Number]'Object.prototype.toString.call(function(){}) //'[object Function]'Object.prototype.toString.call() //'[object Object]'Object.prototype.toString.call('abc') //'[object String]'Object.prototype.toString.call(true) //'[object Boolean]' Object.prototype.toString.call([]) //'[object Array]'复制代码
前端新手,从头梳理一下js的基础知识,文章中如果有不对的地方请各位大佬不吝赐教,也可以在我的上看,欢迎大家start哦!大家的鼓励是不断学习进步的动力,谢谢大家!!!