1.基本概念
定義: 運行在客戶端的一種腳本語言,不需要進行編譯。
作用:
- 表單的動態(tài)檢測
- 服務器的開發(fā)(node.js)
- 桌面程序(electron)
- App (cordova)
- 控制硬件 — 物聯(lián)網(Ruff)
- 游戲開發(fā) — (cocos2d-js)
執(zhí)行:
- 渲染引擎:用來解析HTML與CSS,俗稱內核,比如chrome的blink,和老版本的webkit。
- JS引擎: 又稱js解析器,用來讀取網頁中的JavaScript代碼,對其處理后運行,比如chrome的V8。
組成:
- ECMAScript:JavaScript語法
- DOM:頁面文檔對象模型
- BOM:瀏覽器對象模型
2.變量聲明(var let const)
var變量:所有版本都可以使用。
- 聲明作用域
var temp = "abc"; //1.全局變量
function fn(){
var temp2 = "abc"; //2.局部變量
temp3 = "abc"; //3.去掉var操作符,自動升級為全局變量(不推薦使用)
}
fn();
console.log(temp); //正常輸出
console.log(temp2); //報錯
console.log(temp3); //正常輸出
- 聲明提升
使用var聲明的變量會自動提升道作用域的頂部,并且還可以重復聲明同一個變量
function fun(){
console.log(num) //undefined
var num = '25';
}
fun();
//fun 等價于 fun2
function fun2(){
var num ;
console.log(num)
num = '25';
}
fun2();
let變量:只能在ECMAScript6及以后的版本使用。
作用和var差不多,但是最主要的區(qū)別就是let聲明范圍的是塊作用域,而var聲明的的范圍是函數(shù)作用域。在同一個塊作用域中,只能聲明一次。
let name ='five';
let name ='five';// SyntaxError: Identifier 'name' has already been declared
if (true){
var num = '123';
console.log(num) //123
let count = '456';
console.log(count); //456
}
console.log(num); //123
console.log(count); // ReferenceError: count is not defined
- 其他區(qū)別:
1.暫時性死區(qū):let申明的變量不會在作用域中被提升。
2.全局聲明:let在全局作用域中聲明的變量不會成為window對象的屬性,(var聲明的對象會)
var name = 'five';
console.log(window.name); //five
let sex = 'nan';
console.log(window.sex); //undefined
3.條件聲明:在if條件下,在使用var聲明變量時,由于聲明會被提升,js引擎會將多余的聲明提升到作用域的頂端合并成為一個聲明,let的作用域是塊,所以不會檢查前面是否已經使用let聲明過同名變量,同時也就不可能再沒有聲明的情況下聲明它。
4.for循環(huán)中的let聲明:在使用let申明迭代變量的時候,js引擎會給每個迭代循環(huán)聲明一個新的迭代變量,每個setTimeout引用的都是不同的變量實例。
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i); //5 5 5 5 5
}, 0)
}
for (let j = 0; j < 5; j++) {
setTimeout(() => {
console.log(j); // 0 1 2 3 4
}, 0)
}
const常量:只能在ECMAScript6及以后的版本使用。
const與let基本相同,區(qū)別就是在于:在聲明變量的是時候必須初始化值,且嘗試修改const聲明的變量會導致錯誤。(對象除外,即使用const聲明的對象,可以修改這個對象內部的屬性。)
//不允許給常量賦值
const age = 15;
age = 22; //TypeError: Assignment to constant variable.
//不允許重復賦值
const name = 'a';
const name = 'b'; //SyntaxError: Identifier 'name' has already been declared
//聲明的作用域是塊
const data = 'c';
if (true) {
const data = 'd';
}
console.log(data); //c;
總結:1.不使用var,由let或者const代替,2.優(yōu)先使用const,let次之。
3.數(shù)據(jù)類型(基本數(shù)據(jù)類型:Undefined,Null,Boolean,Number,String,Symbol(符號,ECMAScript6新增)復雜數(shù)據(jù)類型:Object)
-
typeof操作符:是一個操作符,而不是函數(shù),所以可以不需要參數(shù)(但是可以使用)。
1.“undefined” 表示值未定義
2.“boolean” 表示值為布爾值
3.“string” 表示值為字符串
4.“object” 表示值為對象(而不是函數(shù))或者null
5.“function” 表示值為函數(shù)
6.“symbol” 表示值為符號
例子:
let message = 'hello word';
console.log(typeof message); //string
console.log(typeof (message)); //string
console.log(typeof 95); //number
let car = null;
console.log(typeof car); //object
- Null類型:只有一個值,特殊值null,null表示一個空對象的指針,也就解釋了給typeof 傳一個null會返回“object”的原因。
- Boolean類型:可以將其他所有的數(shù)據(jù)類型轉換成為Boolean值,通過調用特定的函數(shù)Boolean(),來實現(xiàn)。
數(shù)量類型 轉換成為true的值 轉換成為false的值
Boolean true false
String 非空字符串 “”(空字符串)
Number 非零值 0、NAN
Object 任意對象 null
Undefined N/A(不存在) undefined
-
NAN:特殊數(shù)值,表示本來要返回數(shù)值的操作失敗了(而不是拋出錯誤)
1.數(shù)值轉換- Number():轉型函數(shù),可用于任何數(shù)據(jù)類型。
- parseInt();通常需要獲取整數(shù)的時候可以使用該函數(shù)。字符串最前的空格會被忽略掉,沖第一個非空格字符串開始轉換,如果第一個字符不是數(shù)值字符、加號或者減號,parseInt()立即返回NaN。如果中間是字符串,就會自動省略字符后面所有的(包含字符串)。第二個參數(shù)最好不省略,直接寫10,代表十進制。
let num4 = Number(''); // 0
let num5 = Number('125ad2');// NaN
let num1 = parseInt('125d22',10); //125--注意指定進制
let num2 = parseInt('',10); //NaN
let num3 = parseInt('515.52.2',10); //515
- Symbal符號:符號是原始值,且符號實例是唯一,不可變的。符號的用途是確保對象使用唯一標識符,不會發(fā)生屬性沖突的危險。
- == 與 ===:相等(==),值相等即為true;全等(===),不僅值要相等,對象類型也要一致。
let flag = '55' == 55; //true
let flag2 = '55' === 55; //false 數(shù)據(jù)類型不相同