可以做微信推送的网站,太原网络推广价格,网页设计形考作业2,湖北广域建设管理有限公司网站前言
在Javascript通常我们在遍历一个字符串的时候通常使用的方式是
var str abcdefg;
for(let i0;istr.length;i){}但在最近的学习中#xff0c;有人建议我最好应该是下面这样执行。
var str abcdefg;
for(let i0,len str.length;ilen;i)…前言
在Javascript通常我们在遍历一个字符串的时候通常使用的方式是
var str abcdefg;
for(let i0;istr.length;i){}但在最近的学习中有人建议我最好应该是下面这样执行。
var str abcdefg;
for(let i0,len str.length;ilen;i){}我有点疑惑这用一个变量存储字符串的长度不是多此一举吗为什么还建议我使用以下代码呢抱着怀疑的态度我决定进行效率测试。下面是测试代码。
function test1() {let time1 Date.now();for (let i 0; i str.length; i) { }let time2 Date.now();return time2 - time1;
}
function test2() {let time1 Date.now();for (let i 0,len str.length; i len; i) { }let time2 Date.now();return time2 - time1;
}
console.log(test1());
console.log(test2());当测试集长度为10000长度以下基本没有区别但是当长度来到十万级别百万的时候时间消耗确实是有差距的但都是毫秒级差距。但是虽然效率相差不大但是到底是什么原因导致的时间上的差距呢这里就得要先介绍一下JS的基本类了。
JS的原始基本数据类型
字符串String 任何文本信息用单引号 或双引号 包围。数字Number 整数或浮点数包括 Infinity 和 NaN。布尔值Boolean 只有两个值true 和 false。未定义Undefined 表示变量已被声明但没有赋值或被直接初始化为 undefined。Null表示一个特意设置为空的对象引用只有一个值 null。SymbolES6起一种唯一且不可变的数据类型常用于对象的键以避免键名冲突。Bigint (ECMAScript 2020 ES2020):能够安全地存储极大或极小的整数值
原始数据类型也称作基本数据类型或者primitive data types在JavaScript中是不具备自己的方法和属性的。
问题来了字符串String是原始数据类型为什么却拥有.length属性呢而且不只是.length属性字符串类型还拥有贼多的方法。。。相信已经有小伙伴疑惑了这不是自相矛盾吗 但是事实确是两者都是正确的原始数据类型确实是没有属性和方法JS在对原始数据进行属性和方法的相关操作的时候会进行包装下面引出我们真正的猪脚—包装类
包装类
原始值字符串、数字、布尔值和Symbol等在JavaScript中通常不具备属性和方法。然而包装类String、Number、Boolean、Symbol对象的引入让这些基本类型在特定情境下也能穿上“对象”的外衣短暂拥有方法和属性。 相信大家都使用过类型强转类似String(),Number()等这种就是将一个基本类型先将一个基本类型包装成一个对象在返回一个原始数据类型后进行销毁。如下面这行代码
var str 1231213123123;
console.log(str.length);这两行代码JS将会这样执行
临时创建一个String对象该对象包装了原始的字符串值然后通过这个对象获取长度之后这个临时对象会被销毁
难道每次使用方法和属性都要进行对象的创建与销毁吗答案是是的每次使用都要进行创建与销毁。
这下知道为什么在循环中最好先使用一个变量存储字符串的长度,而不是每次循环都直接使用字符串.length属性进行判断了吧。因为每次循环都会进行包装类的创建和销毁虽然在数据集小的情况下效率影响不大但好歹是有点影响不是.
结语
总而言之JavaScript通过对象、包装类以及对未定义属性的处理展现了其设计哲学的深度与广度。它既是一门灵活多变的语言也是开发者手中的利器允许我们在编码的旅途中以最少的约束创造无限可能。理解这些机制不仅能够提升我们的编码技巧更能在深层次上领悟JavaScript的设计美学让我们的代码更加优雅、高效。在这条探索之路上让我们继续前行揭开更多JavaScript的神秘面纱。