JavaScript 数据类型与判断方法

JavaScript 数据类型

ECMAScript 规范中,定义了7种数据类型,分为基本数据类型和引用数据类型。
基本数据类型:StringNumberBooleanSymbolUndefinedNull
引用数据类型:ObjectFunctionDateArrayRegExp 等等;(都是对象类型)

基本数据类型

基本数据类型也称为简单类型,由于其占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其存储在栈中,即按值访问。所以修改其中任何一个都不会对另一个有影响。

var a = 1;
var b = a;
a = 2;
console.log(a,b);  // 2,1

引用数据类型

引用数据类型又称为复杂类型,由于其值的大小会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此,其值存储在堆中,而存储在变量处的值是一个指针,指向存储对象的内存处,即按址访问。所以如果赋值之后改变其中任何一个值,对另一个值都有影响。

var obj = {name: 'zhangsan',age: 25};
var obj1 = obj;
obj.name = 'lisi';
console.log(obj,obj1);  // {name: 'lisi',age: 25},{name: 'lisi',age: 25}

数据类型的判断方法

typeof

typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(全小写字母)形式表示,包括以下7中:
numberbooleanstringfunctionundefinedsymbolobject

typeof '';  // string 有效
typeof 1;  // number 有效
typeof Symbol();  // symbol 有效
typeof true;  // boolean 有效
typeof undefined;  // undefined 有效
typeof new Function();  // function 有效
typeof null;  // object 无效
typeof [] ;  // object 无效
typeof new Date();  // object 无效
typeof new RegExp();  // object 无效

对于基本类型,除了 null 以外,均可以返回正确的结果。
对于引用类型,除了 function 以外,一律返回 object 类型。
其中,null 有属于自己的数据类型 Null,引用类型中的数组、日期、正则也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 Object 类型。

instanceof

instanceof 是用来判断 A 是否为 B 的实例,表达式为 A instanceof B,如果 AB 的实例,则返回 true,否则返回 false。特别注意的是,instanceof 检测的是原型,我们用一段代码来模拟其内部执行过程:
在这里插入图片描述
从上述过程中可以看出,当 A 的__proto__ 指向 Bprototype 时,就认为 AB 的实例,我们再来看下面的例子:

[] instanceof Array;  // true
{} instanceof Object;  // true
{} instanceof Object;  // true
function Person(){};
new Person() instanceof Person;  // true
[] instanceof Object;  // true
new Date() instanceof Object;  // true
new Person instanceof Object;  // true

虽然 instanceof 可以判断出 [ ]Array 的实例,但是它也认为 [ ]Object 的实例,让我们来看一下 [ ]ArrayObject 三者之间的关系:
instanceof 能够判断出 [ ].__ proto __指向了 Array.prototype,而Array.prototype.__proto__又指向了 Object.prototype,最终 Object.prototype.__proto__指向了 null,所以 [ ]ArrayObject就在内部形成了一条原型链:
在这里插入图片描述
从原型链可以看出,[ ] 的__proto__直接指向了 Array.prototype,间接指向了 Object.prototype,所以按照 instanceof 的判断规则,[ ] 就是 Object 的实例。依次类推,类似的 new Date()new Person() 也会形成一条原型链,都会指向 Object.prototype。因此,instanceof 只能用来判断两个对象是否属于实例关系,而不能判断一个对象的实例具体属于哪种类型。

instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版本的构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。

var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
xArray = window.frames[0].Array;
var arr =new xArray(1,2,3);  // [1,2,3]
arr instanceof Array;  // false

针对数组的这个问题,ES5 提供了 Array.isArray() 方法。该方法用于确认某个对象本身是否为 Array 类型,而不区分该对象在哪个环境中创建。

constructor

constructor:当一个函数 F 被定义时,JS 引擎会为 F 添加 prototype 原型,然后再在 prototype 上添加一个 constructor 属性,并让其指向F的引用。如下图:
在这里插入图片描述
当执行 var f = new F() 时,F 被当做了构造函数,fF 的实例对象,此时 F 原型上的 constructor 传递到了 f 上,所以 f.constructor == F; // true
在这里插入图片描述
可以看出,F 利用原型对象上的 constructor 引用了本身,当 F 被当做构造函数来创建对象是,原型上的 constructor 就被遗传到了新创建的对象上,从原型链的角度来讲,构造函数 F 就是新对象的类型。这样做的意义就是,让新的对象在诞生之后,就具有可追溯的数据类型。
同样,JavaScript 中的内置对象在内部构建时也是这样做的:
在这里插入图片描述
值得注意的是
1、nullundefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。
2、函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object
在这里插入图片描述
因为 prototype 被重新赋值的是一个 {}{}new Object() 的字面量,因此 new Object() 会将 Object 原型上的 constructor 传递给 {},也就是 Object 本身。
因此为了规范开发,在重写对象原型时一般都需要重新给 constructor 赋值,以保证对象实例的类型不被篡改。

toString

toStringObject 的原型方法,调用该方法,默认返回当前对象的 [[Class]]。这是一个内部属性,其格式是 [object Xxx],其中 Xxx 就是对象的类型。
对于 Object 对象,直接调用 toString() 就能返回 [object Object]。而对于其他对象,则需要通过 call/apply 来调用才能返回正确的类型信息。
在这里插入图片描述

jquery.type()

jquery.type():如果对象是 undefined 或者 null,则返回相应的 ‘undefined’‘null’
如果对象有一个内部的 [[Class]] 和一个浏览器的内置对象的 [[Class]] 相同,返回相应的 [[Class]] 名字。
在这里插入图片描述

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值