js權威指南學習筆記(二)表達式與運算符

来源:https://www.cnblogs.com/tonysmile/archive/2018/08/26/9539228.html
-Advertisement-
Play Games

1、數組初始化表達式 數組直接量中的列表逗號之間的元素可以省略,這時省略的空位會填充undefined。如: 2 2 1 var arr = [1,,,,,6]; 2 console.log(arr[2]); //列印數組中索引為2的值->undefined 2 2 1 var arr = [1,, ...


1、數組初始化表達式

數組直接量中的列表逗號之間的元素可以省略,這時省略的空位會填充undefined。如:
      2 2           1
var arr = [1,,,,,6]; 
2
console.log(arr[2]); //列印數組中索引為2的值->undefined
    數組直接量的元素列表結尾處可以留下單個逗號,這時並不會創建一個新的值為undefined的元素。 2、運算符 (1)、javascript總是嚴格按照從左至右的順序來計算表達式的。 如:
      4 4           1
w = x + y * z; 
2
/*
3
首先計算表達式w,然後計算x,y,z,然後y的值與z的值相乘,再加上x的值,最後賦值給w所指代的變數或屬性。
4
*/
    (2)、所有數字都是浮點型,除法運算的結果也是浮點型。如5/2結果是2.5。 (3)、加號的轉換規則優先考慮字元串的連接。(操作數中含有字元串時),但是 “++”或“--”運算符從不進行字元串的連接操作。 in運算符

用於檢測某個屬性名是否屬於某個對象。

當屬性名所對應的值初始化為undefined時,檢測結果也為true; 當屬性名被delete後,再次檢測,結果為false。
      7 7           1
var point = {    //定義一個對象
2
x: 1,
3
y: 1
4
};
5
console.log("x" in point); //true
6
console.log("z" in point); //false
7
console.log("toString" in point); //true:對象繼承了toString()方法
    instanceof運算符 用於檢測某個對象是否是某個類的實例。所有的對象都是Object的實例。
      4 4           1
var d = new Date(); //通過Date()構造函數實例化一個新的對象
2
console.log(d instanceof Date);    //true
3
console.log(d instanceof Object);     //true
4
console.log(d instanceof Number);    //false
    3、邏輯表達式 (1)、邏輯與(&&) 原理:運算符首先計算左操作數的值,即“&&”左側的表達式。如果計算結果是假值,那麼整個表達式的結果也一定是假值,因此“&&”會返回左操作數的值,而並不會對右操作數進行計算,將左操作數的值作為整個表達式計算的結果。 反過來,左操作數的值為真值時,會計算右操作數的值,不管是真是假,都會返回右操作的值作為整個表達式計算的結果。
      6 6           1
var o = {
2
x: 3
3
};
4
var p = null;
5
console.log(o && o.x);     //o和o.x都為真,返回o.x的值3
6
console.log(p && p.x);    //p為假值,返回p的值null,不去計算p.x
    (2)、邏輯或(||) 原理:運算符首先計算左操作數的值,即“||”左側的表達式。如果計算結果是真值,那麼整個表達式的結果也一定是真值,因此“||”會返回左操作數的值,而並不會對右操作數進行計算,將左操作數的值作為整個表達式計算的結果。 反過來,左操作數的值為假值時,會計算右操作數的值,不管是真是假,都會返回右操作的值作為整個表達式計算的結果。 最常用的方式是從一組備選表達式中選出第一個真值表達式:
      3 3           1
//如果max_width已經定義,直接使用它;否則在preferences對象中查找max_width
2
//如果沒有定義它,則使用一個寫死的常量
3
var max = max_width || preference.max_width || 500;
    (3)、邏輯非(!) 對操作數的布爾值進行求反。 如:x是真值,則!x返回false。
      3 3           1
// 對於p和q取任意值,這兩個等式都永遠成立
2
!(p && q) == !p || !q
3
!(p || q) == !p && !q
    4、賦值表達式 在大多數情況下,表達式 a op= b (op代表一個運算符) 這個表達式和 a = a op b 是等價的。 特例:下麵兩個表達式不等價
      15 15           1
var data = [1, 2, 3, 4];
2




3

for (var i = 0; i < 4; i++) {
4
    //根據表達式從左到右的運算順序,++運演算法則,先計算data[i]的值為1,i再加1
5
    //1*2 = 2,求得第一個值,i++,i為3,再次執行迴圈
6
    console.log(data[i++] *= 2); //2,6
7




8

}
9




10

for (var j = 0; j < data.length; j++) {
11
    //同上,先計算=左邊的值後,j+1變為1,然後計算右邊的表達式值,
12
    //此時j為1,data[j]=2,求得第一個值為4,然後j+1變為2,
13
    //j++,j為3,再次執行迴圈
14
    console.log(data[j++] = data[j++] * 2); //4 NaN
15
}
    5、eval() 只有一個參數。如果傳入的參數不是字元串,它直接返回這個參數。 作用:解析並運行由javascript源碼組成的字元串。 如:
      2 2           1
eval("3+2") // 5
2
eval("var y = 3");     //聲明一個新的局部變數y
    它使用了調用它的變數作用域環境。直接調用eval()時,它總是在調用它的上下文作用域內執行。其他的間接調用則使用全局對象作為其上下文作用域,並且無法讀、寫、定義局部變數和函數。如:
      18 18           1
var geval = eval;    //使用別名調用eval將是全局eval
2
var x = "global",
3
    y = "global";
4




5

function f() {     //函數內執行的是局部的eval
6
    var x = "local";
7
    eval("x += 'change';");     // 直接eval更改局部變數的值
8
    return x;     //返回更改後的局部變數
9
}
10




11

function g() {     //函數內執行的是全局的eval
12
    var y = "local";
13
    geval("y += 'changed';"); //間接調用更改了全局變數的值
14
    return y;    //返回未更改的局部變數
15
}
16




17

console.log(f(), x);     // localchange global
18
console.log(g(), y);    // local globalchanged
    在嚴格模式下,即es5 。代碼段以 “ use strict ”開始,eval執行的代碼段可以查詢或更改局部變數,但不能在局部作用域中定義新的變數或函數。同時,eval被列為保留字,不能用一個別名覆蓋eval()函數,並且變數名、函數名、函數參數或異常捕獲的參數都不能取名為“eval”。 6、delete運算符 delete是一元操作符,它用來刪除對象屬性或數組元素。 如:
      x 8           1
var o = { x : 1, y : 2};     //定義一個對象
2
delete o.x;                    //刪除一個屬性
3
"x" in o                    //false 屬性不存在
4




5

var a = [1,2,3];            //定義一個數組
6
delete a[2];                //刪除索引為2 的數組元素
7
2 in a;                    //false 索引為2的數組元素不存在
8
a.length                   // 3, 數組長度並沒有改變,因為其它值的索引並沒有改變
    但是,一些內置核心和客戶端屬性是不能被刪除的,通過var語句聲明的變數也不能刪除,function語句定義的函數和函數參數也不能刪除。 在es5嚴格模式下,如果刪除的操作數非法,將拋出一個語法錯誤的異常,同時刪除不可配置屬性時會拋出類型錯誤異常。在非嚴格模式下,只是簡單的返回false,並不會報錯。
      9           1
var o = { x:1, y:2};  
2
delete o.x;    //true  
3
typeof o.x;    //undefined 屬性不存在  
4
delete o.x;     //true 不存在屬性  
5
delete o;    //false var聲明不能刪除  
6
  
7
delete 1;    //true 不是左值(屬性)  
8
this.x = 1;    //全局定義一個屬性  
9
delete x;     //true(非嚴格模式下) 嚴格模式下使用 delete this.x