調(diào)試javascript
調(diào)試神器:console.log()
- javascript一般的流程是一行一行運行
- js引擎默認換行為一條語句
- 先聲明,再賦值
- 賦值的標示名稱第一個字母可以是美元符號$ _
- javascript聲明有保留字不能賦值
- 標示符不能有)"-" 中橫線
變量命名規(guī)則
- 第一個字符,可以是任意Unicode字母(包括英文字母和其他語言的字母),以及美元符號($)和下劃線(_)
- 第二個字符及后面的字符,除了Unicode字母、美元符號和下劃線,還可以用數(shù)字0-9
下面這些都是合法的標識符:
arg0
_tmp
$elem
π
下面這些則是不合法的標識符:
1a // 第一個字符不能是數(shù)字
23 // 同上
*** // 標識符不能包含星號
a+b // 標識符不能包含加號
-d // 標識符不能包含減號或連詞線
中文是合法的標識符,可以用作變量名
var 臨時變量 = 1;
JavaScript有一些保留字,不能用作標識符:arguments、break、case、catch、class、const、continue、debugger、default、delete、do、else、enum、eval、export、extends、false、finally、for、function、if、implements、import、in、instanceof、interface、let、new、null、package、private、protected、public、return、static、super、switch、this、throw、true、try、typeof、var、void、while、with、yield。
另外,還有三個詞雖然不是保留字,但是因為具有特別含義,也不應(yīng)該用作標識符:Infinity、NaN、undefined
JavaScript區(qū)塊
JavaScript使用大括號,將多個相關(guān)的語句組合在一起,稱為“區(qū)塊”(block)。
與大多數(shù)編程語言不一樣,JavaScript的區(qū)塊不構(gòu)成單獨的作用域(scope)。也就是說,區(qū)塊中的變量與區(qū)塊外的變量,屬于同一個作用域。
{
var a = 1;
}
a // 1
上面代碼在區(qū)塊內(nèi)部,聲明并賦值了變量a,然后在區(qū)塊外部,變量a依然有效,這說明區(qū)塊不構(gòu)成單獨的作用域,與不使用區(qū)塊的情況沒有任何區(qū)別。所以,單獨使用的區(qū)塊在JavaScript中意義不大,很少出現(xiàn)。區(qū)塊往往用來構(gòu)成其他更復雜的語法結(jié)構(gòu),比如for、if、while、function等。
javascript數(shù)據(jù)類型
概述
JavaScript 語言的每一個值,都屬于某一種數(shù)據(jù)類型。JavaScript 的數(shù)據(jù)類型,共有六種。(ES6 又新增了第七種 Symbol 類型的值)
- 數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)
- 字符串(string):字符組成的文本(比如"Hello World")
- 布爾值(boolean):true(真)和false(假)兩個特定值
- undefined:表示“未定義”或不存在,即由于目前沒有定義,所以此處暫時沒有任何值
- null:表示無值,即此處的值就是“無”的狀態(tài)。
- 對象(object):各種值組成的集合
通常,我們將數(shù)值、字符串、布爾值稱為原始類型(primitive type)的值,即它們是最基本的數(shù)據(jù)類型,不能再細分了。而將對象稱為合成類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。至于undefined和null,一般將它們看成兩個特殊值。
對象又可以分成三個子類型。
- 狹義的對象(object)
- 數(shù)組(array)
- 函數(shù)(function)
typeof運算符
JavaScript有三種方法,可以確定一個值到底是什么類型。
- typeof運算符(判斷函數(shù)是什么類型)
- instanceof運算符
- Object.prototype.toString方法
布爾值
布爾值代表“真”和“假”兩個狀態(tài)。“真”用關(guān)鍵字true表示,“假”用關(guān)鍵字false表示。布爾值只有這兩個值。
下列運算符會返回布爾值:
- 兩元邏輯運算符: && (And),|| (Or)
- 前置邏輯運算符: ! (Not)
- 相等運算符:===, ! ==, ==,! =
- 比較運算符:>,>=,<,<=
運算符
JavaScript中運算符主要用于連接簡單表達式,組成一個復雜的表達式。常見的有算數(shù)表達式、比較表達式、邏輯表達式、賦值表達式等,也有單目運算符,指操作原始表達式。大多數(shù)運算符都由標點符號組成(+、>=、!),也有關(guān)鍵字表示的運算符,如typeof、delete、instanceof等。
一些運算符可以作用于任何數(shù)據(jù)類型(typeof),但大部分操作符希望操作數(shù)是特定的類型,而且大部分操作符會計算出(我們也常說返回)一個特定類型的值(typeof返回的全是string)。在JavaScript中運算符通常會根據(jù)需要對操作數(shù)進行類型轉(zhuǎn)換,乘法操作符希望操作數(shù)是數(shù)字,但是 "3" * "5"也是合法的,JavaScript會自動將其轉(zhuǎn)換為數(shù)字計算,返回Number 15。
有些操作符對不同的數(shù)據(jù)類型有不同的含義,比如 +
- 在兩個操作數(shù)都是數(shù)字的時候,會做加法運算
- 兩個參數(shù)都是字符串或在有一個參數(shù)是字符串的情況下會把另外一個參數(shù)轉(zhuǎn)換為字符串做字符串拼接
- 在參數(shù)有對象的情況下會調(diào)用其valueOf或toString
- 在只有一個字符串參數(shù)的時候會嘗試將其轉(zhuǎn)換為數(shù)字
- 在只有一個數(shù)字參數(shù)的時候返回其正數(shù)值
console.log(2+4);//6
console.log("2"+"4");//"24"
console.log(2+"4");//"24"
console.log(2+new Date());//"2Mon Jan 20 2014 17:15:01 GMT+0800 (China Standard Time)"
console.log(+"4");//4
注意: valueOf優(yōu)先級高于toString
注意: +obj 如果obj內(nèi)是字符串,會強制轉(zhuǎn)化成數(shù)字再返回
運算符類型
算數(shù)運算符
- 加法運算符(Addition):x + y
- 減法運算符(Subtraction): x - y
- 乘法運算符(Multiplication): x * y
- 除法運算符(Division):x / y
- 余數(shù)運算符(Remainder):x % y
- 自增運算符(Increment):++ x 或者 x++
執(zhí)行前置遞增和遞減操作時,變量的值都在語句被求值以前改變的(這種情況被稱為副效應(yīng))
例:
var age = 29;
var anotherAge = --age + 2;
alert(age); //輸出28
alert(anotherAge); //輸出30
由于前置遞增和遞減操作與執(zhí)行語句的優(yōu)先級相等,因此整個語句會從左至有被求值,例:
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2; //等于21
var num4 = num1 + num2; //等于21
后置型
后置遞增遞減語法不變,但區(qū)別是:即遞增遞減操作是在包含它們的語句被求值之后才執(zhí)行的,例:
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; //等于22
var num4 = num1 + num2; //等于21
- 自減運算符(Decrement):--x 或者 x--
- 求負運算符(Negate):-x
- 數(shù)值運算符(Convert to number): +x
賦值運算符
賦值運算符用于給變量賦值,最常見的賦值運算符,當然就是等號,表達式x=y表示將y賦值給x。除此之外,JavaScript還提供其他11個賦值運算符。
x += y // 等同于 x = x + y
x -= y // 等同于 x = x - y
x *= y // 等同于 x = x * y
x /= y // 等同于 x = x / y
x %= y // 等同于 x = x % y
x >>= y // 等同于 x = x >> y
x <<= y // 等同于 x = x << y
x >>>= y // 等同于 x = x >>> y
x &= y // 等同于 x = x & y
x |= y // 等同于 x = x | y
x ^= y // 等同于 x = x ^ y
比較運算符
比較運算符比較兩個值,然后返回一個布爾值,表示是否滿足比較條件。JavaScript提供了8個比較運算符。
== 相等
=== 嚴格相等
!=不相等
!== 嚴格不相等
< 小于
<= 小于或等于
> 大于
>= 大于或等于
布爾運算符
- ! 取反運算符
- && 且運算符
- || 或運算符
- condition? true case : false case 三元條件運算符
位運算符
- 或運算(or):符號為|,表示兩個二進制位中有一個為1,則結(jié)果為1,否則為0。
- 與運算(and):符號為&,表示兩個二進制位都為1,則結(jié)果為1,否則為0。
- 否運算(not):符號為~,表示將一個二進制位變成相反值。
- 異或運算(xor):符號為?,表示兩個二進制位中有且僅有一個為1時,結(jié)果為1,否則為0。
- 左移運算(left shift):符號為<<
- 右移運算(right shift):符號為>>
- 帶符號位的右移運算(zero filled right shift):符號為>>>
其它
小括號
在JavaScript中,圓括號是一種運算符,它有兩種用法:如果把表達式放在圓括號之中,作用是求值;如果跟在函數(shù)的后面,作用是調(diào)用函數(shù)。
把表達式放在圓括號之中,將返回表達式的值。
void
void運算符的作用是執(zhí)行一個表達式,然后返回undefined。
逗號運算符
逗號運算符用于對兩個表達式求值,并返回后一個表達式的值
JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復雜類型?
JavaScript 的數(shù)據(jù)類型,共有六種。(ES6 又新增了第七種 Symbol 類型的值)
- 數(shù)值(number)
- 字符串(string)
- 布爾值(boolean)
true(真)和false(假)兩個特定值 - undefined
- null
- 對象(object)
原始類型值
我們將數(shù)值、字符串、布爾值稱為原始類型(primitive type)的值
復雜類型值
將對象稱為合成類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。至于undefined和null,一般將它們看成兩個特殊值
如何判斷一個變量是否是數(shù)字、字符串、布爾、函數(shù)
JavaScript有三種方法,可以確定一個值到底是什么類型。
- typeof運算符
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
//數(shù)值、字符串、布爾值分別返回number、string、boolean
function f() {}
typeof f
//函數(shù)返回function
typeof undefined
//undefined返回undefined
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
//其他情況都返回object
- instanceof運算符
- Object.prototype.toString方法
== 與===有什么區(qū)別
它們的區(qū)別是相等運算符( == )比較兩個值是否相等,嚴格相等運算符( === )比較它們是否為“同一個值”。如果兩個值不是同一類型,嚴格相等運算符( === )直接返回false,而相等運算符( == )會將它們轉(zhuǎn)化成同一個類型,再用嚴格相等運算符進行比較。
注意:相等運算符隱藏的類型轉(zhuǎn)換,會帶來一些違反直覺的結(jié)果。
'' == '0' // false
0 == '' // true
0 == '0' // true
2 == true // false
2 == false // false
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true
上面這些表達式都很容易出錯,因此不要使用相等運算符( == ),最好只使用嚴格相等運算符( === )。
以下代碼的輸出結(jié)果是?為什么?
console.log(1+1); //2 在兩個操作數(shù)都是數(shù)字的時候,會做加法運算
console.log("2"+"4"); //"24" 兩個參數(shù)都是字符串或在有一個參數(shù)是字符串的情況下會把另外一個參數(shù)轉(zhuǎn)換為字符串做字符串拼接
console.log(2+"4"); //"24" 原因同上
console.log(+"4"); //4 在只有一個字符串參數(shù)的時候會嘗試將其轉(zhuǎn)換為數(shù)字
以下代碼的輸出結(jié)果是?
var a = 1;
a+++a; //等于(a++)+a ; a++ 返回1,自增a等于2,so 1+2 =3
typeof a+2; //'number2' typeof 優(yōu)先級比加法運算符高,其實是(typeof a) + 2。起到了字符串拼接作用
//無輸出結(jié)果