Ⅰ 如何實現javascript數組中元素的上下移動
我們交換數組可以實現元素上下移動了,這個效果我們在表格或以前排序演算法中都會用到,下面來看一個JavaScript下實現交換數組元素上下移動例子。
在寫項目的時候,要實現一個數組記錄上下移動的示例。寫起來也沒有沒麻煩,無非是交換數組元素。最終實現代碼如下,比較重要的是那個函數。
合理使用那個方法,可以實現置頂和最底的一些實現。
Ⅱ Javascript中有哪些比較成熟的機器學習演算法框架
應該是沒有的
除了Python以外,沒有哪個語言做這種比較全面的機器學習框架
更不要說js這種主要是前端的語言
Ⅲ 如何提升JavaScript循環的運行速度
提升JavaScript循環的運行速度的方法很簡單的,減少每次循環的時間復雜度. 或者提高CPU的性能.就可以了。
Ⅳ javascript演算法問題
這是一個div隨著滾動條移動的代碼吧,你說的那3行意思如下:
1. var diff = (document.body.scrollTop + y - document.all.AdLayer.style.posTop)*.40
變數diff=(滾動條高度+DIV初始高度-DIV現在的高度)*0.4
2.var y = document.body.scrollTop + y - diff;
變數y=滾動條高度+DIV初始高度-變數diff;
3.eval("document.all." + layerName + ".style.posTop = y");
eval(...)是執行括弧裡面語句。這里就是設定div的新高度。
1,2行就是設置高度的一個演算法而已。沒什麼特殊的意義,這樣的演算法有很多種。(PS:額`難道這就是傳說中的緩沖技術?- -有空研究下)
下面是我寫的一個,可能是你要的功能,你可以對比參考一下,希望對你有用:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<HEAD>
</HEAD>
<style>
.div{
position: absolute;
background-color:red;
width: 50px;
height:325px;
}
</style>
<SCRIPT LANGUAGE="JavaScript">
<!--
var ft; //初始高度
//--初始化高度--
function init(){
ft=parseInt(document.documentElement.scrollTop+(document.documentElement.clientHeight-document.getElementById("Layer").offsetHeight)/2);
document.getElementById("Layer").style.top=ft;
}
var flag=0; //只允許move()執行一次的判斷變數;
var speed=5;//移動速度
var acc=100;//加速度
//--移動--
function move(){
var t=document.getElementById("Layer").style.top;
var top=parseInt(t.substring(0,t.length-2));
var myhigh=parseInt(document.documentElement.scrollTop+(document.documentElement.clientHeight-document.getElementById("Layer").offsetHeight)/2);//
if(top<myhigh-speed){ //用來緩沖
document.getElementById("Layer").style.top=top+speed; //設置新高度
}else if(top>myhigh+speed){
document.getElementById("Layer").style.top=top-speed; //設置新高度
}
setTimeout("move()",10);
}
//--防止多次執行---
function scall(){
if(flag==0){
move();
flag=1;
}
}
window.onscroll=scall;
//-->
</SCRIPT>
<BODY onload="init();">
<TABLE border="1" bordercolor="black" height="1500" width="800">
<TR>
<TD valign="top">
</TD>
</TR>
</TABLE>
<div id="Layer" class="div" style="left:850px"></div>
</BODY>
</HTML>
Ⅳ 如何精確計算JS程序運行時間,進而優化代碼
一、 讓代碼簡潔:一些簡略的表達方式也會產生很好的優化
eg:x=x+1;在不影響功能的情況下可以簡寫為x++;
二、 變數名方法名盡量在不影響語意的情況下簡單。(可以選擇首字母命名)
eg:定義數組的長度可以取名為:ArrLen而不需要取為ArrayLength。
三、 關於JS的循環,循環是一種常用的流程式控制制。
JS提供了三種循環:for(;;)、while()、for(in)。在這三種循環中for(in)的效率最差,因為它需要查詢Hash鍵,因此應盡量少用for(in)循環,for(;;)、while()循環的性能基本持平。當然,推薦使用for循環,如果循環變數遞增或遞減,不要單獨對循環變數賦值,而應該使用嵌套的++或–運算符。
四、 如果需要遍歷數組,應該先緩存數組長度,將數組長度放入局部變數中,避免多次查詢數組長度。
因為我們常常要根據字元串、數組的長度進行循環,而通常這個長度是不變的,比如每次查詢a.length,就要額外進行一個操作,而預先把var len=a.length,則就少了一次查詢。
五、 盡量選用局部變數而不是全局變數。
局部變數的訪問速度要比全局變數的訪問速度更快,因為全局變數其實是window對象的成員,而局部變數是放在函數的棧里的。
六、 盡量少使用eval。
每次使用eval需要消耗大量時間,這時候使用JS所支持的閉包可以實現函數模板。
七、 減少對象查找
因為JavaScript的解釋性,所以a.b.c.d.e,需要進行至少4次查詢操作,先檢查a再檢查a中的b,再檢查b中的c,如此往下。所以如果這樣的表達式重復出現,只要可能,應該盡量少出現這樣的表達式,可以利用局部變數,把它放入一個臨時的地方進行查詢。
八、 字元串連接。
如果是追加字元串,最好使用s+=anotherStr操作,而不是要使用s=s+anotherStr。
如果要連接多個字元串,應該少使用+=,如s+=a;s+=b;s+=c;應該寫成s+=a + b + c;
而如果是收集字元串,比如多次對同一個字元串進行+=操作的話,最好使用一個緩存。怎麼用呢?使用JavaScript數組來收集,最後使用join方法連接起來,如下
var buf = new Array();for(var i = 0; i < 100; i++){ buf.push(i.toString());}var all = buf.join("");
九、 類型轉換
1. 把數字轉換成字元串,應用"" + 1,雖然看起來比較丑一點,但事實上這個效率是最高的,性能上來說:("" +) > String() > .toString() > new String()
盡量使用編譯時就能使用的內部操作要比運行時使用的用戶操作要快。
String()屬於內部函數,所以速度很快,而.toString()要查詢原型中的函數,所以速度遜色一些,new String()用於返回一個精確的副本。
2. 浮點數轉換成整型,這個更容易出錯,很多人喜歡使用parseInt(),其實parseInt()是用於將字元串轉換成數字,而不是浮點數和整型之間的轉換,我們應該使用Math.floor()或者Math.round()。Math是內部對象,所以Math.floor()其實並沒有多少查詢方法和調用的時間,速度是最快的。
3. 對於自定義的對象,如果定義了toString()方法來進行類型轉換的話,推薦顯式調用toString(),因為內部的操作在嘗試所有可能性之後,會嘗試對象的toString()方法嘗試能否轉化為String,所以直接調用這個方法效率會更高
十、 盡量作用JSON格式來創建對象,而不是var obj=new Object()方法。
Ⅵ 什麼是javascript演算法
當然是用 javascript 寫成的演算法,用別的語言寫的比如c就叫c語言演算法。
Ⅶ JavaScript都有些什麼運算符有什麼要特別注意的我是個新手,哪個大牛幫我總結下。
你在其它主流語言中能見到的運算符,95%以上都能在JavaScript中使用。下面來看下幾大類運算符:
1、 算術運算符:+,-,*,/,%
舉例:45 + 44 = 89 89 - 44 = 45 9 * 3 = 27 9 / 3 = 3 86 % 10 = 6
加、減、乘、除、取余是最基本的算術運算符,幾乎所有編程語言都具有這些運算符。在JavaScript語言中加、減、乘、除、取余分別用』+』, 』-』, 』*』, 』/』, 『%』字元來表示。它們接收兩個數值類型作為操作數進行相應的數學運算,並將運算結果返回。
2、 復值運算符:=
舉例:total = num1+num2
賦值運算符是一個『=』符號。當瀏覽器遇到賦值運算符,會先執行運算符右邊的表達式,然後將其賦值給左邊的變數或表達式。初學者特別要注意,這不是判斷相等的運算符,而是賦值運算符。
3、 復合運算符:+=,-=,*=,/=
舉例: value += 5;
「+=」運算符將相加和賦值操作合並在一起,是一個運算符,所以+=符號中間不能有空格。除了有「+=」運算符,JavaScript還提供了-=,*=和/=運算符;分別表示相減並賦值,相乘並賦值,相除並賦值。
4、 比較運算符==,===,!=,!===,>, <, >=, <=
舉例: if(num1==num2) x>y, x<y, x>=y, x<=y
比較運算符比較兩個對象的大小,判斷是不相等,返回布爾類型的值。使用起來簡單方便,但是我們需要注意如下幾點:
注意1,不要混淆「=」和「==」,如
if ( num1 = num2 ) {
//除了num2為0的情況,其它情況都會執行。
}
注意2,「=」、「==」和「===」的區別
一個等號「=」是賦值運算符;兩個等號「==」是相等比較的運算符(字元6和數字6會認為是相等的);三個等號「===」是嚴格的相等比較運算符(字元6和數字6不會認為是相等的,即要內容和數據類型完全一致)。
5、 邏輯運算符:&&,||, !
舉例:if (x === y && m === n ) { … }
邏輯與由兩個』&』組成,中間不能有空格;表示兩個操作數都為true時,結果才為true。
邏輯或由兩個』|』組成,與邏輯與相反,邏輯或只需操作數有一個為true,則結果為true。
邏輯非是一個感嘆號,操作數為true,則結果為false,操作數為false,則結果為true。
6、 一元運算符:++,--
舉例:intValue++; intValue--; ++intValue; --intValue;
自增運算符給變數加1,運算效果和intValue = intValue + 1、intValue += 1一樣。自增運算符「++」是一元運算符,表示它只需要一個操作數。自增運算符又可分為前置自增和後置自增運算,即運算符++即可以放在操作數前邊,也可以放在操作數後面,如前置自增++intValue和後置自增intValue++;
與自增運算符相反,自減運算符給變數減1,運算結果和intValue = intValue - 1、intValue -= 1的一樣。自減運算符也是一元運算符,同樣也有前置自減和後置自減的用法。
一元運算符出現的位置很重要,會影響自增運算的返回值。如前置++在計算後會返回變數增加後的值,而後置++會返回變數未增加前的值。
7、 三元運算符:? :
格式:條件表達式 ? 表達式1 : 表達式2;
三元運算符有疑問號?和冒號:組成。三元運算符的三個操作數如上示例,分別為條件表達式、表達式1和表達式2。當條件表達式為true時,表達式1會被執行;否則,表達式2將會被執行。這個邏輯和if-else語句很相似。
8、 位運算符:~、&、|、^、<<、>>、>>>
舉例:~num, num1 & num2, num1 | num2, num1 ^ num2, -10<<2
位運算符實際就是對二進制進行與或非、左移、右移運行。
上述是從教程網站秒秒學上總結來的運算符各類,我感覺基本的運算符都囊括了,希望對你有幫助。
Ⅷ 如何使用Tween.js各類原生動畫運動緩動演算法
使用緩動功能,您可以加快或放慢動畫的開頭或結尾速度,以獲得更加逼真或更加令人愉悅的效果。該技術用於修改 Flash 計算補間中的屬性關鍵幀之間的屬性值的方式。如果不使用緩動,Flash 在計算這些值時,會使對值的更改在每一幀中都一樣。如果使用緩動,則可以調整對每個值的更改程度,從而實現更自然、更復雜的動畫。緩動是應用於補間屬性值的數學曲線。補間的最終效果是補間和緩動曲線中屬性值范圍組合的結果。例如,在製作汽車經過舞台的動畫時,如果讓汽車從停止開始緩慢加速,然後在舞台的另一端緩慢停止,則動畫會顯得更逼真。如果不使用緩動,汽車將從停止立刻到全速,然後在舞台的另一端立刻停止。如果使用緩動,則可以對汽車應用一個補間動畫,然後使該補間緩慢開始和停止。一個未應用緩動的運動路徑。請注意幀沿路徑的均勻分布。已應用「停止並啟動(中)」緩動的同一運動路徑。請注意路徑末尾附近幀的濃度,產生更逼真的汽車加速和減速。可以在屬性檢查器或動畫編輯器中應用緩動。在屬性檢查器中應用的緩動將影響補間中包括的所有屬性。在動畫編輯器中應用的緩動可以影響補間的單個屬性、一組屬性或所有屬性。緩動可以簡單,也可以復雜。Flash 包含一系列的預設緩動,適用於簡單或復雜的效果。在動畫編輯器中,還可以創建自己的自定義緩動曲線。緩動的常見用法之一是在舞台上編輯運動路徑並啟用浮動關鍵幀以使每段路徑中的運行速度保持一致。然後可以使用緩動在路徑的兩端添加更為逼真的加速或減速。在向屬性曲線應用緩動曲線時,屬性曲線圖形區域中將顯示緩動曲線的可視疊加。通過將屬性曲線和緩動曲線顯示在同一圖形區域中,疊加使得在測試動畫時了解舞台上所顯示的最終補間效果更為方便。因為動畫編輯器中的緩動曲線可以很復雜,所以可以使用它們在舞台上創建復雜的動畫而無需在舞台上創建復雜的運動路徑。除空間屬性 X、Y 和 Z 外,還可以使用緩動曲線創建其他任何屬性的復雜補間。
Ⅸ javaScript 演算法實現
//n+nn+nnn+....
//分解成n*n+n*10*(n-1)+n*100*(n-2)+...
//比如4+44+444+4444
//則分解成4*4+40*3+400*2+4000*1
varn=3;//n的值任意大於等於1的整數
varm=1;
varsum=0;
for(i=n;i>0;i--)
{
sum+=n*i*m;
m=m*10;
}
alert(sum);
Ⅹ web前端javascript能實現什麼演算法或者計算
在Web開發中,JavaScript很重要,演算法也很重要。下面整理了一下一些常見的演算法在JavaScript下的實現,包括二分法、求字元串長度、數組去重、插入排序、選擇排序、希爾排序、快速排序、冒泡法等等。僅僅是為了練手,不保證高效與美觀,或許還有Bug,有時間再完善吧。
1.二分法:
function binary(items,value){
var startIndex=0,
stopIndex=items.length-1,
midlleIndex=(startIndex+stopIndex)>>>1;
while(items[middleIndex]!=value && startIndex
if(items[middleIndex]>value){
stopIndex=middleIndex-1;
}else{
startIndex=middleIndex+1;
}
middleIndex=(startIndex+stopIndex)>>>1;
}
return items[middleIndex]!=value ? false:true;
}
2.十六進制顏色值的隨機生成:
function randomColor(){
var arrHex=["0","2","3","4","5","6","7","8","9","a","b","c","d"],
strHex="#",
index;
for(var i=0;i < 6; i++){
index=Math.round(Math.random()*15);
strHex+=arrHex[index];
}
return strHex;
}
一個求字元串長度的方法:
function GetBytes(str){
var len=str.length,
bytes=len;
for(var i=0;i < len;i++){
if(str.CharCodeAt>255){
bytes++;
}
}
return bytes;
}
3.js實現數組去重:
Array.protype.delRepeat=function(){
var newArray=new Array();
var len=this.length;
for(var i=0;i < len;i++){
for(var j=i+1;j < len;j++)
{
if(this[i]==this[j])
{
++i;
}
}
newArray.push(this[i]);
}
return newArray;
}
4.插入排序。所謂的插入排序,就是將序列中的第一個元素看成一個有序的子序列,然後不段向後比較交換比較交換。
function insertSort(arr){
var key;
for(var j = 1; j < arr.length ; j++){
//排好序的
var i = j - 1;
key = arr[j];
while(i >= 0 && arr[i] > key){
arr[i + 1] = arr[i];
i --;
}
arr[i + 1] = key;
}
return arr;
}
5.選擇排序。其實基本的思想就是從待排序的數組中選擇最小或者最大的,放在起始位置,然後從剩下的數組中選擇最小或者最大的排在這公司數的後面。
function selectionSort(data)
{
var i, j, min, temp , count=data.length;
for(i = 0; i < count - 1; i++) {
/* find the minimum */
min = i;
for (j = i+1; j < count; j++)
{
if (data[j] < data[min])
{ min = j;}
}
/* swap data[i] and data[min] */
temp = data[i];
data[i] = data[min];
data[min] = temp;
}
return data;
}
6.希爾排序,也稱遞減增量排序演算法。其實說到底也是插入排序的變種。
function shellSort(array){
var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1]; //
reverse()在維基上看到這個最優的步長較小數組
var i = 0;
var stepArrLength = stepArr.length;
var len = array.length;
var len2 = parseInt(len/2);
for(;i < stepArrLength; i++){
if(stepArr[i] > len2){
continue;
}
stepSort(stepArr[i]);
}
// 排序一個步長
function stepSort(step){
//console.log(step) 使用的步長統計
var i = 0, j = 0, f, tem, key;
var stepLen = len%step > 0 ? parseInt(len/step) + 1 : len/step;
for(;i < step; i++){// 依次循環列
for(j=1;/*j < stepLen && */step * j + i < len;
j++){//依次循環每列的每行
tem = f = step * j + i;
key = array[f];
while((tem-=step) >= 0){// 依次向上查找
if(array[tem] > key){
array[tem+step] = array[tem];
}else{
break;
}
}
array[tem + step ] = key;
}
}
}
return array;
}
7.快速排序。其實說到底快速排序演算法就系對冒泡排序的一種改進,採用的就是演算法理論中的分治遞歸的思想,說得明白點,它的做法就是:通過一趟排序將待排序的紀錄分割成兩部分,其中一部分的紀錄值比另外一部分的紀錄值要小,就可以繼續分別對這兩部分紀錄進行排序;不段的遞歸實施上面兩個操作,從而實現紀錄值的排序。
function quickSort(arr,l,r){
if(l < r){
var mid=arr[parseInt((l+r)/2)],i=l-1,j=r+1;
while(true){
while(arr[++i] < mid);
while(arr[--j]>mid);
if(i>=j)break;
var temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
quickSort(arr,l,i-1);
quickSort(arr,j+1,r);
}
return arr;
}
8.冒泡法:
function bullSort(array){
var temp;
for(var i=0;i < array.length;i++)
{
for(var j=array.length-1;j > i;j--){
if(array[j] < array[j-1])
{
temp = array[j];
array[j]=array[j-1];
array[j-1]=temp;
}
}
}
return array;
}