首页 文章 精选 留言 我的

精选列表

搜索[javascript库],共10000篇文章
优秀的个人博客,低调大师

JavaScript Object类的静态方法

ES5 使用指定的原型及属性创建一个新对象 Object.create(prototype)Object.create(prototype,descriptors) 创建或配置指定对象的某个属性 Object.defineProperty(object,name,desc) 创建或配置指定对象的一个或多个属性 Object.defineProperties(object,descriptors) 将指定对象设置为不可改变 (冻结对象) Object.freeze(object) 查询指定对象的指定属性的特性 Object.getOwnPropertyDescriptor(object,name) 返回一个包含指定对象的所有非继承属性名的数组,包括不可枚举属性 Object.getOwnPropertyNames(object) 返回指定对象的原型 Object.getPrototypeOf(object) 检查当前对象是否含有某个非继承的属性 Object.hasOwnProperty(propertyname) 检查当前对象是否能添加新属性 Object.isExtensible(object) 检查当前对象是否已冻结 Object.isFrozen(object) 简单指定对象是否为封闭的 Object.isSealed(object) 返回一个包含指定对象的所有能非继承可枚举属性名的数组 Object.keys(object) 组织向指定对象添加新的属性 Object.preventExtensions(object) 检测某个属性是否在for/in循环中可见(是否可枚举) Object.propertyIsEnumerable(propertyname) 阻止向指定对象添加新的属性或删除现有属性 Object.seal(object) 定义一个对象的字符串表示形式 Object.toString(object) 定义一个对象的本地化的字符串表示形式 Object.toLocaleString(object) 给定对象的原始值 Object.valueOf(object)Object.setPrototypeOf(child, parent)Object.getOwnPropertySymbols(o)Object.entries() ES6新增 Object.assign()Object.is()

优秀的个人博客,低调大师

JavaScript 类数组转化为数组

很多情况下我们需要将类数组的对象(key是以0到n的数字或字符串,具有length属性。例如:Arguments对象)转化为一个数组来进行各种例如forEach的数组操作,在ES5中是利用类数组对象强制调用Array对象的slice方法来进行转换的,在ES6中Array扩展了from方法来进行转换,另外,ES6中的扩展运算符也可将某些类数组对象转化为数组各方法示例如下: 强制调用Array对象的slice方法 console.log(Array.prototype.slice.call({ '0': 'a', '1': 'b', '2': 'c', length: 3 })); //Array(3) [ "a", "b", "c" ] Array.from()方法 console.log(Array.from({ '0':'a', '1':'b', '2':'c', length:3 })); //Array(3) [ "a", "b", "c" ] 扩展运算符... console.log((function (a,b,c) { console.log([...arguments]); }("a","b","c"))); //Array(3) [ "a", "b", "c" ]

优秀的个人博客,低调大师

JavaScript 的Decorator 装饰器介绍

Angular大量使用了JS的装饰器特性,先看 ruanyifeng的介绍 使用babel转换 步骤 : npm install -g babel-cli npm init; npm install --save-dev babel-plugin-transform-decorators-legacy babel --plugins transform-decorators-legacy 1.js > 1.es5.js 例1 @eat class Person { constructor() {} } function eat(target, key, descriptor) { console.log('吃饭'); console.log(target); console.log(key); console.log(descriptor); target.prototype.act = '我要吃饭'; } const jack = new Person(); console.log(jack.act); 转换后 var _class; let Person = eat(_class = class Person { constructor() {} }) || _class; function eat(target, key, descriptor) { console.log('吃饭'); console.log(target); console.log(key); console.log(descriptor); target.prototype.act = '我要吃饭'; } const jack = new Person(); console.log(jack.act); // 吃饭 // [Function: Person] // undefined // undefined // 我要吃饭 例2 function mixins(...list) { return function (target) { Object.assign(target.prototype, ...list); }; } const Foo = { foo() { console.log('foo') } }; @mixins(Foo) class MyClass {} let obj = new MyClass(); obj.foo() // "foo" babel 后 var _dec, _class; function mixins(...list) { return function (target) { Object.assign(target.prototype, ...list); }; } const Foo = { foo() { console.log('foo'); } }; let MyClass = (_dec = mixins(Foo), _dec(_class = class MyClass {}) || _class); let obj = new MyClass(); obj.foo(); // "foo"

优秀的个人博客,低调大师

JavaScript 基础排序的实现(二)

继上一篇O(n^2)的排序算法后,这一篇主要记录O(n*logn)的排序算法 1.快排(快速排序) 这一算法的核心思想为,先随机选一个数作为标兵或者说是标记(这个数一般来说选择该无序数组的中间那个元素;此处笔者选取第一个实现算法,当选取完毕后以此标兵为参照将比这个数大的放到他的右边,比他小的放到左边.这样一趟排序过后就能让这个标记左边的数比他小,右边的数都比他大.下一趟排序则分别选取他的左半边数组和右半边数组重复之前的操作(此操作一般由递归实现)当传入的区间只有一个元素的时候那么开始返回不再继续调用函数自身(即为递归的终止条件)因为只有一个数字是必定有序的 递归实现代码如下: //快速排序(递归) function QuickSort(arr,start = 0,end = arr.length-1){ if(start<end){//递归结束条件 let [key,l,r] = [parseInt((start+end)/2),start,end];//key为标记的值,l和r 分别表示左边的下标和右边的下标 while(l<r){//当左右下标相遇即完成一趟排序,停止循环 while(l<r && arr[r] >= key){//从后往前找,如果对应下标的数比标记大则不做操作,下标继续前移 r--; }//循环完成此时arr[r] //而arr[l]的的值已经被key保存所以下一步则应该找出一个比key大却在key的左边的数放入arr[r]的位置 while(l<r && arr[l] <= key){ l++; } [arr[r],arr[l]] = [arr[l],arr[r]]; //这样一次循环就可以让一个在key左边比key大的数放到key的右边,比key小的放到左边 } QuickSort(arr,start,l-1);//递归调用 -1 是为了避免区间重复 QuickSort(arr,l+1,end); } } 下图为将十万倒序数组变为正序的耗费时间: 下面列出非递归版本的快排: function QuickSort2(arr,start = 0,end = arr.length-1){ let mid = [start,end];//建立一个数组用于存放需要快排的区间的参数,这样循环调用即可 if(start<end){ while(mid.length){//当参数数组中没有参数则停止循环 let [l,r] = [mid.shift(),mid.shift()];//取出数组中最前面的两个数,并对此区间上的数进行快排 let [low,height] = [l,r]; let key = arr[parseInt((l+r)/2)];//选取标兵 while(l<r){ while(l<r && arr[r] >= key){ r--; } arr[l] = arr[r]; while(l<r && arr[l] <= key){ l++; } arr[r] = arr[l]; arr[l] = key; } //当两个参数不相等,即该区间不止一个数时,则将下一个区间的参数存入参数数组 if(low<l) mid.push(low,l); if(l+1<height) mid.push(l+1,height); } } } 对十万逆序数组排序耗时如下: 由于非递归版本数组方法调用较多,故此花费时间略久于递归版本 2.希尔排序 希尔排序和快排一样都是不稳定排序,快速排序的不稳定是因为,标兵的选取并不能直接选取到刚好是区间中中间大小的数,所以当每个区间的第一个数刚好都是该区间最小的数,那么达到快排的最坏情况(以区间的第一个数为标兵为例).而希尔排序其核心是插入排序所以当数组刚好为逆序时其效率最低,此时也就是希尔排序的最坏情况但与快排不同的是最坏情况的希尔排序速率并不会下降明显. 希尔排序算法的和心在于,利用了当待排序数组基本有序的时候插入排序效率极高的原理,即选取不同的步长对其进行插排,当步长为一时则与普通的插排没有区别,而效率的提升在于经过前期数次的插排使数组基本有序 其代码如下: function ShellSort(arr) { let steep = parseInt(arr.length / 2);//计算步长 let length = arr.length; let tarr = [];//用于存放按步长分出的数组的临时数组 while (steep) { //只有步长大于1才分组 否则直接插排 if ( steep > 1) { for (let i = 0; i < steep; i++) { //此循环将数组分组 for (let j = i; j < length; j = j + steep) { tarr.push(arr[j]); } InsertionSort(tarr);//将分好组的数组进行插排 for (let j = i; j < length; j = j + steep) { arr[j] = tarr.shift(); } //排好序的数组映射回原数组 tarr.length = 0;//清空临时数组 } }else InsertionSort(arr); steep = parseInt(steep / 2); } } 普通插排耗时如下: 希尔排序耗时如下: 3.归并排序 与快排和希尔排序不同的是归并排序是稳定排序 其核心思想在于当数组只有一个数时肯定是有序的,所以现将数组拆分为一个一个的数,然后在合并的过程中对齐排序,其弊端在于需要占用一个与原数组等长的临时数组空间来存放变量 递归版代码如下: //归并排序(递归) function Merge(arr,start,mid,end,temp) {//此函数用于合并数组 let [l,r] = [start,mid+1];//l标示左边需合并数组的初始下标,r同理标示右边数组的初始下标 while(l<=mid && r <= end){ if(arr[l]<=arr[r]) temp.push(arr[l++]); else temp.push(arr[r++]); } while(l<=mid){ temp.push(arr[l++]); } while(r<=end){ temp.push(arr[r++]); } while(start<=end){//将排好的临时数组中的数据复制回原数组 arr[start++] = temp.shift(); } } function RecursiveSort(arr,start = 0,end = arr.length-1,temp = []){ if(start < end){ let mid = parseInt((start+end)/2);//将数组分为两半 RecursiveSort(arr,start,mid,temp); RecursiveSort(arr,mid+1,end,temp); Merge(arr,start,mid,end,temp);//递归的回调途中进行数组的合并 } } 递归版耗时: 非递归代码: function RecursiveSort2(arr,start = 0,end = arr.length-1){ let mid = [start,end]; let pra = []; while(mid.length){//获取参数列表 let [l,r] = [mid.shift(),mid.shift()]; pra.push(l,r); let m = parseInt((l+r)/2); if(m>l) mid.push(l,m); if(r>m+1) mid.push(m+1,r); } while(pra.length){ let [r,l] = [pra.pop(),pra.pop()]; let m = parseInt((l+r)/2); Merge(arr,l,m,r,[]); //此函数见上文 } } 非递归耗时如下: 总结: 快排在数据量大时的优势较为明显,希尔排序适用于中量数据,而当空间要求不限时归并也不失为一种选择

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册