数据类型
JS中的数据类型的分类
分类
正则 // 两个斜杠中间加点东西就叫正则
-
Number数字类型
验证是不是数字类型
-
NaN:不是一个有效数字
-
NaN跟谁比都是false
全局isNaN & Number.isNaN
全局isNaN会对参数做数据类型转换,即不是number会先转换成number
其他类型转数字*
Number和parseInt/parseFloat的区别:
引用类型->字符串->数字,js底层规则,浏览器v8引擎底层
parseInt/parseFloat 浏览器额外提供的方法
-
String字符串类型
其他类型转字符串
引用数据类型:
字符串拼接* +加法
+加法
-
boolean布尔类型
只有这5种情况是false,其他都为true
只要不是这5种情况,都为true。
v8引擎底层机制,在实现数据类型转换的时候,机制如此。
其他类型转boolean*
Number:
Number(xxx)
parseInt
parseFloat
==
数学运算 + - * /
String:
toString
字符串拼接
-
null和undefined的区别
null和undefined都代表没有
null:意料之中;undefined:意料之外
从性能来讲:0比null要消耗一点点内存
undefined表示未定义 未知的
具体比如:
getElementById 返回null
函数默认没有返回值 undefined
null和undefined的区别_曹莓养乐多多的博客-CSDN博客_null和undefined的区别
深入探究:null 和 undefined 究竟有何区别? - 知乎
null 和undefined的区别_@是静静啊的博客-CSDN博客_null和undefined的区别
-
对象数据类型
多组键值对
总结:
每个对象都是有0-多组键值对组成的,每组用逗号分隔,属性名不能重复。
属性名只能是数字或字符串。
操作属性:用点号或中括号。数字只能用中括号。
delete 彻底删除属性
数组特殊对象
索引+天生自带length属性
末尾追加一项
数据类型的区别
数据类型:
函数 Symbol 正则 ……
知其然而知其所以然。
js代码放到浏览器中运行。可以这么理解,浏览器得派一个人一行行执行代码,并且要提供代码执行的环境。饭店:大堂和服务员。
提供的环境就是栈内存。栈内存就是从“内存条”中分出来的。
执行代码:进栈执行
栈内存:
提供代码自上而下执行的环境
存储简单数据类型:变量存储空间和值存储空间
而复杂的数据类型?比如东西很多时,我们会新建一个整体,我们会先放在箱子里,或者先放在仓库。
引用类型和基本数据类型的区别:
基本的存储在栈内存中,引用存储在堆内存中。
因为基本数据类型简单,所以存储在栈内存的值存储空间中;而引用相对来说比较复杂,所以存储在堆内存中。
之后所有的操作都是操作这个值,对引用的操作是操作地址。若两个引用同一个地址,若其中一个改了,其他也都改了。共用同一个堆地址。
课堂练习题
有一个细节点:
赋值:先创变量,再创值,最后再关联
底层机制。
阿里面试题
扩展一下:等号赋值的特点
js中所有的赋值操作,包括面向对象中的原型继承,所有方式都是关联引用模式,而不是走拷贝模式。并不是把值直接拷贝给a,而是走了关联引用模式。
js中的赋值不是拷贝而是关联,而是让它和谁关联。
先创变量,再创值。换句话说,是先处理等号左边,再处理等号右边,等号是让等号左右边关联。这个顺序很重要(这里说的是解析的顺序左到右,然后执行的顺序是右到左,但是依然可以理解为同时赋值)。
JavaScript连续赋值的执行顺序问题_虾泥泥泥泥的博客-CSDN博客_js同时赋值
其他
数据类型检测初识
常用的数据类型分类
基础数据类型:
nulll undefined bool number string Symbol
引用数据类型:
object和function。
object:对象(数组是一种特殊的对象),正则,Math数学函数对象,Date对象
检测数据类型的方法有且仅有4种。
前3种都有自己的缺点,toString是最好的。轻量级检测时用前3种就够了。
typeof
-
返回结果
-
局限性:
-
null会被检测成object
-
无法区分 数组 普通对象 正则等。只要是对象,返回的都是object。
专题汇总:数据类型检测*
js中的数据类型:
基本数据类型:
null undefined boolean String Number Symbol
引用数据类型:
一:Object:
{}普通对象、[]数组、/\d/正则对象、Math数学对象、new Date()、类的实例、类的prototype
二:Function
typeof
null:空对象指针
优势:快 简单
使用typeof的场景:
instanceof
局限性:
-
不能处理基本数据类型
*基本数据类型也是所属类的实例 类的实例又是对象类型
-
只要在当前实例原型链上出现过的类,结果都为true。用户可能会手动修改原型链的指向。
检测实例是否隶属于某个类
constructor
因为所属类的原型上会天生自带constructor属性,指向该类本身。通过该机制,找到constructor。所以找到到直属类原型上的constructor。
很容易被修改,不确定性太高了。
临时用一下,做严谨一点不行
Object.prototype.toString
Object原型上的toString:this,所属类的详情信息
方法很强大
最万能最强大的方法
数据类型检测:
基本数据类型或者function:typeof快
引用数据类型,检测全一点:Object.prototype.toString
instanceof或constructor:临时过来用一下,因为原型容易被改变
专题汇总:封装数据类型检测方法
var _obj={
isNull:'Null',
isUndefined:'Undefined',
isNumber:'Number',
isString:'String',
isBoolean:'Boolean',
isSymbol:'Symbol',
isObject:'Object',
isMath:'Math',
isDate:'Date',
isRegExp:'RegExp',
isWindow:'Window',
isArray:'Array',
isFunction:'Function'
}
var _type={};
var _toString=Object.prototype.toString;
for(var key in _obj){
if(!_obj.hasOwnProperty(key)) break;
var reg=new RegExp(`\\[object ${_obj[key]}\\]`)
function anonymous(reg,val){
return reg.test(_toString.call(val))
}
_type[key]=anonymous.bind(null,reg)
}
console.log(_type);
console.log(_type.isArray([]))