ECMAScript作為核心寇漫,它規(guī)定了語言的組成部分:語法刊殉、類型殉摔、語句、關(guān)鍵字记焊、保留字逸月、操作符、全局對象遍膜。
1.語法
ECMAScript 的語法很大程度上借鑒了 C 語言和其他類 C 語言碗硬,如 Java 和 Perl。
1.1區(qū)分大小寫
首先要知道的是瓢颅,ECMAScript 中一切都區(qū)分大小寫恩尾。無論是變量、函數(shù)名還是操作符挽懦。
1.2標識符
所謂標識符翰意,就是變量、函數(shù)信柿、屬性或函數(shù)參數(shù)的名稱冀偶。標識符可以由一或多個下列字符組成:
? 第一個字符必須是一個字母、下劃線(_)或美元符號($)角塑;
? 剩下的其他字符可以是字母蔫磨、下劃線、美元符號或數(shù)字圃伶。
注意第一個字符不能使數(shù)字
按照慣例堤如,ECMAScript 標識符使用駝峰大小寫形式,例如:
myCar, firstBook窒朋。
1.3注釋
//單行注釋
/*
這是多行注釋
*/
2關(guān)鍵字與保留字
關(guān)鍵字=>js已經(jīng)賦予特殊功能的單詞搀罢。
如:
break、else侥猩、new榔至、var、 case欺劳、 finally 唧取、 return、 void 划提、 catch 枫弟、for 、switch 鹏往、 while 淡诗、 continue、 function 、this 韩容、 with 款违、default 、 if 群凶、 throw 插爹、 delete 、 in 座掘、 try 递惋、do 、 instranceof溢陪、 typeof萍虽、let、const
保留字=>>js預訂可能未來要使用的字形真。
abstract 杉编、 enum 、int 咆霜、 short 邓馒、 boolean 、export 蛾坯、interface光酣、 static、 byte 脉课、extends 救军、 long 、 super 倘零、 char 唱遭、 final 、native 呈驶、synchronized 拷泽、 class 、float 袖瞻、 package 司致、throws 、 const 聋迎、goto 脂矫、private 、transient 砌庄、 debugger 羹唠、 implements 、protected 娄昆、 volatile 佩微、 double 、import 萌焰、public
盡量不要用關(guān)鍵字或保留字來做標識符哺眯。采用駝峰以及連字符能比較好的避免意外采用關(guān)鍵字或保留字。
3 變量
有三個關(guān)鍵字可以聲明變量:var扒俯、let奶卓、const。var 在ECMAScript 的所有版本中都可以使用撼玄,而 const 和 let 只能在 ECMAScript 6 及更晚的版本中使用夺姑。
3.1 var關(guān)鍵字
定義變量可以使用var操作符(var也是關(guān)鍵字),可以先聲明再賦值掌猛,也能在聲明的時候同時初始化盏浙。
var myFavorite;//默認undefin
myFavorite = 'book';//先聲明再賦值
var myFavorite = 'book';//聲明的時候同時初始化
隨后,不僅可以改變保存的值荔茬,也可以改變值的類型:
myFavorite = 10;//10,但這么做并不推薦
3.1.1 var聲明的作用域
var聲明的作用域是函數(shù)作用域废膘,使用 var在一個函數(shù)內(nèi)部定義一個變量,就意味著該變量將在函數(shù)退出時被銷毀:
function myTest(){
var a = 10;
console.log(a);//10慕蔚,局部變量
}
console.log(a);//報錯
省略var的話
function myTest(){
a = 10;
console.log(a);//10丐黄,全局變量
}
myTest();
console.log(a);//10
調(diào)用函數(shù)后啊才會在全局被定義。
可以一次性定義多個變量:
var a = 10,
b = 20,
c = 13;
3.1.2var 聲明的提升
使用 var 時孔飒,下面的代碼不會報錯灌闺。這是因為使用這個關(guān)鍵字聲明的變量會自動提升到函數(shù)作用域.
頂部:
function myTest(){
console.log(a);
var a = 10;
}
myTest();//undefined
原因是為 ECMAScript 運行時把它看成等價于如下代碼:
function myTest(){
var a ;
console.log(a);
var a = 10;
}
myTest();//undefined
3.2 let 聲明
let 與var作用差不多都可以可以先聲明再賦值十偶,也能在聲明的時候同時初始化菩鲜。最明顯的區(qū)別是,let 聲明的范圍是塊作用域惦积,而 var 聲明的范圍是函數(shù)作用域接校。
if(true) {
var a = 10;
console.log(a)//10
}
console.log(a);//10
用let的話
if(true) {
let a = 10;
console.log(a)//10
}
console.log(a);//報錯
此外,使用let操作符的話同一個變量名不能重復聲明狮崩。
var age;
var age;
let age;
let age;//SyntaxError,age已經(jīng)用let聲明過了蛛勉。
JavaScript 引擎會記錄用于變量聲明的標識符及其所在的塊作用域,因此嵌套使用相同的標識符不會報錯睦柴,而這是因為同一個塊中沒有重復聲明:
var a = 20;
console.log(a);//20
if(true) {
var a = 10;
console.log(a)//10
}
var name= 'chen';
console.log(name);//chen
if(true) {
var name= 'li';
console.log(name)//'li'
}
對聲明冗余報錯不會因混用 let 和 var 而受影響诽凌。這兩個關(guān)鍵字聲明的并不是不同類型的變量,它們只是指出變量在相關(guān)作用域如何存在坦敌。(函數(shù)侣诵、塊級)
var age;
let age;//報錯
let age;
var age;//報錯
3.2.1暫時性死區(qū)(temporal dead zone)
let 聲明的變量不會在作用域中提升;
console.log(name);//chen
var name = 'chen';
console.log(name);// ReferenceError
let name = 'li';
3.2.2
與var 關(guān)鍵字不同痢法,使用var在全局作用域中聲明的變量會成為windo對象的屬性,let不會:
var name = 'aa';
console.log(window.name);//aa
let name = 'bb';
console.log(window.name)//undefined
3.2.3for循環(huán)中的let
在 let 出現(xiàn)之前杜顺,for 循環(huán)定義的迭代變量會滲透到循環(huán)體外部:
for(var i = 0; i < 5; i++) {
}
console.log(i)//5
使用let就解決了這個問題
for(let i = 0; i < 5; i++) {
}
console.log(i)//ReferenceError:
3.3 const聲明
const與let基本一致财搁,但在聲明的時候必須進行初始化,且不能修改const聲明的變量躬络;
const pig;//報錯
const age = 17;
age = 18;//TypeError,給常量賦值;
也不允許重復聲明
const Test = 'book';
const Test = 'English';//SyntaxError
const聲明的作用域也是塊
if(true) {
const color = 'red';//red
console.log(color)
}
console.log(color)//ReferenceError
const聲明的限制只是對于它指向的變量尖奔;如果聲明的是一個對象,那么這個對象依舊是可修改的穷当。
const o = {};
o.name = 'chen';//'chen'
既然這樣就好理解接下來在for循環(huán)中用const聲明了提茁。
for(const j = 0; j < 10; j++){}//TypeError
這是因為迭代變量會自增。
如果這樣就沒問題了.
let i = 0;
for(const j = 7; i < 5; i++) {
console.log(j)//7,7,7,7,7
}
此外馁菜,
for(const key in {a:1, b: 2}) { 茴扁, ;/
console.log(key)//a,b
}
for(const key in [1,2,3]) {
console.log(key)//0,1,2
}
這樣是可行的汪疮,數(shù)組也是對象的一種丹弱。
3.4數(shù)據(jù)類型
ECMAScript 有六種基本數(shù)據(jù)類型(簡單數(shù)據(jù)類型):
? "undefined"表示值未定義;
? "boolean"表示值為布爾值铲咨;
? "string"表示值為字符串躲胳;
? "number"表示值為數(shù)值;
? "object"表示值為對象(而不是函數(shù))或 null纤勒;
? "function"表示值為函數(shù)坯苹;
? "symbol"表示值為符號。
還有引用數(shù)據(jù)類型(復雜數(shù)據(jù)類型)Object摇天。
3.4.1typeof
可以通過typeof來檢測數(shù)據(jù)類型粹湃。比如:
typeof 123;//"number"
typeof '123'//"string"
typeof 的返回值是字符串;
3.4.2 undefined
undefined類型只有一個值就是undefined泉坐。
當使用var或let聲明變量卻沒有初始化時为鳄,相當于給變量復制了undefined。
let message;//undefined
var information;//undefined
但是腕让,聲明還是沒聲明調(diào)用typeof都會返回undefined孤钦。
let un;
console.log(un); //undefined
console.log(age); //報錯
typeof un; //undefined
typeof age; //undefined
建議在聲明變量的同時進行初始化(比如let num = 10)。這樣纯丸,當 typeof 返回"undefined"時偏形,你就會知道那是因為給定的變量尚未聲明(也就是啥都沒做),而不是聲明了但未初始化觉鼻。
3.4.3 null
Null 類型同樣只有一個值俊扭,即特殊值 null。邏輯上講坠陈,null 值表示一個空對象指針萨惑,這也是給typeof 傳一個 null 會返回"object"的原因:
typeof null; //'object'
null == undefined; //true
任何時候捐康,只要變量要保存對象,而當時又沒有那個對象可保存庸蔼,就要用 null 來填充該變量吹由。這樣就可以保持 null 是空對象指針的語義,并進一步將其與 undefined 區(qū)分開來朱嘴。
3.4.4 Boolean
有兩個字面值:true 和 false。
布爾值字面量 true 和 false 是區(qū)分大小寫的粗合,因此 True 和 False(及其他大小混寫形式)是有效的標識符萍嬉,但不是布爾值。
let true; // SyntaxError
let True; //undefined
此外隙疚,
let message = "Hello world!";
let messageAsBoolean = Boolean(message); //true
字符串 message 會被轉(zhuǎn)換為布爾值并保存在變量 messageAsBoolean 中壤追。
什么值能轉(zhuǎn)換為 true或 false?
當轉(zhuǎn)換的值是 ' '(空字符串)供屉、NaN行冰、null、false伶丐、undefined回懦、0這六種情況下時為假值(false);其他情況均為true冻辩。
ps: Boolean([]) == true;
3.4.5 Number
整數(shù)也可以用八進制(以 8 為基數(shù))或十六進制(以 16 為基數(shù))字面量表示。
對于八進制字面量,第一個數(shù)字必須是零(0)隧出,第二位可以是 o 或者 O(可以省略);然后是相應的八進制數(shù)字(數(shù)值 0~7)畏鼓。
let octalNum1 = 070; //8
let octalNum2 = 0o70; //8
let octalNum3 = 0O70; //8
要創(chuàng)建十六進制字面量拘悦,必須讓真正的數(shù)值前綴 0x或0X,然后是十六進制數(shù)字(0~9 以及 A~F(a-f));
let hexNum1 = 0xA; // 十六進制 10
let hexNum2 = 0XA; // 十六進制 10
let hexNum3 = 0xa; // 十六進制 10
1.NaN;(not a number)
在 ECMAScript 中组题,0葫男、+0 或?0 相除會返回 NaN:
console.log(0/0); // NaN
console.log(-0/+0); // NaN
如果分子是非 0 值,分母是有符號 0 或無符號 0
console.log(5/0); // Infinity
console.log(5/-0); // -Infinity
NaN不等于本身
console.log(NaN == NaN); // false
isNaN()接受一個參數(shù)并判斷其是否“不是數(shù)值”
console.log(isNaN(10)); // false崔列,10 是數(shù)值
console.log(isNaN("10")); // false梢褐,可以轉(zhuǎn)換為數(shù)值 10
console.log(isNaN("blue")); // true,不可以轉(zhuǎn)換為數(shù)值
console.log(isNaN(true)); // false赵讯,可以轉(zhuǎn)換為數(shù)值 1
- 數(shù)值轉(zhuǎn)換
string "13px" => NaN; " " => 0
boolean true => 1 false => 0
null null => 0
undefined undefined => NaN
{} {} => NaN
[] [1]=>1,[]=>0,[1,2]=>NaN
function Number(function(){}) => NaN
parseInt方法
調(diào)用parseInt(),字符串最前面的空格會被忽略利职,從第一個非空格字符開始轉(zhuǎn)換。如果第一個字符不是數(shù)值字符瘦癌、加號或減號猪贪,parseInt()立即返回 NaN。
let num1 = parseInt("1234blue"); // 1234
let num2 = parseInt(""); // NaN
let num3 = parseInt("0xA"); // 10讯私,解釋為十六進制整數(shù)
let num4 = parseInt(22.5); // 22
let num5 = parseInt("70"); // 70热押,解釋為十進制值
let num6 = parseInt("0xf"); // 15西傀,解釋為十六進制整數(shù)
也可以接受第二個參數(shù)
let num = parseInt("0xAF", 16); // 175
let num1 = parseInt("AF", 16); // 175
let num2 = parseInt("AF"); // NaN
發(fā)現(xiàn)跟直接寫
let num = 0xAF;//175
一樣。
但是第一個參數(shù)可以直接傳值;
let num1 = parseInt("10", 2); // 2桶癣,按二進制解析
let num2 = parseInt("10", 8); // 8拥褂,按八進制解析
let num3 = parseInt("10", 10); // 10,按十進制解析
let num4 = parseInt("10", 16); // 16牙寞,按十六進制解析
parseFloat
parseFloat()函數(shù)的工作方式跟 parseInt()函數(shù)類似饺鹃,但是只解析到一個小數(shù)點而第二個小數(shù)點后的數(shù)值會被省略,此外间雀,parseFloat()只解析十進制悔详。
let num1 = parseFloat("1234blue"); // 1234,按整數(shù)解析
let num2 = parseFloat("0xA"); // 0
let num3 = parseFloat("22.5"); // 22.5
let num4 = parseFloat("22.34.5"); // 22.34
let num5 = parseFloat("0908.5"); // 908.5
3.4.6 String
ECMAScript 中的字符串是不可變的(immutable)惹挟,意思是一旦創(chuàng)建茄螃,它們的值就不能變了。
轉(zhuǎn)換為字符串
1 连锯、toString()
let age = 11;
let ageAsString = age.toString(); // 字符串"11"
let found = true;
let foundAsString = found.toString(); // 字符串"true"
在對數(shù)值調(diào)用這個方法時归苍,toString()可以接收一個底數(shù)參數(shù),即以什么底數(shù)來輸出數(shù)值的字符串表示运怖。
let num = 10;
console.log(num.toString()); // "10"
console.log(num.toString(2)); // "1010"
console.log(num.toString(8)); // "12"
console.log(num.toString(10)); // "10"
console.log(num.toString(16)); // "a"
2拼弃、String()
String()函數(shù)遵循如下規(guī)則。
? 如果值有 toString()方法摇展,則調(diào)用該方法(不傳參數(shù))并返回結(jié)果肴敛。
? 如果值是 null,返回"null"吗购。
? 如果值是 undefined医男,返回"undefined"。
let value1 = 10;
let value2 = true;
let value3 = null;
let value4;
console.log(String(value1)); // "10"
console.log(String(value2)); // "true"
console.log(String(value3)); // "null"
console.log(String(value4)); // "undefined"
3.4.7 Symbol
3.4.8Object
這兩個后面單獨寫吧