正则 // 两个斜杠中间加点东西就叫正则



验证是不是数字类型
NaN:不是一个有效数字
NaN跟谁比都是false

全局isNaN & Number.isNaN
全局isNaN会对参数做数据类型转换,即不是number会先转换成number




Number和parseInt/parseFloat的区别:
引用类型->字符串->数字,js底层规则,浏览器v8引擎底层
parseInt/parseFloat 浏览器额外提供的方法



引用数据类型:

+加法


只有这5种情况是false,其他都为true
只要不是这5种情况,都为true。
v8引擎底层机制,在实现数据类型转换的时候,机制如此。

Number:
Number(xxx)
parseInt
parseFloat
==
数学运算 + - * /
String:
toString
字符串拼接

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
null:空对象指针
优势:快 简单


使用typeof的场景:

局限性:
不能处理基本数据类型
*基本数据类型也是所属类的实例 类的实例又是对象类型
只要在当前实例原型链上出现过的类,结果都为true。用户可能会手动修改原型链的指向。

检测实例是否隶属于某个类

因为所属类的原型上会天生自带constructor属性,指向该类本身。通过该机制,找到constructor。所以找到到直属类原型上的constructor。

很容易被修改,不确定性太高了。
临时用一下,做严谨一点不行
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([]))
