javascript
javascript 表达式和运算符 (二)
表達式是一種JS短語,可使JS解釋器用來產生一個值。
一、表達式
表達式分類
1、原始表達式
常量、直接量 (3.14,"test");
關鍵字 (null,this,true);
變量(i,k,j);
都屬于原始表達式。
原始表達式和原始表達式可以復合成復合表達式,比如10*20;
2、初始化表達式
?數組、對象的初始化表達式
比如[1,2] 相當于new Array(1,2);
[1,,,4] 相當于[1,undefined,undefined,4]
{x:1,y:2}相當于 var o=new Object();o.x=1;o.y=2;
3、函數表達式
把函數賦值給一個變量:var fe=function(){};
把函數括起來直接調用:(function(){console.log('hello world');})();
4、屬性訪問表達式
?var o={x:1};
o.x或者o['x']訪問對象的屬性叫屬性訪問表達式
5、調用表達式
?函數名加上括號func()就是調用表達式。
6、對象創建表達式
new Func(1,2);
沒有參數可以把括號直接省略new Object,表示創建一個空對象。
二、運算符
分類,安裝操作數個數分類:
?
按功能分類:
展開介紹特殊運算符。
1、?:條件運算符
var val=true?1:2;???? //val值為1
2、,逗號運算符
很少見。
var val=(1,2,3);??? //val值為3
逗號表達式會從左到右依次計算表達式的值,最后會取最右邊的值。
用逗號隔開表示每個表達式都會被計算,最終整個表達式的結果會取最右邊的。
3、delete運算符【update20170506】
用來刪除對象上的屬性,比如delete obj.x;
從IE9開始有一個Object.defineProperty()方法可以設置一個configurable標簽,并不是對象上的所有屬性都可以被成功delete掉,configurable為true才能正常被delete。
delete運算符不能刪除變量,不能刪除參數,用來刪除對象上configurable為true的屬性
用var 聲明的變量,掛在變量對象上,不能用delete刪除 隱式聲明的變量,相當于是Global對象的屬性,可以用delete 刪除4、in運算符
判斷對象里是否有key
in運算符要求第1個(左邊的)操作數必須是字符串類型或可以轉換為字符串類型的其他類型,而第2個(右邊的)操作數必須是數組或對象。
5、instanceof,typeof運算符
new Object() instanceof Object //true typeof 100 === 'number' //trueinstanceof基于原型鏈判斷對象的類型
typeof返回字符串,用于原始類型或者函數。
6、new運算符
new創建構造器的一個實例。
7、this運算符
this在不同情況有不同值
8、void運算符
void是一元運算符,不管后面操作數是多少都會返回undefined.
9、運算符優先級
下面的表將所有運算符按照優先級的不同從高到低排列。參考MDN。
| 19 | 圓括號 | n/a | ( … ) |
| 18 | 成員訪問 | 從左到右 | … . … |
| 需計算的成員訪問 | 從左到右 | … [ … ] | |
| new (帶參數列表) | n/a | new … ( … ) | |
| 17 | 函數調用 | 從左到右 | … (?…?) |
| new?(無參數列表) | 從右到左 | new … | |
| 16 | 后置遞增(運算符在后) | n/a | … ++ |
| 后置遞減(運算符在后) | n/a | … -- | |
| 15 | 邏輯非 | 從右到左 | ! … |
| 按位非 | 從右到左 | ~ … | |
| 一元加法 | 從右到左 | + … | |
| 一元減法 | 從右到左 | - … | |
| 前置遞增 | 從右到左 | ++ … | |
| 前置遞減 | 從右到左 | -- … | |
| typeof | 從右到左 | typeof … | |
| void | 從右到左 | void … | |
| delete | 從右到左 | delete … | |
| 14 | 乘法 | 從左到右 | … *?… |
| 除法 | 從左到右 | … /?… | |
| 取模 | 從左到右 | … %?… | |
| 13 | 加法 | 從左到右 | … +?… |
| 減法 | 從左到右 | … -?… | |
| 12 | 按位左移 | 從左到右 | … <<?… |
| 按位右移 | 從左到右 | … >>?… | |
| 無符號右移 | 從左到右 | … >>>?… | |
| 11 | 小于 | 從左到右 | … <?… |
| 小于等于 | 從左到右 | … <=?… | |
| 大于 | 從左到右 | … >?… | |
| 大于等于 | 從左到右 | … >=?… | |
| in | 從左到右 | … in?… | |
| instanceof | 從左到右 | … instanceof?… | |
| 10 | 等號 | 從左到右 | … ==?… |
| 非等號 | 從左到右 | … !=?… | |
| 全等號 | 從左到右 | … ===?… | |
| 非全等號 | 從左到右 | … !==?… | |
| 9 | 按位與 | 從左到右 | … &?… |
| 8 | 按位異或 | 從左到右 | … ^?… |
| 7 | 按位或 | 從左到右 | … |?… |
| 6 | 邏輯與 | 從左到右 | … &&?… |
| 5 | 邏輯或 | 從左到右 | … ||?… |
| 4 | 條件運算符 | 從右到左 | … ? … : … |
| 3 | 賦值 | 從右到左 | … =?… |
| … +=?… | |||
| … -=?… | |||
| … *=?… | |||
| … /=?… | |||
| … %=?… | |||
| … <<=?… | |||
| … >>=?… | |||
| … >>>=?… | |||
| … &=?… | |||
| … ^=?… | |||
| … |=?… | |||
| 2 | yield | 從右到左 | yield?… |
| yield* | 從右到左 | yield*?… | |
| 1 | 展開運算符 | n/a | ...?… |
| 0 | 逗號 | 從左到右 | … ,?… |
?
?可以看出!比instanceof優先級高。所以不能寫!arr instanceof Array 要用括號括起來!(arr instanceof Array)。
點(.)運算符優先級》new帶參數》函數調用()。
new Foo.getName(); //相當于new (Foo.getName)() new Foo().getName(); //相當于(new Foo()).getName() new new Foo().getName(); //相當于new ((new (Foo()).getName)()?new Foo().getName();
?中成員訪問點運算符優先級是最高的,因此先執行了.getName(),重點是在進行左側取值的時候,
new Foo()可以理解為兩種運算
- new 帶參數,即new Foo()
- 函數調用先Foo()取值后再new
而new帶參數的優先級高于函數調用,因此先執行了new Foo()得到Foo的實例對象再進行成員訪問.getName。
?
參考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators
?
?本文作者starof,因知識本身在變化,作者也在不斷學習成長,文章內容也不定時更新,為避免誤導讀者,方便追根溯源,請諸位轉載注明出處:http://www.cnblogs.com/starof/p/6370906.html有問題歡迎與我討論,共同進步。
轉載于:https://www.cnblogs.com/starof/p/6370906.html
總結
以上是生活随笔為你收集整理的javascript 表达式和运算符 (二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring框架学习笔记(7)——代理对
- 下一篇: TypeScript和JavaScrip