以前一直挺鄙視JAVASCRIPT的,現在項目要用到了。還是學習下,由於現在網路發展的越來越快,以後javascript前景應該還是不錯。
1:javascript中沒有多維陣列的概念
var aa = new Array();
aa[0] = 1;
aa["tt"] = [0,1];//javascript在用負數,浮點數,(或布爾型,對象,其他值時),javascript會將它轉換為一個字串,用產生的字串作為對象的屬性名稱字,而不是定義了一個新的數組元素
aa["bb"] = [2,3];
//遍曆數組中的所有屬性,不僅僅遍曆數組元素
for(var i in aa){
document.write(aa[i]);
}
document.write(aa.length);
document.write(aa["tt"].length);
var myArray=new Array();
for(var i=0;i<10;i++){
myArray[i]=new Array();
myArray[i][0]=Math.floor(Math.random()*10);
myArray[i][1]=Math.floor(Math.random()*10);
myArray[i][2]=Math.floor(Math.random()*10);
myArray[i][3]=Math.floor(Math.random()*10);
myArray[i][4]=Math.floor(Math.random()*10);
myArray[i][5]=Math.floor(Math.random()*10);
myArray[i][6]=Math.floor(Math.random()*10);
myArray[i][7]=Math.floor(Math.random()*10);
myArray[i][8]=Math.floor(Math.random()*10);
}
myArray[10.2] = 11;
myArray[9][9] = 22;
myArray.sort(function(x,y){
return(x[0]==y[0])?((x[4]==y[4])?(x[8]-y[8]):(x[4]-y[4])):(x[2]-y[2])
});
var count = 0;
for(var i=0;i<myArray.length;i++)
{
document.write(myArray[i].join(",")+"<br/>");
for(var j = 0; j<myArray[i].length;j++){
document.write(myArray[i][j]+"H"+"</br>");
count++;
}
}
document.write(myArray.length);//
document.write(myArray[0].length);
document.write(count);
2:javascript 具有全範圍的運算子,包括算術、邏輯、位以及賦值運算子。此外還有其他一些運算子。
計算 邏輯 位元運算 賦值 雜項
描述 符號 描述 符號 描述 符號 描述 符號 描述 符號
負值 - 邏輯非 ! 按位取反 ~ 賦值 = 刪除 delete
遞增 ++ 小於 < 按位左移 << 運算賦值 oP= typeof 運算子 typeof
遞減 -- 大於 > 按位右移 >> void 運算子 void
乘法 * 小於等於 <= 無符號右移 >>>
除法 / 大於等於 >= 按位與 &
模數運算 % 等於 == 按位異或 ^
加法 + 不等於 != 按位或 |
減法 - 邏輯與 &&
邏輯或 ||
條件(三元運算子) ?:
逗號 ,
恒等 ===
不恒等 !==
運算子優先極
javascript 中的運算子是按照一個特定的順序來求值的。這個順序就是運算子的優先順序。下表按從最高到最低的優先順序列出了這些運算子。處於同一行中的運算子按從左至右的順序求值。
運算子 描述
. [] () 欄位訪問、數組下標以及函數調用
++ -- - ~ ! typeof new void delete 一元運算子、返回資料類型、對象建立、未定義值
* / % 乘法、除法、模數
+ - + 加法、減法、字串串連
<< >> >>> 移位
< <= > >= 小於、小於等於、大於、大於等於
== != === !== 等於、不等於、恒等、不恒等
& 按位與
^ 按位異或
| 按位或
&& 邏輯與
|| 邏輯或
?: 條件
= oP= 賦值、運算賦值
, 多重求值
圓括弧可用來改變求值順序。圓括弧中的運算式應在其用於語句的其餘部分之前全部被求值。
具有較高優先順序的運算子將在具有較低優先順序的運算子之前被求值。例如:
z = 78 * (96 + 3 + 45)
在該運算式中有五個運算子: =, *, (), +, 以及 +。根據優先順序,它們將按下面的順序求值: (), *, +, +, =。
首先對圓括弧內的運算式求值:其中有兩個加法運算子,它們具有相同的優先順序:96 和 3 相加,然後再將它們的和與 45 相加,得到的結果為 144。
然後是乘法運算: 78 和 144 相乘,得到結果為 11232。
最後是賦值運算:將 11232 賦給 z。
3:JS中大括弧有四種語義作用
語義1,組織複合陳述式,這是最常見的
?
12345678 |
if ( condition ) { //... } else { //... } for () { //... } |
語義2,對象直接量聲明
?
1234 |
var obj = { name : 'jack' , age : 23 }; |
整個是個指派陳述式,其中的{name:'jack',age:23}是個運算式。
語義3,聲明函數或函數直接量
?
1234567 |
function f1(){ //... } var f2 = function (){ //... } |
f1與非f2的區別是前者在文法解釋期,後者在運行期。區別在於:如果調用該函數的代碼在函數定義之後,則沒有區別;如果調用該函數的代碼在函數定義之前,則f1仍然可以調用,f2則會報錯,提示f2未定義。
語義4,結構化異常處理的文法符號
?
1234567 |
try { //... } catch ( ex ){ //... }finally{ //... } |
這裡的大括弧與符合語句(語義1 )是有區別的,大括弧中如果只有一條語句,在if/else/for等中大括弧是可以省略的,但try/catch/finally則不能省略。
以下代碼糾結了偶N久
?
12 |
function (){}() //匿名函數立即執行, 文法分析期報 {}.constructor //擷取對象直接量的構造器,文法分析期報錯 |
令人不解的是為何[].constructor這麼寫卻不報錯呢,一個是想擷取對象直接量的構造器,一個是擷取數組直接量的構造器而已。
當然添加個變數接收也不會報錯
var c = {}.constructor;
同樣的情況如
var fn = function(){}(),也不會報錯。
實際上是js的“語句優先”在作怪,即{}被理解成複合陳述式塊(語義1 )而不是對象直接量(語義2 )或聲明函數(語義3 )的語義。
function(){}(),大括弧被理解成複合陳述式,自然前面的function()聲明函數的文法不完整導致文法分析期出錯。
{}.constructor,大括弧被理解成複合陳述式,大括弧後面是點運算子,點運算子前沒有合理的對象自然也報錯。
修複方式眾所周知:加個強制運算子()
(function(){})(),(function(){});//強制其理解為函數(語義3 ),“函數()”表示執行該函數,即聲明後立即執行了。
({}).constructor //({})強制把大括弧理解成對象直接量(語義2 ),“對象.xx”表示擷取對象的成員,自然後面的點運算子可以正常執行了。
以前均是從別處轉載,隨著使用過程慢慢增加修整。
3:json使用
JSON對象轉換成字串:
var js字串 = JSON.stringify(json對象);
多維的json對象: var a=[{a:123,b:234,c: "123 "},{a:123,b:234,c: "123 "}];
單維的json對象: var a={a:123,b:234,c: "123 "};
javascript json 引用變數
一是在定義json之前定義公開變數,如:
var ac = "a和c的值";
var json = { a: ac, b: "b", c:ac };
二是在定義之後再賦值,如
var json = { a: "a和c的值", b: "b" };
json.c = json.a;
或者
var json = { a: "a和c的值", b: "b" , c:null };
json.c = json.a;
動態增加json變數
var data = {}
for(var i=1;i<4;i++)
data["g"+i] = i;
4:遍曆數組和對象屬性
Javascript 的數組Array有以下幾種建立方法
// 建立數組 Arrayvar computers = new Array();computers[0] = "Dell";computers[1] = "Acer";// 建立condensed arrayvar computers = new Array("Dell", "Acer");// 建立literal arrayvar computers = ["Dell", "Acer"];
遍曆數組可以這樣
// 遍曆數組for (var i = 0; i < computers.length; i++) { alert(computers[i]);}
JavaScript的對象是由一對花括弧{}包起來的。請看下面的例子:
// 建立objectvar computer = { brand: "Acer", price: 100.50, id: 6 };// 也可以這樣建立var computer = new Object();computer.brand = "Acer";computer.price = 100.50;computer.id = 6;// 也可以定義constructorfunction computer(brand, price, id) { this.brand = brand; this.price = price; this.id = id;}var computer1 = new computer("Acer", 100.50, 6);
上面brand為computer的屬性名稱,該屬性的值為Acer。以此類推,computer對象還有price和id兩個屬性。
擷取對象的屬性有兩種方式:
// access propertyvar v1 = computer.brand;var v2 = computer["brand"];
遍曆對象的屬性
// 遍曆object屬性for (var i in computer) { alert(i + ": " + computer[i]);}