首页 文章 精选 留言 我的

精选列表

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

JavaScript对象与其复制清除方法简析

var obj{属性1:属性值1, // 属性名=>key 不能重复属性2:属性值2, // 属性值=>value 是该属性的唯一值 (键值对数据 键=>key 值=>value 有键必有值)} varobj{a:1,b:2,c:3, }console.log(obj.a);//打印对象obj下属性a的value值123456 obj.d=obj.a + obj.b; // 创建并给obj的d属性赋值,不需要var document.write(); console.log(); // 带括号的 => 函数(方法)input.value; // 不带括号 => 属性 obj [“a”]=30; // obj [ key ]=value; 等价于 obj . a =30; (点语法内不能使用变量,不加引号) varnames="a";varv=20;varobj={ [names]:v }12345 属性名就是字符串var obj={a:v}当属性名是变量时,需要[]将变量包含[ ] 内key要求属性名必须是字符型或symbol型,所以必须要有 " "凡是字符,加了"“就是字符类型的字符串,不加”“就是变量名只有在对象中属性名特殊,没有”"的属性名是字符串,有[]的属性名是变量 vara="ab";varb=9; obj[a]=30;//a是一个变量,相当于将"ab"字符串作为obj的属性名obj[b]=20;//如果变量内的值不是字符型,则会隐式转换成字符型作为属性名将变量b中的数字9隐式转换为字符“9”并作为obj的属性名console.log(obj.c);//obj对象内没有c属性,打印结果为undefined varobj={};varo={a:1}; obj[o]=20;varo1={a:3};console.log(obj[o1]);//o和o1是变量,被带入时转换为字符串[objectObject];20 console.log(obj.o1);//o1是字符,obj没有o1的属性;undefinedvarn;varm; obj[n]=10;console.log(obj[m]);//打印结果为1012345678910111213141516171819 因为变量n为undefined,隐式转换成字符“undefined”,obj[n] =>obj[“undefined”] =10obj[m] => obj[“undefined”]对象被强转为字符串会变成 " [ object object ] " 栈、堆栈数据读取写入速度快,但存储内容较少堆读取和写入速度慢,但存储内容多字符型,数值型,布尔型,undefined 都存在栈中对象,函数存在堆中当点击对象前面的箭头时,才去堆中对应的地址取出数据引用地址就是指堆中对象存储的地址 varo={a:1};varo1=o;//将o对象的引用地址赋值给o1 o1.a=10;//因为o1和o是同一个对象,因此修改o1的属性就相当于修改了o的属性 console.log(o);//10varo={a:1};varo1=o; o={b:2};//重新改变新地址,o1与o不指向同一个地址 o.a=20;console.log(o1);//{a:1} console.log(o);//{b:2,a:20}1234567891011 内存泄漏当对象不再使用,但对象的引用列表中并没有清除引用关系时,对象依旧会存在于堆中,占用内存,不会被垃圾回收车回收,造成内存泄漏对象被存储在堆中,如果堆中对象不断增加就会造成卡顿对于处理内存中不需要的数据,我们叫做垃圾回收当设置变量为null,可以将该对象引用列表中这个引用变量清除当垃圾回收车过来的时候发现堆中该对象引用列表是空的时候就会将其清除而栈中数据,一旦该变量不再使用,就会被清理掉 vari={a:1};//变量i内存放着对象{a:1}的地址varj=i;//变量j内也存着对象{a:1}的地址变量i和j都指向对象{a:1}//如果此时,想要给变量j重新赋值,则先需要在对象{a:1}的引用地址中删除j对这个对象的引用,在重新赋值i=null;//取消引用,释放对象占用的内存i=2;//重新赋值varobj={a:1,b:2,c:3,d:4,e:undefined }console.log("e"inobj);//判断e是不是obj的属性名;true1234567891011121314 遍历复制对象 varo={f:10,g:20};for(varpropinobj){ o[prop]=obj[prop]; }console.log(o);12345 js中的对象遍历是根据对象属性添加的先后来遍历,对象遍历是有顺序的 Object.assign()方法复制对象 varo={f:10,g:20};varobj={} o=Object.assign(o,obj);console.log(o);1234 JSON方法复制对象 varstr=JSON.stringify(obj);console.log(str);12 这种固定样式类型的字符串,叫做JSON字符串,JSON类型 varobj={b:2}console.log(obj);//{b:2},展开后a:1100;b:2; varstr=JSON.stringify(obj); console.log(str); obj.a=10; obj.a++; obj.a*=100;vars='{"b":2}';varo=JSON.parse(s);//将JSON字符串转换为对象 console.log(o);//{b:2}1234567891011 浅复制与深复制 varobj={a:1,b:2,c:{d:10,e:20 } }//浅复制 varo1={};for(varpropinobj){ o1[prop]=obj[prop]; }varo1=obj; obj.a=10; obj.c.d=100;console.log(o1,obj);//obj与o1一起改变 //深复制 varo1=JSON.parse(JSON.stringify(obj));//先转化为JSON字符串,然后再转换为对象进行复制 obj.c.d=100;console.log(o1,obj);//改变obj不会影响O1123456789101112131415161718192021 对象清除 varo={a:1}; o.b=10;deleteo.a;//删除属性 console.log(o);{b:10}

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

几种常用的排序算法之JavaScript实现

@[toc] 插入排序 <html> <script> /* 1)算法简介 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 2)算法描述和实现 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中从后向前扫描; 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置; 将新元素插入到该位置后; 重复步骤2~5。 3)算法分析 最佳情况:输入数组按升序排列。T(n) = O(n) 最坏情况:输入数组按降序排列。T(n) = O(n2) 平均情况:T(n) = O(n2) */ function insertionSort(array) { if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') { for (var i = 1; i < array.length; i++) { var key = array[i]; var j = i - 1; while (j >= 0 && array[j] > key) { array[j + 1] = array[j]; j--; } array[j + 1] = key; } return array; } else { return 'array is not an Array!'; } } var a = [1,4,2,5,3]; var result = insertionSort(a); debugger; </script> </html> 二分插入排序 <html> <script> /* 1)算法简介 二分插入(Binary-insert-sort)排序是一种在直接插入排序算法上进行小改动的排序算法。其与直接插入排序算法最大的区别在于查找插入位置时使用的是二分查找的方式,在速度上有一定提升。 2)算法描述和实现 一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: 从第一个元素开始,该元素可以认为已经被排序; 取出下一个元素,在已经排序的元素序列中二分查找到第一个比它大的数的位置; 将新元素插入到该位置后; 重复上述两步。 3)算法分析 最佳情况:T(n) = O(nlogn) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2) */ function binaryInsertionSort(array) { if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') { for (var i = 1; i < array.length; i++) { var key = array[i], left = 0, right = i - 1; while (left <= right) { var middle = parseInt((left + right) / 2); if (key < array[middle]) { right = middle - 1; } else { left = middle + 1; } } for (var j = i - 1; j >= left; j--) { array[j + 1] = array[j]; } array[left] = key; } return array; } else { return 'array is not an Array!'; } } var a = [1,4,2,5,3]; var result = binaryInsertionSort(a); debugger; </script> </html> 选择排序 <html> <script> /* 1)算法简介 选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 2)算法描述和实现 n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下: 初始状态:无序区为R[1..n],有序区为空; 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区; n-1趟结束,数组有序化了。 3)算法分析 最佳情况:T(n) = O(n2) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2) */ function selectionSort(array) { if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') { var len = array.length, temp; for (var i = 0; i < len - 1; i++) { var min = array[i]; for (var j = i + 1; j < len; j++) { if (array[j] < min) { temp = min; min = array[j]; array[j] = temp; } } array[i] = min; } return array; } else { return 'array is not an Array!'; } } var a = [1,4,2,5,3]; var result = selectionSort(a); debugger; </script> </html> 选择排序 <html> <script> /* 1)算法简介 选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 2)算法描述和实现 n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。具体算法描述如下: 初始状态:无序区为R[1..n],有序区为空; 第i趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区; n-1趟结束,数组有序化了。 3)算法分析 最佳情况:T(n) = O(n2) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2) */ function selectionSort(array) { if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') { var len = array.length, temp; for (var i = 0; i < len - 1; i++) { var min = array[i]; for (var j = i + 1; j < len; j++) { if (array[j] < min) { temp = min; min = array[j]; array[j] = temp; } } array[i] = min; } return array; } else { return 'array is not an Array!'; } } var a = [1,4,2,5,3]; var result = selectionSort(a); debugger; </script> </html> 冒泡排序 <html> <script> /* 1)算法简介 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 2)具体算法描述如下: 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~3,直到排序完成。 3)算法分析 最佳情况:T(n) = O(n) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(n2) */ function bubbleSort(array) { if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') { var len = array.length, temp; for (var i = 0; i < len - 1; i++) { for (var j = len - 1; j >= i; j--) { if (array[j] < array[j - 1]) { temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } } } return array; } else { return 'array is not an Array!'; } } var a = [1,4,2,5,3]; var result = bubbleSort(a); debugger; </script> </html> 快速排序 <html> <script> /* 1)算法简介 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 2)算法描述和实现 快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下: 从数列中挑出一个元素,称为 "基准"(pivot); 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 3)算法分析 最佳情况:T(n) = O(nlogn) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(nlogn) */ function quickSort(array, left, right) { if (Object.prototype.toString.call(array).slice(8, -1) === 'Array' && typeof left === 'number' && typeof right === 'number') { if (left < right) { var x = array[right], i = left - 1, temp; for (var j = left; j <= right; j++) { if (array[j] <= x) { i++; temp = array[i]; array[i] = array[j]; array[j] = temp; } } quickSort(array, left, i - 1); quickSort(array, i + 1, right); }; } else { return 'array is not an Array or left or right is not a number!'; } } var a = [1,4,2,3,5,2,1]; quickSort(a, 0, a.length - 1); debugger; </script> </html> 堆排序 <html> <script> /* 1)算法简介 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 2)算法描述和实现 具体算法描述如下: 将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无序区; 将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n]; 由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。 3)算法分析 最佳情况:T(n) = O(nlogn) 最差情况:T(n) = O(nlogn) 平均情况:T(n) = O(nlogn) */ /*方法说明:堆排序 @param array 待排序数组*/ function heapSort(array) { if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') { //建堆 var heapSize = array.length, temp; for (var i = Math.floor(heapSize / 2); i >= 0; i--) { heapify(array, i, heapSize); } //堆排序 for (var j = heapSize - 1; j >= 1; j--) { temp = array[0]; array[0] = array[j]; array[j] = temp; heapify(array, 0, --heapSize); } } else { return 'array is not an Array!'; } } /*方法说明:维护堆的性质 @param arr 数组 @param x 数组下标 @param len 堆大小*/ function heapify(arr, x, len) { if (Object.prototype.toString.call(arr).slice(8, -1) === 'Array' && typeof x === 'number') { var l = 2 * x, r = 2 * x + 1, largest = x, temp; console.log("x: " + x + " l: " + l + " r: " + r + " largest: " + largest); console.log(" arr[l]: " + arr[l] + " arr[largest]: " + arr[largest]); if (l < len && arr[l] > arr[largest]) { console.log(" left child > largest, plan to swap!"); largest = l; } if (r < len && arr[r] > arr[largest]) { console.log(" right child > largest, plan to swap!"); largest = r; } if (largest != x) { temp = arr[x]; arr[x] = arr[largest]; arr[largest] = temp; heapify(arr, largest, len); } } else { return 'arr is not an Array or x is not a number!'; } } var a = [1,0,3]; // var a = [1,4,2,3] var result = heapSort(a); debugger; </script> </html> 归并排序 <html> <script> /* 1)算法简介 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序是一种稳定的排序方法。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。 2)算法描述和实现 具体算法描述如下: 把长度为n的输入序列分成两个长度为n/2的子序列; 对这两个子序列分别采用归并排序; 将两个排序好的子序列合并成一个最终的排序序列。 3)算法分析 最佳情况:T(n) = O(n) 最差情况:T(n) = O(nlogn) 平均情况:T(n) = O(nlogn) */ function mergeSort(array, p, r) { if (p < r) { var q = Math.floor((p + r) / 2); mergeSort(array, p, q); mergeSort(array, q + 1, r); merge(array, p, q, r); } } function merge(array, p, q, r) { var n1 = q - p + 1, n2 = r - q, left = [], right = [], m = n = 0; for (var i = 0; i < n1; i++) { left[i] = array[p + i]; } for (var j = 0; j < n2; j++) { right[j] = array[q + 1 + j]; } left[n1] = right[n2] = Number.MAX_VALUE; for (var k = p; k <= r; k++) { if (left[m] <= right[n]) { array[k] = left[m]; m++; } else { array[k] = right[n]; n++; } } } var a = [1,0,3,2,5,3]; var result = mergeSort(a,0,a.length - 1); debugger; </script> </html> 桶排序 <html> <script> /* 1)算法简介 桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。 2)算法描述和实现 具体算法描述如下: 设置一个定量的数组当作空桶; 遍历输入数据,并且把数据一个一个放到对应的桶里去; 对每个不是空的桶进行排序; 从不是空的桶里把排好序的数据拼接起来。 3)算法分析 桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。但相应的空间消耗就会增大。 */ /*方法说明:桶排序 @param array 数组 @param num 桶的数量*/ function bucketSort(array, num) { if (array.length <= 1) { return array; } var len = array.length, buckets = [], result = [], min = max = array[0], regex = '/^[1-9]+[0-9]*$/', space, n = 0; num = num || ((num > 1 && regex.test(num)) ? num : 10); for (var i = 1; i < len; i++) { min = min <= array[i] ? min : array[i]; max = max >= array[i] ? max : array[i]; } space = (max - min + 1) / num; for (var j = 0; j < len; j++) { var index = Math.floor((array[j] - min) / space); if (buckets[index]) { // 非空桶,插入排序 var k = buckets[index].length - 1; while (k >= 0 && buckets[index][k] > array[j]) { buckets[index][k + 1] = buckets[index][k]; k--; } buckets[index][k + 1] = array[j]; } else { //空桶,初始化 buckets[index] = []; buckets[index].push(array[j]); } } while (n < num) { result = result.concat(buckets[n]); n++; } return result; } var a = [0,4,1,3,2,6]; var result = bucketSort(a, a.length-1); debugger; </script> </html> 计数排序 <html> <script> /* 1)算法简介 计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。 2)算法描述和实现 具体算法描述如下: 找出待排序的数组中最大和最小的元素; 统计数组中每个值为i的元素出现的次数,存入数组C的第i项; 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加); 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。 3)算法分析 当输入的元素是n 个0到k之间的整数时,它的运行时间是 O(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。 */ function countingSort(array) { var len = array.length, B = [], C = [], min = max = array[0]; for (var i = 0; i < len; i++) { min = min <= array[i] ? min : array[i]; max = max >= array[i] ? max : array[i]; C[array[i]] = C[array[i]] ? C[array[i]] + 1 : 1; } for (var j = min; j < max; j++) { C[j + 1] = (C[j + 1] || 0) + (C[j] || 0); } for (var k = len - 1; k >=0; k--) { B[C[array[k]] - 1] = array[k]; C[array[k]]--; } return B; } var a = [0,4,1,3,2,6]; var result = countingSort(a); debugger; </script> </html> 本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册