JS1

第一章

前端三大語(yǔ)言:HTML(專(zhuān)門(mén)編寫(xiě)網(wǎng)頁(yè)內(nèi)容)、CSS(編寫(xiě)網(wǎng)頁(yè)樣式)、JS(專(zhuān)門(mén)編寫(xiě)網(wǎng)頁(yè)交互行為)

能簡(jiǎn)寫(xiě)盡量簡(jiǎn)寫(xiě)

交互(IPO): ①用戶(hù)輸入;②執(zhí)行: 程序接受、處理、響應(yīng)數(shù)據(jù);③輸出處理結(jié)果

原生JS:不需要下載任何第三方文件,僅依靠瀏覽器就可直接執(zhí)行的js代碼

學(xué)習(xí)版本:ES6(2015)

現(xiàn)版本:ES7

中文亂碼問(wèn)題:引入的 .js 文件要與HTML文件一樣是UTF-8模式,否則要在script中加?charset="gbk",但兩個(gè)不能同時(shí)使用

API(Application Programming Interface,應(yīng)用程序編程接口)是一套用來(lái)控制Windows的各個(gè)部件的外觀和行為的一套預(yù)先定義的Windows函數(shù)

如果回調(diào)函數(shù)無(wú)法取名,可以在回調(diào)函數(shù)中調(diào)用定義的另一個(gè)有名的函數(shù),以此來(lái)達(dá)到目的

判斷數(shù)據(jù)是否為null、0、""、NaN、null、undefined一律可以省略等號(hào)后的值,只判斷是否為false

js的事件監(jiān)聽(tīng)跟css不一樣,css只要設(shè)定好了樣式,不論是原來(lái)就有的還是新添加的,都有一樣的表現(xiàn),而事件監(jiān)聽(tīng)不同,只能給已經(jīng)加載好的元素綁定事件

_______________________________________________________________________________________________

typeof null返回object

最初,JavaScript使用標(biāo)記位來(lái)區(qū)分對(duì)象類(lèi)型和原始類(lèi)型:對(duì)象值使用0來(lái)標(biāo)識(shí),原始值使用1,因此,導(dǎo)致全為0的null被識(shí)別為object

JavaScript可以通過(guò)typeof ...來(lái)判斷原始數(shù)據(jù)類(lèi)型,但不能夠準(zhǔn)確判斷引用類(lèi)型,但可以用Object的toString方法來(lái)判斷:?console.log(Object.prototype.toString.call(要判斷的數(shù)據(jù)))

一元運(yùn)算符: 有些運(yùn)算符兩邊有2個(gè)操作數(shù),比如2+3、6%5等,這些叫做二元運(yùn)算符

? ? ? ? ? ? 只有一個(gè)操作數(shù)的叫做一元運(yùn)算符,它們的優(yōu)先級(jí)高于二元運(yùn)算符

? ? ? ? ? ? 一元運(yùn)算符包括: ++(自加)、--(自減)、!(邏輯非)

JS的運(yùn)算規(guī)則: 優(yōu)先級(jí)相同的運(yùn)算符從左向右計(jì)算(賦值運(yùn)算符相反)

var a=1;b=++a+a++; 表示 b=2+2;

var a={n:1};

var b=a;

a.x=a={n:2}; ? ?//從左往右讀(取出來(lái)),從右往左執(zhí)行

? ? ? ? ? ? ? ? //先執(zhí)行a.x={n:2},再執(zhí)行a={n:2}

console.log(a.x);? ? //undefined

console.log(b.x);? ? //{n:2}

console.log(a);? ? ? //{n:2}

console.log(b);? ? ? //{n:1, x:{n:2}}

_______________________________________________________________________________________________

1、Javascript概述

Javascript運(yùn)行于Javascript 【解釋器/引擎】中的解釋性腳本語(yǔ)言

Javascript運(yùn)行環(huán)境:1、Javascript解釋器 :NodeJS

? ? ? ? ? ? ? ? ? ? 2、嵌入在瀏覽器中的內(nèi)核(引擎)

? 解釋型:無(wú)需編譯,直接運(yùn)行,出錯(cuò)就停止

? 腳本語(yǔ)言:純文本語(yǔ)言

? JS解釋器和JS引擎:1、獨(dú)立安裝的JS解釋器:NodeJS

? ? ? ? ? ? ? ? ? ? 2、嵌入在瀏覽器內(nèi)核中的JS解釋器:只要有瀏覽器,就能運(yùn)行JS

2、Javascript 發(fā)展

? ①1992年 Nombas公司開(kāi)發(fā)了一款腳本語(yǔ)言 ScriptEase ,可以嵌入在網(wǎng)頁(yè)中

? ②1995年 Netscape(網(wǎng)景)公司為Navigator2.0瀏覽器開(kāi)發(fā)了一款腳本語(yǔ)言 LiveScript,為了蹭熱點(diǎn)將其命名為 Javascript,其實(shí)Javascript與Java沒(méi)有一點(diǎn)關(guān)系

? ③1996年,Microsoft ,為了IE3.0,發(fā)布了一個(gè)Javascript克隆版本 JScript

? ④1997年 Javascript1.1 作為草案提交給了ECMA(歐洲計(jì)算機(jī)制造商協(xié)會(huì))→ECMA-262標(biāo)準(zhǔn)→ECMAScript(ECMA制定的JavaScript語(yǔ)言國(guó)際標(biāo)準(zhǔn),規(guī)定了JS語(yǔ)言的核心語(yǔ)法)

3、Javascript (原生JS)的組成

??① 核心(ECMAScript,簡(jiǎn)稱(chēng)ES,ECMA制定的JavaScript語(yǔ)言國(guó)際標(biāo)準(zhǔn),規(guī)定JS語(yǔ)言的核心語(yǔ)法)

? ② 文檔對(duì)象模型(DOM---Document Object Model)允許讓JS和HTML元素進(jìn)行對(duì)話

?專(zhuān)門(mén)操作網(wǎng)頁(yè)內(nèi)容的API

? ③ 瀏覽器對(duì)象模型(BOM—Browser Object Model)允許讓JS和瀏覽器進(jìn)行對(duì)話和操作

?專(zhuān)門(mén)操作瀏覽器窗口的API

4、Javascript特點(diǎn):

? ①任何編輯工具(例如:記事本)都可以編寫(xiě)Javascript,語(yǔ)法類(lèi)似于Java,C,...

? ②無(wú)需編譯,由JS解釋器運(yùn)行(自上向下邊讀邊解釋邊執(zhí)行,后解釋的相同內(nèi)容會(huì)覆蓋先解釋的)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?賦值:?從左往右讀(取出來(lái)待執(zhí)行),從右往左執(zhí)行(賦值)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?運(yùn)算:從左往右計(jì)算

? ③弱類(lèi)型語(yǔ)言:聲明變量時(shí),不必提前規(guī)定變量的數(shù)據(jù)類(lèi)型,先后可保存不同類(lèi)型的數(shù)據(jù),由值來(lái)自動(dòng)隱式轉(zhuǎn)換數(shù)據(jù)類(lèi)型

? ④基于對(duì)象的編程語(yǔ)言———萬(wàn)物皆對(duì)象

5、 Javascript的用途

? ①客戶(hù)端Javascript:瀏覽器中運(yùn)行

? ? 1、客戶(hù)端數(shù)據(jù)計(jì)算

? ? 2、客戶(hù)端表單輸入驗(yàn)證

? ? 3、瀏覽器事件的觸發(fā)和處理

? ? 4、客戶(hù)端動(dòng)畫(huà)效果特效制作

? ? 5、服務(wù)器的異步數(shù)據(jù)提交(ajax)

? ②服務(wù)器端Javascript:1、分布式運(yùn)算????2、實(shí)時(shí)服務(wù)器????3、窗口應(yīng)用????4、網(wǎng)絡(luò)應(yīng)用

_______________________________________________________________________________________________

Javascript基礎(chǔ)語(yǔ)法

1、JS運(yùn)行在腳本解釋引擎:專(zhuān)門(mén)解析JS語(yǔ)言,并執(zhí)行js程序的小軟件

瀏覽器內(nèi)核:負(fù)責(zé)頁(yè)面內(nèi)容的渲染,由兩部分組成:

? ①內(nèi)容排版引擎:解析 HTML 和 CSS,并顯示網(wǎng)頁(yè)內(nèi)容和樣式的小軟件,效率高

? ②腳本解釋引擎:解析并執(zhí)行 Javascript 程序的小軟件,效率略低

全球僅有四個(gè)獨(dú)立的瀏覽器內(nèi)核

? ? ? ? 瀏覽器 ? ? ? ? ? ?內(nèi)核 ? ?內(nèi)容引擎 ? ?腳本引擎

? ? Microsoft IE ? ? ? ?Trident? ? -- ? ? ? ? Chakra

? ? Mozilla Firefox ? ? ?Gecko? ?? -- ? ? ? ?Monkey系列

? ? Apple Safari ? ? ?? Webkit ? ?Webcore ? ? ?Nitro

? ? Google Chrome ? ? ?Webkit? ?Webcore ? ? ? V8

? ? Opera ? ? ? ? ? ? ?Presto? ? ?-- ? ? ?? Carakan

? ? Opera(2013 -) ? ? ? Webkit ? ?Webcore ? ? ? V8

2、Javascript運(yùn)行環(huán)境

運(yùn)行環(huán)境:

? ①安裝獨(dú)立的Javascript解釋器—Node.js

? ? 步驟:1、安裝NodeJS

? ? ? ? ? 2、運(yùn)行JS腳本:console.log ("輸出的內(nèi)容");

? ②瀏覽器內(nèi)核嵌入的JS解釋器:在console中輸入腳本運(yùn)行,將JS腳本嵌入在HTML網(wǎng)頁(yè)中執(zhí)行

_______________________________________________________________________________________________

輸出位置(3個(gè))

①向頁(yè)面添加內(nèi)容:<script>document.write("html代碼段");</script>? /*document:當(dāng)前網(wǎng)頁(yè)(不推薦)*/

②彈出對(duì)話框:彈出對(duì)話框顯示消息:alert("提示消息");? ?? /*彈出瀏覽器預(yù)定好的樣式,不可修改*/

③向控制臺(tái)中輸出內(nèi)容:F12→console.log("xx");? ? /*控制臺(tái)專(zhuān)門(mén)用于調(diào)試程序,臨時(shí)顯示調(diào)試結(jié)果*/

書(shū)寫(xiě)位置(2處)

①頁(yè)面的<script type="text/javascript"></script>標(biāo)簽中嵌入腳本

? EX:?<script>document.write("xxx");</script>

? ? ? document.write:網(wǎng)頁(yè)中打印輸出一句話!里面的內(nèi)容是交給內(nèi)容排版引擎解析的

? EX:docume.write("<h1>第一個(gè)JS</h1>");

一旦進(jìn)入script標(biāo)簽內(nèi),就要使用js的語(yǔ)法

問(wèn)題: 不符合內(nèi)容與行為分離的原則,不便于維護(hù)和共用

②將腳本嵌入在外部的腳本文件中

? 1、創(chuàng)建腳本文件并編寫(xiě)JS腳本:創(chuàng)建一個(gè)**.JS文件;直接編寫(xiě)JS腳本

? 2、使用網(wǎng)頁(yè)中進(jìn)行引入:<script src="url"></script>

? ? ?注意:必須成對(duì)出現(xiàn),兩個(gè)script標(biāo)簽之間不允許出現(xiàn)其他內(nèi)容

? ? ?放在<head></head>中,瀏覽器解析head部分時(shí)就會(huì)執(zhí)行這個(gè)代碼,然后才會(huì)解析頁(yè)面其它部分

? ? ?放在<body></body>中,瀏覽器讀取到該語(yǔ)句時(shí)才會(huì)執(zhí)行(一般使用此方法)

3、JS基本調(diào)試

? JS運(yùn)行過(guò)程中,如果出現(xiàn)錯(cuò)誤,則終止本塊的執(zhí)行,但不影響后續(xù)代碼塊執(zhí)行

? <script></script>:代碼塊

4、基本語(yǔ)法規(guī)范

? ①代碼的基本組成:語(yǔ)句

? ? 語(yǔ)句:允許被JS引擎所解釋的代碼,由表達(dá)式,關(guān)鍵字,運(yùn)行符所組成

? ? 注意:嚴(yán)格區(qū)分大小寫(xiě)

? ? ? ? ?所有的標(biāo)點(diǎn),全部都是英文的

? ? ? ? ? 字符串可以用" "或' '

? ? ? ? ?語(yǔ)句都是以;表示結(jié)束

? ②JS中的注釋?zhuān)簡(jiǎn)涡凶⑨專(zhuān)?/ ? ? ? ? ? ? ? ? ? ? ?多行注釋?zhuān)?**/

_______________________________________________________________________________________________

輸出臺(tái)操作(F12):

①Shift+Enter: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*僅換行暫不執(zhí)行,用于多行輸出*/

②console.log("Hello World!"); ? ? ? ? ? ? ? /*每寫(xiě)log一次,都自動(dòng)換行*/

③左上角圓形叉號(hào):Clear console ? ? ? ? ? ? ? /*清空控制臺(tái)*/

④調(diào)出剛寫(xiě)過(guò)的代碼段:上下鍵切換

調(diào)試程序:2種

斷點(diǎn)調(diào)試:debugger; ? ?/*加在console.log 之前,在開(kāi)著F12的情況下才有效*/

console.log(" , , "); /*在控制臺(tái)輸出(""中的+會(huì)將這兩個(gè)變量視為字符串,最后一個(gè)不能加,)*/

啟用嚴(yán)格模式:在script頂部插入:"use strict"; ? ? ? ? ? ? /*解決靜默失敗*/

嚴(yán)格模式下: 不用var定義變量是非法的,會(huì)導(dǎo)致錯(cuò)誤;調(diào)用函數(shù)中的this值是undefined

非嚴(yán)格模式下: 不用var定義變量是全局變量;調(diào)用函數(shù)中的this值是全局對(duì)象

輸入: prompt("輸入提示") ? ? ? ? /*輸入框: 專(zhuān)門(mén)請(qǐng)用戶(hù)輸入一個(gè)數(shù)據(jù)的對(duì)話框*/

_______________________________________________________________________________________________

變量和常量

變量

1、什么是變量:內(nèi)存中存儲(chǔ)一個(gè)數(shù)據(jù)的存儲(chǔ)空間,再起一個(gè)名字,為了重用

? ?量:數(shù)據(jù)

? ?變量:變化的數(shù)據(jù)

? ?內(nèi)存:保存程序在運(yùn)行過(guò)程中所需要用到的數(shù)據(jù)

?? 變量:內(nèi)存中的一段存儲(chǔ)空間,用于保存數(shù)據(jù)

?? 值:變量中所保存的數(shù)據(jù)

?? 變量名:內(nèi)存地址的別名即保存數(shù)據(jù)的空間的名稱(chēng)

2、變量的聲明

①聲明變量:在內(nèi)存中,創(chuàng)建一個(gè)存儲(chǔ)空間,再起一個(gè)名字

var 變量名;

默認(rèn)值:undefined:專(zhuān)門(mén)表示一個(gè)從未使用過(guò)的變量

②為變量賦值:將數(shù)據(jù)保存在變量中(盡量不要讓變量空著,賦初值)

變量名=值;

注意:只有等號(hào)才能改變變量中的值;等號(hào)會(huì)覆蓋變量中的原值;變量賦值前必須先聲明(給未聲明過(guò)的變量賦值,普通情況下自動(dòng)創(chuàng)建新變量并保存值;ES5模式規(guī)定禁止給未聲明的變量賦值)

取用:取出變量中的值做運(yùn)算,只要使用變量值,等效于直接使用變量中的值

? ? ? 不加引號(hào)的都會(huì)當(dāng)做變量

③聲明變量并賦值

var 變量名=值; ? ? ? ? ? ? ? ?/*只有等號(hào)才能賦值*/

注意:如果變量的值時(shí)非數(shù)字類(lèi)型的話,要使用''或""括起來(lái)

? ? ? 聲明時(shí)可以省略var關(guān)鍵字,省略后成為了全局變量,推薦不要省略var關(guān)鍵字

④推薦:?一條語(yǔ)句聲明多個(gè)變量,用,分隔(每個(gè)變量必須要用=才能賦值)(建議多個(gè)變量換行寫(xiě))

? ? 例:var 名1="xxx",名2="xxx",名3="xxx";

3、變量名的命名規(guī)范

? ①不允許是JS的關(guān)鍵字或保留關(guān)鍵字

? ②可以包含字母,數(shù)字,下劃線(_),$

? ③不能以數(shù)字開(kāi)頭

? ④盡量見(jiàn)名知義

? ⑤可以采用“匈牙利命名法”,“駝峰命名法”,“下劃線命名法”

? ? 駝峰命名法:變量名稱(chēng),如果只有一個(gè)單詞組成,采用全小寫(xiě)模式 ? 例:var age

? ? 如果變量名由多個(gè)單詞組成,第一個(gè)單詞全小寫(xiě),其余的每個(gè)單詞的首字母,變大寫(xiě)

4、變量的使用

①變量定義后,未賦過(guò)值而直接使用

? EX:var userName;

? ? ? console.log (userName); ? ? 結(jié)果為:undefined,表示沒(méi)有值

②對(duì)變量進(jìn)行存取操作

? 1、獲取變量的值-GET操作

? ?? 例:var userAge=18;--------存值

? ? ? ?? console.log(userAge);------------取值

? ? ? ? ?document.write(userAge);----------取值

? ? ? ?? user-----存值操作 ? 18------取值操作

輸出從未聲明的變量時(shí)會(huì)返回:ReferenceError ? ? ? 沒(méi)有找到對(duì)象

? 總結(jié):只要變量沒(méi)有出現(xiàn)在=左邊,一律是取值

? 2、設(shè)置變量的值 – SET操作

? ? ?例:var userAge=15;

? ? ? ?? var newAge=userAge

? ? ? ?? userAge---取值 ? newAge---存值

? ? ? ?? newAge=newAge+15;

? ? ? ? ?console.log(newAge);--------30

? 總結(jié):只要變量出現(xiàn)在=左邊,一律是存值操作

筆試題: var a,b=2; ?→ ?a:undefined? b:2

? ? ? ? var a=b=2; ?→ ?a:2 ?b:2 (在函數(shù)中時(shí),a是局部變量,b是全局變量)

_______________________________________________________________________________________________

常量

1、什么是常量

一經(jīng)聲明定義后,就不允許被修改的數(shù)據(jù)成為常量

目的:保證數(shù)據(jù)的準(zhǔn)確性

適合用常量表示的數(shù)據(jù):EX:1、圓周率:兀=3.1415926; ?2、一周有7天

2、語(yǔ)法

const 常量名=值;

注意:①常量不允許賦值,否則會(huì)靜默失敗,ES5嚴(yán)格模式會(huì)報(bào)錯(cuò)

? ? ? ②聲明變量時(shí),必須初始化其值

? ? ? ③習(xí)慣上,常量名采用純大寫(xiě)形式

取值:和變量用法一樣

var 變量=prompt("提示")? /*請(qǐng)用戶(hù)輸入變量的值,并保存在變量中,不能在node里使用prompt*/

_______________________________________________________________________________________________

數(shù)據(jù)類(lèi)型(掌握)

1、什么是數(shù)據(jù)類(lèi)型

?? 保存在內(nèi)存中數(shù)據(jù)的真實(shí)類(lèi)型,約束了數(shù)據(jù)在內(nèi)存所占的空間大小,存儲(chǔ)結(jié)構(gòu)

?? 不同的數(shù)據(jù)類(lèi)型,擅長(zhǎng)執(zhí)行的操作不一樣,就需要配套合適的存儲(chǔ)結(jié)構(gòu),給操作提供便利

2、數(shù)據(jù)類(lèi)型分類(lèi)

原始類(lèi)型(基本數(shù)據(jù)類(lèi)型: 值直接保存在變量本地的數(shù)據(jù)類(lèi)型)

? 包括5個(gè): number、string、boolean、null、undefined

引用類(lèi)型: 值無(wú)法直接保存在變量本地的復(fù)雜數(shù)據(jù)類(lèi)型

? 包括: Array、Function、Date、RegExp、Error、Object、String、Number、Boolean、Math、Window

數(shù)組是引用類(lèi)型的對(duì)象,對(duì)象的本質(zhì)就是關(guān)聯(lián)數(shù)組,只不過(guò)用法更簡(jiǎn)單

函數(shù)名其實(shí)僅是一個(gè)普通的變量 ,函數(shù)其實(shí)是保存代碼段的引用類(lèi)型的對(duì)象

? ①number類(lèi)型:

專(zhuān)門(mén)用于存儲(chǔ)數(shù)字,表示32(8位一個(gè)字節(jié))位的"整數(shù)",也可以標(biāo)識(shí)64位的"浮點(diǎn)數(shù)",采用二進(jìn)制存儲(chǔ)(),凡是不加引號(hào)的數(shù)字直接量,默認(rèn)都是number類(lèi)型

何時(shí): 如果一個(gè)數(shù)值可能需要比較大小和進(jìn)行數(shù)學(xué)計(jì)算時(shí)

存儲(chǔ)空間: 整數(shù)占4個(gè)字節(jié),浮點(diǎn)數(shù)占8個(gè)字節(jié),數(shù)值大小和存儲(chǔ)空間無(wú)關(guān)(1字節(jié)=8位二進(jìn)制)

特殊:舍入誤差:計(jì)算機(jī)中也有計(jì)算不盡的數(shù)值

原因:number類(lèi)型底層都是二進(jìn)制存儲(chǔ)

解決:四舍五入

n.toFixed(n)//四舍五入,保留n位小數(shù),返回字符串類(lèi)型,傳入數(shù)字,可Number(x).toFixed(2)

typeof x / typeof(x) ? ? ? ? ? /*返回變量x中存儲(chǔ)的數(shù)據(jù)類(lèi)型*/

var m=n.toString(2) ? ? ? ? ?? /*把n中的數(shù)值(先轉(zhuǎn)為Unicode)轉(zhuǎn)換為內(nèi)存中的二進(jìn)制形式*/

? ②string類(lèi)型

什么是: 凡是加引號(hào)的一串字符直接量都是字符串類(lèi)型,EX:姓名,性別,住址,身份證號(hào),不用做計(jì)算和比較大小,都用""或''包裹

何時(shí): 記錄一串文字

js中一切文字都是由Unicode字符、數(shù)字、標(biāo)點(diǎn)符號(hào)的序列組成的

Unicode 是編碼(對(duì)全球主要語(yǔ)言的每個(gè)字編一個(gè)號(hào))的一種,Unicode下所有的字符,每個(gè)字符均占2字節(jié),而且每個(gè)字符都有一個(gè)獨(dú)一無(wú)二的Unicode碼

字母和數(shù)字占1個(gè)字節(jié),漢字占2個(gè)字節(jié)

string類(lèi)型的數(shù)據(jù)在使用過(guò)程中,要用""或''引起來(lái)

特殊字符需要轉(zhuǎn)義,稱(chēng)為轉(zhuǎn)義字符(字符串中具有特殊功能的字符)

如果在字符串中包含了和js語(yǔ)法沖突的','等,都要用\轉(zhuǎn)義為普通字符

? 轉(zhuǎn)義字符 ? ? ? ? ?表現(xiàn)(輸出)形式

? ?\n ? ? ? ? ? ? ?? 一個(gè)換行

? ? \t ? ? ? ? ?? ? ? 制表符

? ? \\ ? ? ? ? ? ? ? ? ? \

? ? \" ? ? ? ? ? ? ? ? ? ''

? ? \' ? ? ? ? ? ? ? ? ? '

例:var str= '你\n好';

? ? 路徑:所有操作系統(tǒng)都支持/斜線,所以保存路徑時(shí)要將\換成/:

var n=str.charCodeAt(i);? //查看字符串str中下標(biāo)i位置字符的unicode號(hào)

String.fromCharCode(unicode號(hào))? ? //將unicode號(hào),反向轉(zhuǎn)回文字,一次只能轉(zhuǎn)一個(gè)字,要用循環(huán)

var m=n.toString(2);? ?? //將n中的數(shù)值轉(zhuǎn)換為二進(jìn)制形式

parseInt(10000000000,2);??//把二進(jìn)制數(shù)轉(zhuǎn)換成十進(jìn)制

var str=x.toString();? ? //將 x 轉(zhuǎn)為字符串類(lèi)型,不改變?cè)祒。x為數(shù)組時(shí),結(jié)果str用,分隔

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? x不能是null或undefined ———?不是萬(wàn)能

var str=String(x);? ? ? ? //將x轉(zhuǎn)為字符串類(lèi)型———萬(wàn)能(首選)

? ③boolean類(lèi)型

作為條件的結(jié)果,來(lái)表示肯定(真)或否定(假)

何時(shí): 只要作為判斷條件的結(jié)論時(shí),就用boolean類(lèi)型

取值:true:真(肯定)

? ? ? false:假 (否定)

例:var xxx=true;

該類(lèi)型數(shù)據(jù)可以參與到數(shù)字的運(yùn)算中:true = 1 ??false = 0

? ④undefined /⑤null

undefined:空,由程序自動(dòng)為一個(gè)變量初始化之用;表示一個(gè)聲明后未賦值的變量、沒(méi)有返回值的函數(shù)

null:空,讓程序員用于手動(dòng)清空一個(gè)變量之用,表示一個(gè)空地址

第二章*****************************************************************************************

x:任何數(shù)據(jù)

str:字符串

num:數(shù)字

數(shù)據(jù)類(lèi)型轉(zhuǎn)換:(凡是從頁(yè)面上獲得的都是字符串)

作用:將不需要的數(shù)據(jù)類(lèi)型,轉(zhuǎn)化為需要的數(shù)據(jù)類(lèi)型

js四大特點(diǎn):弱類(lèi)型的3大特點(diǎn):

?????1. 聲明變量時(shí),不需要提前規(guī)定變量中存儲(chǔ)的數(shù)據(jù)類(lèi)型

?????2. 同一個(gè)變量先后可保存不同類(lèi)型的數(shù)據(jù)

?????3. js會(huì)根據(jù)自身的需要,隱式轉(zhuǎn)換數(shù)據(jù)的類(lèi)型

何時(shí):只要給定的數(shù)據(jù)類(lèi)型不是想要的,都要轉(zhuǎn)換

方法有2種:

1、隱式轉(zhuǎn)換: 不需要程序員干預(yù),由js自動(dòng)完成的數(shù)據(jù)類(lèi)型轉(zhuǎn)換

??? 何時(shí): 只要給定的數(shù)據(jù)類(lèi)型和js運(yùn)算要求的類(lèi)型不相符,js都會(huì)自動(dòng)轉(zhuǎn)化數(shù)據(jù)類(lèi)型,再運(yùn)行

? ? 如何:每種運(yùn)算中都自帶隱式轉(zhuǎn)換

? ? ? ? ? 比如: 算數(shù)計(jì)算中

規(guī)則:

? ? ①默認(rèn):一切都轉(zhuǎn)為number類(lèi)型,再做計(jì)算

? ? 為什么: 因?yàn)閚umber類(lèi)型最適合計(jì)算

? ? ? ? bool: true->1 ? ? ?false->0

? ? ②特殊:+運(yùn)算中,只要碰到一個(gè)字符串,一切都轉(zhuǎn)為字符串,+運(yùn)算變?yōu)樽址唇?/p>

若字符串左邊有變量,先計(jì)算變量,從左到右依次計(jì)算(按優(yōu)先級(jí)),到字符串的位置后,都轉(zhuǎn)化為字符串

2. 強(qiáng)制轉(zhuǎn)換:程序員主動(dòng)調(diào)用轉(zhuǎn)換函數(shù)實(shí)現(xiàn)的類(lèi)型轉(zhuǎn)換(3種情況)

??? 何時(shí): 只要給定的數(shù)據(jù)類(lèi)型不是想要的,且自動(dòng)轉(zhuǎn)換的結(jié)果也不是想要的,就要強(qiáng)制轉(zhuǎn)換

console.log(typeof x); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*輸出str的數(shù)據(jù)類(lèi)型*/

_______________________________________________________________________________________________

其他類(lèi)型轉(zhuǎn)number: 2種:

1. Number(x): 將純數(shù)字x字符串或bool轉(zhuǎn)為number類(lèi)型(不直接修改原變量的值,而是返回新值)

x=Number(x); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? /*用于隱式轉(zhuǎn)換中自動(dòng)調(diào)用*/

? ? 何時(shí): 都是隱式轉(zhuǎn)換,其實(shí)相當(dāng)于自動(dòng)調(diào)用Number(x),很少主動(dòng)使用

? ? 問(wèn)題: 只能轉(zhuǎn)換純數(shù)字組成的字符串和bool類(lèi)型

? ? 如果轉(zhuǎn)不了: 就返回NaN

? ?NaN: 代表一切不是一個(gè)數(shù)字的任何值:Not a Number

? ? NaN參與任何運(yùn)算結(jié)果只能是NaN

2. parseFloat/parseInt(str):?將字符串str轉(zhuǎn)為number類(lèi)型,可去除結(jié)尾非數(shù)字字符,但不去掉開(kāi)頭的,因?yàn)楸磉_(dá)式從左到右依次執(zhí)行,所以可以在計(jì)算后直接加個(gè)單位(首選parseFloat)

? ? parseFloat可保留小數(shù)部分

? ? parseInt? 去掉小數(shù)部分(向下取整)? ? ?? //當(dāng)使用e作為計(jì)數(shù)符號(hào)時(shí),也會(huì)去掉e符號(hào)

? ? 何時(shí): 只要將字符串轉(zhuǎn)number,首選parseFloat(),Number()太局限

? ? ? ? ? 如果確實(shí)需要去掉小數(shù),才選parseInt

? ? ? ? ? 如果轉(zhuǎn)不了,也返回NaN

強(qiáng)調(diào): 參數(shù)應(yīng)該是string類(lèi)型,如果給定的值不是string類(lèi)型,則先執(zhí)行隱式轉(zhuǎn)換,轉(zhuǎn)為string類(lèi)型,再轉(zhuǎn)number

? ? ? Number/parseFloat/parseInt 都會(huì)自動(dòng)去掉空格

特殊:

parseFloat("true") ?->NaN

Number(true) ?->1

Number("") ?->0

Number(null) ->0

Number(undefined) ->NaN

其他類(lèi)型轉(zhuǎn)string: 2種:

1.var str=x.toString() ?將 x 轉(zhuǎn)為字符串類(lèi)型,并返回結(jié)果。x為數(shù)組時(shí),用,分隔

? ? x不能是null或undefined ———?不是萬(wàn)能

2.var str=String(x)?將x轉(zhuǎn)為字符串類(lèi)型——萬(wàn)能(首選)

? ? 其實(shí),隱式轉(zhuǎn)為string時(shí),都是程序自動(dòng)調(diào)用String

其他類(lèi)型轉(zhuǎn)Boolean類(lèi)型: 1種

Boolean(x)

? ? 規(guī)則: 只有5個(gè)值會(huì)被轉(zhuǎn)為false:0? ""? NaN? null? undefined

? ? ? ? ? 其余都轉(zhuǎn)為true

? ? 其實(shí), 隱式轉(zhuǎn)為bool時(shí),都是程序自動(dòng)調(diào)用Boolean(x)

_______________________________________________________________________________________________

運(yùn)算符和表達(dá)式

程序: 人的想法在計(jì)算機(jī)中的執(zhí)行

運(yùn)算符: 程序中模擬人的想法的特殊符號(hào)

表達(dá)式: 由數(shù)據(jù),變量和運(yùn)算符組成的完成一項(xiàng)單一任務(wù)的語(yǔ)句

算數(shù)運(yùn)算: + , - , * , / , %

%: 模運(yùn)算/取余數(shù): 被除數(shù)/除數(shù),不要商,要除不盡的余數(shù)部分(取零頭)

? 何時(shí): 1. 取余數(shù),可限制一個(gè)結(jié)果不超過(guò)指定的最大值

? ? ? ? 2. 判斷能否整除

? ? ? ? ?? 判斷偶數(shù): 能被2整除 n%2==0

? ? ? ? ?? 判斷奇數(shù): 不能被2整除 n%2!=0

隱式轉(zhuǎn)換

默認(rèn):都轉(zhuǎn)number

特殊:+運(yùn)算中,碰到字符串,都轉(zhuǎn)字符串,+運(yùn)算變?yōu)樽址唇樱ㄔ谕饷嫣滓粋€(gè)parseFloat)

? ? ?字符串左邊的變量會(huì)先進(jìn)行計(jì)算,遇到字符串全部轉(zhuǎn)為字符串(按優(yōu)先級(jí),從左到右)

? ? ?true在計(jì)算中為1,false為0;在字符串中為true/false

舍入誤差: 計(jì)算機(jī)中,也有計(jì)算不盡的數(shù)值(如0.3-0.1, 0.1*3),一般是浮點(diǎn)型

解決:

1. 按指定位數(shù)四舍五入: n.toFixed(2)

?? 今后幾乎所有顯示金錢(qián)數(shù)的地方都要toFixed(2)

2. 存儲(chǔ): 保存很長(zhǎng)位數(shù)的小數(shù): 0.39999999

關(guān)系運(yùn)算: 用兩個(gè)值做比較,做判斷(若試圖比較未定義的變量,會(huì)報(bào)錯(cuò))

包括:>? <? >=? <=? ==? !=

返回值: bool 類(lèi)型的true/fasle

隱式轉(zhuǎn)換:默認(rèn)都轉(zhuǎn)為 number

特殊:1. 兩個(gè)值都是字符串, 則不再轉(zhuǎn)數(shù)字,而是依次比較兩個(gè)字符串的每個(gè)字符unicode號(hào)

? ? ? ? 一個(gè)是字符串,一個(gè)是number,會(huì)進(jìn)行隱式轉(zhuǎn)換

? ?? 2. 判斷NaN:NaN和任何值做> < >= <= ==5種比較時(shí),永遠(yuǎn)false

? ? ? ? ? ? ? ? ?NaN和任何值做!=比較時(shí),永遠(yuǎn)是true

? ? ?? 問(wèn)題:NaN==NaN ?=>false 用普通的==無(wú)法判斷NaN

? ? ?? 解決:isNaN(num) 專(zhuān)門(mén)代替==,用來(lái)判斷num是不是NaN

? ? ?? 何時(shí): 只要判斷是不是NaN,都用isNaN(num)函數(shù)

? ? ?? 反用: 判斷一個(gè)值是不是數(shù)字:!isNaN(num),若是數(shù)字,則返回true

? ? ? ?注意:?空字符串、純數(shù)字的字符串返回false(不是NaN)

? ?? 3. 區(qū)分null和undefined

?????? 問(wèn)題:==比較時(shí),會(huì)自動(dòng)將undefined隱式轉(zhuǎn)為null

? ? ? ? ? ?? null==undefined ? ?=> null=null

?????? 解決:=== 全等: 類(lèi)型必須先相同,值再相等(!==,不全等同理)

? ? ? ? ? ? ?其實(shí)===就是不帶隱式轉(zhuǎn)換的==

總結(jié):

= 賦值,只有=可以改變變量中的值

== 自帶隱式轉(zhuǎn)換作比較

=== 不帶隱式轉(zhuǎn)換作比較

注意: 兩個(gè)對(duì)象作比較,不做任何轉(zhuǎn)換,直接比較兩個(gè)對(duì)象的地址值(判斷兩個(gè)變量是否引用同一個(gè)對(duì)象)

邏輯運(yùn)算: 將多個(gè)關(guān)系運(yùn)算,綜合起來(lái)得到最終結(jié)論

何時(shí): 只要根據(jù)多個(gè)條件,綜合得出最終結(jié)論時(shí)

包括:&&與(而且) ? ||或(要么) ? !非(沒(méi)有)

條件1&&條件2...:

? ? 要求所有條件都為true,結(jié)果為true

? ? 只要一個(gè)條件為false,結(jié)果為false

條件1||條件2...:

? ? 只要一個(gè)條件為true,結(jié)果為true

? ? 除非所有條件都為false,結(jié)果才為false

!條件: 顛倒 條件的 判斷結(jié)果

隱式轉(zhuǎn)換: 默認(rèn)將每個(gè)條件都轉(zhuǎn)為bool類(lèi)型

短路邏輯: 如果前一個(gè)條件已經(jīng)可以得出最終結(jié)論,則后續(xù)條件不再執(zhí)行

???? &&: 只有前一個(gè)條件為false時(shí),后續(xù)條件才不執(zhí)行

???? ||: 只要前一個(gè)條件為true時(shí),后續(xù)條件不再執(zhí)行

利用短路:①簡(jiǎn)單分支結(jié)構(gòu): 1個(gè)條件,1件事,只有滿(mǎn)足才做

? ? ? ? ? ? 如何: 條件&&(操作) ? (最簡(jiǎn)單的條件判斷語(yǔ)句,注意加())

? ? ? ? ? ②利用||選擇默認(rèn)值,如果給定的值有效,則使用給定的值,否則使用默認(rèn)值代替

? ? ? ? ? ? 如何:給定值||默認(rèn)值

? ? ? ? ? ? 無(wú)效:只要給定的值為0 "" NaN null undefined

注意:如果邏輯運(yùn)算最后執(zhí)行的是一個(gè)關(guān)系運(yùn)算,則返回bool

? ??如果邏輯運(yùn)算最后執(zhí)行的是一個(gè)值,則返回值,而不返回bool

_______________________________________________________________________________________________

位運(yùn)算: 了解

用二進(jìn)制簡(jiǎn)化普通十進(jìn)制的計(jì)算或操作

1. 左移/右移:

m<<n ?m左移n位,相當(dāng)于m*2的n次方

m>>n ?m右移n位,相當(dāng)于m/2的n次方

? ? 1<<3=1*23=8

? ? 2<<3=2*23=16

? ? 8>>3=8/23=1

2. 取整:

? ? n^0?? n|0?? n>>>0 ? ? ? ? 代替/簡(jiǎn)化Math.floor(n),用來(lái)把n向下取整(^ 按位異或)

3. 交換兩變量的值:

? ? var a=3,b=5;

? ?? 方法一: var t=b; b=a; a=t;

? ?? 方法二:a+=b; b=a-b; a-=b;

? ?? 方法三:a^=b; b^=a; a^=b;(二、三只能交換number類(lèi)型的數(shù)據(jù))

? ? ?方法四:?a=a+b; b=a-b; a=a-b;

賦值運(yùn)算:

?????擴(kuò)展賦值運(yùn)算: 對(duì)特殊賦值運(yùn)算的簡(jiǎn)化

? ? ?何時(shí):只要取出變量中的值,計(jì)算后,再存回原變量中

? ? ?a=a+b 將a的值+b的值,再存回a中

?????將b的值累加到a上:可簡(jiǎn)寫(xiě)為a+=b

? ? a=a+b ?-> ?a+=b;

??? a=a-b ?-> ?a-=b;

??? a=a*b ?-> ?a*=b;

??? a=a/b ?-> ?a/=b;

??? a=a%b ?-> ?a%=b;

? 更簡(jiǎn)化: 遞增遞減運(yùn)算: 如果每次累加1/累減1

??? a+=1? ->? a++

??? a-=1? ->? a--

前++和后++

1. 如果單獨(dú)使用, 前后都一樣

2. 如果參與到其他表達(dá)式中時(shí):

?? 相同:變量中的值一定都會(huì)變化,+1

?? 不同: 前++,使用返回+1后的 新值去運(yùn)算

? ? ? ? ?后++,使用返回+1前的 舊值去運(yùn)算

注意:所有表達(dá)式都從左到右依次執(zhí)行;先執(zhí)行的操作會(huì)影響后續(xù)操作

函數(shù)中: return i++; ? ?返回+1前的 舊值去運(yùn)算

注意: ++a并不總和a=a+1完全一樣,++運(yùn)算符不會(huì)進(jìn)行字符串連接操作,它會(huì)先將操作數(shù)轉(zhuǎn)換為數(shù)字并增1

比如: var a="1"; ? ?++a為2, ?a+1為字符串"11"

第三章*****************************************************************************************

一、函數(shù)類(lèi)型

定義: 內(nèi)存中封裝一項(xiàng)任務(wù)步驟清單的代碼段,再起一個(gè)名字

為什么:代碼重用、劃分功能

何時(shí): 只要一段代碼,可能被反復(fù)使用,就都要先封裝在函數(shù)中,再反復(fù)調(diào)用函數(shù)

如何: 分2步

1、聲明(兩種方法)

①function函數(shù)名(參數(shù)變量列表){ ? ? /*形參*/ /*function創(chuàng)建函數(shù)*/

? ? ?函數(shù)體(代碼段);

? ? ?return 返回值; ? ? ? ? ? ? ? ? /*返回值要接住,再輸出才能顯示*/

? ?}

② 函數(shù)名=function(參數(shù)變量列表){

? ? ?函數(shù)體(代碼段);

? ? ?return 返回值;

? ?}

參數(shù): 函數(shù)運(yùn)行時(shí),接收傳入函數(shù)的數(shù)據(jù)的變量。參數(shù)用法和普通變量完全一樣,只不過(guò)不用var聲明

參數(shù)列表: 多個(gè)參數(shù)間用逗號(hào)分隔(參數(shù)變量1,參數(shù)變量2...)

? 何時(shí):若一項(xiàng)任務(wù)必須某些數(shù)據(jù)才能正常執(zhí)行時(shí),就必須定義參數(shù)

? 作用:①提醒調(diào)用者正確使用函數(shù);②讓函數(shù)變得更靈活

? 返回值: 函數(shù)執(zhí)行的結(jié)果(由是否需要返回結(jié)果決定是否返回值)

? ? ? ?何時(shí): 如果函數(shù)的調(diào)用者需要獲得函數(shù)執(zhí)行結(jié)果

? ? ? ?如何返回: return 返回值;

? ? ? ?作用:①return可單獨(dú)使用: 退出函數(shù);②退出函數(shù)時(shí),順便返回結(jié)果

? ? ? ?如果沒(méi)有返回值的函數(shù),就會(huì)默認(rèn)返回undefined

2、調(diào)用: 讓引擎按照函數(shù)的步驟清單,執(zhí)行任務(wù)

var 返回值=函數(shù)名(參數(shù)值列表);

或 ?函數(shù)名(參數(shù)值列表); ? ? ? ? ? ? ? ? ? /*實(shí)參*/

何時(shí): 函數(shù)只有調(diào)用才執(zhí)行,不調(diào)用不執(zhí)行

參數(shù)值列表: 傳入函數(shù)的執(zhí)行時(shí)必須的數(shù)據(jù)列表

? 只要函數(shù)定義時(shí)規(guī)定了參數(shù)變量,調(diào)用時(shí)都要傳入?yún)?shù)值,且順序和個(gè)數(shù)保持一致

? 每個(gè)參數(shù)值之間用逗號(hào)分隔

_______________________________________________________________________________________________

作用域scope: 一個(gè)變量的可用范圍

為什么:避免不同范圍的變量之間互相污染(注意執(zhí)行順序)

包括: 2種:

1.全局作用域: window(保存著全局變量)

什么是: 程序中的任何位置都可以訪問(wèn)的范圍

? ? ?全局變量: 保存在全局作用域中,程序任何位置都可使用的變量

? ? ? 特點(diǎn):隨處可用,可反復(fù)使用

? ? ? 何時(shí): 如果一個(gè)變量需要反復(fù)使用,或跨函數(shù)隨處可用時(shí),只要不屬于任何函數(shù)的變量,都是全局的

? ? ? 用法:console.log(變量名);

2.函數(shù)作用域:(保存著局部變量)

什么是: 僅函數(shù)內(nèi)可用的范圍

? ? ?局部變量: 保存在函數(shù)作用域中,僅函數(shù)內(nèi)可用的變量

? ? ? 特點(diǎn):僅在函數(shù)內(nèi)可用,不可重用

? ? ? 何時(shí): 如果只限于當(dāng)前函數(shù)內(nèi)使用,函數(shù)外不可用時(shí)

? ? ? 如何:1.函數(shù)的參數(shù)變量

? ? ? ? ? ? 2.在函數(shù)內(nèi)用 var 聲明的變量

總結(jié): 優(yōu)先定義并使用局部變量

? ? ? 盡量少使用全局變量——避免被污染

變量的使用順序:優(yōu)先使用函數(shù)內(nèi)的局部變量,局部沒(méi)有才去全局找

聲明提前(hoist,提起):

什么是: 在開(kāi)始執(zhí)行程序前,引擎會(huì)將var聲明的變量和function聲明的函數(shù),提前到"當(dāng)前作用域"頂部集中優(yōu)先創(chuàng)建,再開(kāi)始執(zhí)行程序 ? ? ? ? ?? /*但是賦值留在原地?*/

筆試: 如果先使用,后聲明,一定在考聲明提前,就要將所有var和function提前到當(dāng)前作用域的頂部,先創(chuàng)建,再判斷程序的輸出

問(wèn)題: 破壞了程序默認(rèn)的執(zhí)行順序

解決: ①傳統(tǒng): 強(qiáng)烈建議將所有的聲明都集中在當(dāng)前作用域頂部

? ? ? ②ES6: let代替var聲明變量

? ? ? ? ? ? ? let禁止在聲明之前,提前使用該變量,強(qiáng)制將聲明集中在當(dāng)前作用域頂部創(chuàng)建

? ? ? ? ? ? ? 限制:不能用let反復(fù)創(chuàng)建相同名稱(chēng)的變量

函數(shù)聲明:

?var/let 函數(shù)名=function(參數(shù)變量列表){...}?? /*用這種方式創(chuàng)建的函數(shù)不會(huì)被聲明提前*/

? 本質(zhì): 函數(shù)名其實(shí)僅是一個(gè)普通的變量

? ? ? ? 函數(shù)其實(shí)是保存代碼段的引用類(lèi)型的對(duì)象

? ? ? ? 函數(shù)名通過(guò)函數(shù)對(duì)象的地址引用著函數(shù)對(duì)象

按值傳遞:

什么是:兩變量間賦值,或?qū)⒆兞總魅牒瘮?shù)作為參數(shù)時(shí),其實(shí)只是將原變量中的值復(fù)制一個(gè)副本給對(duì)方

結(jié)果:原始類(lèi)型的值會(huì) 修改新變量,不影響原變量的值

_______________________________________________________________________________________________

2. 全局函數(shù)(了解)

什么是: ES標(biāo)準(zhǔn)中規(guī)定的,瀏覽器已經(jīng)實(shí)現(xiàn)的,不需要任何對(duì)象(前綴.)就可直接調(diào)用的函數(shù)

比如: String()/Number()/Boolean()

? ? ? parseInt/parseFloat()

? ? ? isNaN()/encodeURI/decodeURI

反例(省略了前綴,屬于BOM): alert()/prompt()...

編碼解碼: 特指對(duì)地址欄中的url內(nèi)容進(jìn)行編碼和解碼

什么是編碼: 將url中多字節(jié)字符或保留字符編碼為單字節(jié)字符

? 為什么: url中不允許出現(xiàn)多字節(jié)字符以及和保留字符沖突的字符,否則會(huì)亂碼

? 何時(shí): 只要url中可能包含多字節(jié)字符以及和保留字沖突的字符時(shí),都要先編碼為單字節(jié)

什么是解碼:將編碼后的單字節(jié)字符串解碼回多字節(jié)原文

何時(shí):只要收到的是編碼后的字符串,都要先解碼再使用

如何:編碼: var code=encodeURI(url);

? ? ?解碼: var url=decodeURI(code);

問(wèn)題: 不能對(duì)保留字符編碼解碼,比如: ?: ?/

解決:編碼: var code=encodeURIComponent(url);

? ? ?解碼: var url=decodeURIComponent(code);

注意: 不會(huì)對(duì)ASCII字母和數(shù)字進(jìn)行編碼,也不會(huì)對(duì)ASCII標(biāo)點(diǎn)符號(hào)進(jìn)行編碼:? - _ . ! ~ * ' ( ) 。

其他字符(比如: ;/?:@&=+$,# 這些用于分隔URI組件的標(biāo)點(diǎn)符號(hào)),都是由一個(gè)或多個(gè)十六進(jìn)制的轉(zhuǎn)義序列替換的

eval函數(shù): 執(zhí)行一段字符串格式的js表達(dá)式

eval()的作用

把字符串參數(shù)解析成js代碼并運(yùn)行,并返回執(zhí)行的結(jié)果

eval的作用域:

作用域在它所有的范圍內(nèi)有效,但是IE8及以下指向window(全局)

解決方法:

functiona(){

? if(window.execScript){ ? ? ?? // 支持IE8及以下的版本

? ? window.execScript("var x=1");

? }else{?window.eval("var x=1"); }? ? ? ?//常用的瀏覽器都支持

? ? console.log(x);

? }

? a();

? console.log(x);

execScript與eval區(qū)別:

相同點(diǎn):

execScript與eval都可以接收一個(gè)字符串,若該字符串是表達(dá)式(expression),則執(zhí)行時(shí)將求得該表達(dá)式的值并返回;若該字符串是一個(gè)或多個(gè)語(yǔ)句(statements),則執(zhí)行時(shí)將運(yùn)行這些語(yǔ)句

不同點(diǎn):

① execScript是IE瀏覽器獨(dú)有;eval則是所有瀏覽器都支持

② execScript無(wú)論是在什么作用域(global/local)內(nèi)被調(diào)用,它所接受到的表達(dá)式(expression)或語(yǔ)句(statements)字符串都將在全局作用域內(nèi)執(zhí)行(global);eval則是在它被調(diào)用時(shí)所在的作用域內(nèi)運(yùn)行它所接受到的表達(dá)式(expression)或語(yǔ)句(statements)字符串

在不支持execScript函數(shù)的瀏覽器下實(shí)現(xiàn)在全局作用內(nèi)執(zhí)行字符串

function globalEval(data){

? if(data){

? ?(window.execScript || function(data){?window["eval"].call(window, data);?})(data);

? }

}

_______________________________________________________________________________________________

程序三大結(jié)構(gòu): 順序(判斷,不循環(huán)),分支和循環(huán)

1、分支結(jié)構(gòu)

什么是: 讓程序根據(jù)不同的條件執(zhí)行不同的操作

何時(shí): 只要讓程序根據(jù)不同的條件執(zhí)行不同的操作

如何:

1. 一個(gè)條件,一件事,滿(mǎn)足就執(zhí)行,不滿(mǎn)足就不執(zhí)行

? 如果操作簡(jiǎn)單: 短路:條件&&(操作1,操作2,操作3...)

? 如果操作復(fù)雜:?

if(條件){

? 操作1;

? 操作2;

? ...

}

2. 一個(gè)條件,二件事,二選一執(zhí)行:

? 如果僅兩個(gè)值二選一:

條件?值1:值2

? 如果操作簡(jiǎn)單: 三目運(yùn)算/三元運(yùn)算/條件運(yùn)算(三目運(yùn)算符的優(yōu)先級(jí)低于+)

條件?操作1:操作2 ? ? ? ? ?/*滿(mǎn)足條件執(zhí)行并返回操作1的值,不滿(mǎn)足則執(zhí)行并返回操作2的值*/

? 如果操作復(fù)雜:

if(條件){

? 操作1; ? ? ? ? ? ? ? ? ? ? ? /*滿(mǎn)足條件執(zhí)行*/

}else{

? 操作2; ? ? ? ? ? ? ? ? ? ? ?/*不滿(mǎn)足條件執(zhí)行*/

}

3. 多個(gè)條件,多件事,多選一執(zhí)行(嵌套)

如果多個(gè)值,多選一: 三目運(yùn)算(一般對(duì)齊)

? ? 條件1?值1:

? ? 條件2?值2:

? ? ? ...?... :

? ? 默認(rèn)值 ? ? ? ? ? ? ? ? ? ? ? ? ? /*強(qiáng)調(diào): 默認(rèn)值不能省略*/

如果操作簡(jiǎn)單: 三目運(yùn)算

? ? 條件1?操作1:

? ? 條件2?操作2:

? ? ? ...?... :

? ? 默認(rèn)操作? ? ? ? ? ? ? ? ? ? ?? /*強(qiáng)調(diào):默認(rèn)操作不能省略*/

如果操作復(fù)雜:if...else if結(jié)構(gòu)

if(條件1){

? ? 操作1 ? ? ? ? ? ? ? ? ? ?? /*如果當(dāng)前條件滿(mǎn)足,則不再向后執(zhí)行*/

}else if(條件2){ ? ? ? ? ? ? ? ?/*如果進(jìn)入條件2,暗示條件1不滿(mǎn)足*/

? ? 操作2

}else if(...){

? ? ...

}else{ ? ? ? ? ? ? ? ? ? ? /*如果沒(méi)有默認(rèn)操作,則else可省略,即什么也不做*/

? ? 默認(rèn)操作

}

簡(jiǎn)寫(xiě):如果if(...)一句話 ? ?else(...)一句話 ? ?后面只有一句話,可省略{}(if、else仍然要寫(xiě))

特殊: 如果所有條件都是等于比較,可簡(jiǎn)寫(xiě)為

switch(表達(dá)式){ ? ? ? ? /*先計(jì)算表達(dá)式的值,用表達(dá)式的值和每個(gè)case后的值做"全等==="比較*/

? case 值1: ? ? ? ? ? ? /*如果表達(dá)式的值全等于case后的值1*/

? 操作1; ? ? ? ? ? ? ? /*就執(zhí)行操作1*/

? case 值2:

? 操作2;

? ...

? default: ? ? ? ? ? ? ?/*如果所有case的值都不等于表達(dá)式的值*/

? 默認(rèn)操作; ? ? ? ? ?? /*則執(zhí)行默認(rèn)操作*/

} ? ? ? ? ? ? ? ? ? ? ? /*強(qiáng)調(diào): 最后一個(gè)default可省略*/

問(wèn)題: 只要前一個(gè)case滿(mǎn)足條件,則后續(xù)所有case都被執(zhí)行(而不會(huì)再判斷)

原因: switch是入口

解決: break;可終止當(dāng)前結(jié)構(gòu)繼續(xù)向后執(zhí)行,并退出switch

如何:每個(gè)case之間,都要加break;

判斷一個(gè)值是否為空可以直接用if(值){ },不加等號(hào),判斷是否為true

第四章*****************************************************************************************

2、循環(huán)loop

什么是: 讓程序反復(fù)執(zhí)行相同的代碼段

何時(shí): 只要讓程序反復(fù)執(zhí)行同一段代碼

如何: 三要素:

? 1. 循環(huán)條件: 讓循環(huán)可以繼續(xù)執(zhí)行的條件(只要條件滿(mǎn)足就反復(fù)執(zhí)行循環(huán),直到不滿(mǎn)足時(shí)退出循環(huán))

? 2. 循環(huán)變量: 在循環(huán)條件中用作比較和判斷的變量

????? 從幾開(kāi)始, 每次遞增/遞減幾,到幾結(jié)束

? 3. 循環(huán)體: 循環(huán)要反復(fù)執(zhí)行的代碼段

????? 幾乎都要修改循環(huán)變量,直到不滿(mǎn)足條件;若循環(huán)條件始終為true,則循環(huán)永遠(yuǎn)無(wú)法退出---死循環(huán)

包括: 3種:

while:

var 循環(huán)變量=初始值; ? ? ? ? ? ? /*聲明并初始化循環(huán)變量*/

while(循環(huán)條件){ ? ? ? ? ? ? ? ? ?/*當(dāng)滿(mǎn)足循環(huán)條件時(shí)*/

? 循環(huán)體;

? 修改循環(huán)變量;

}

? 何時(shí): 必須先滿(mǎn)足循環(huán)條件,才能執(zhí)行循環(huán)體時(shí)

do...while:

var 循環(huán)變量=初始值;

do{

? 循環(huán)體;

? 修改循環(huán)變量;

}while(循環(huán)條件); ? ? ? ? ? ? ? ?/*當(dāng)滿(mǎn)足循環(huán)條件時(shí)*/

? 何時(shí): 即使條件不滿(mǎn)足,也至少可以執(zhí)行一次時(shí)(先執(zhí)行,再判斷)

while VS do...while

如果第一次循環(huán)都滿(mǎn)足,兩者的輸出是完全一樣的

? while: 先驗(yàn)證條件后執(zhí)行

? do...while: 先執(zhí)行一次,再驗(yàn)證條件

如果第一次條件不滿(mǎn)足,則while是一次都不執(zhí)行,do while至少執(zhí)行一次

for:

for(var 循環(huán)變量=初始值;循環(huán)條件;修改循環(huán)變量){

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? //循環(huán)條件中有,時(shí)(逗號(hào)表達(dá)式),以最后一個(gè)為準(zhǔn)

? 循環(huán)體; ? ? ? ? ? ? ? ? ? ? ? ? ? ?/*先執(zhí)行循環(huán)體,再修改循環(huán)變量*/

}

for循環(huán)和while循環(huán)的原理是完全一樣的(就是while循環(huán)的簡(jiǎn)化)

for vs while: 如果循環(huán)變量的變化有規(guī)律: 首先f(wàn)or

? ? ? ? ? ? ? 如果循環(huán)變量的變化沒(méi)有規(guī)律: 首先while

強(qiáng)調(diào):JavaScript中沒(méi)有塊級(jí)作用域

放在if/else if/else/for/while中的變量,出了塊(結(jié)構(gòu)),依然可用

c、c++、java等所有{}都認(rèn)為是塊級(jí)作用域,塊中的變量出了塊,不能使用

解決: 讓循環(huán)中的變量不要泄露到循環(huán)外

? ? ? 用let代替var: let聲明的變量?jī)H能在{}內(nèi)使用

簡(jiǎn)寫(xiě):var 可同時(shí)聲明并初始化多個(gè)變量,用,分隔

? ? ? 如果for循環(huán)下只有一句語(yǔ)句,可省略{}—————不建議,容易出歧義

? ? ? 如果for循環(huán)體中只有一句話,且很簡(jiǎn)單時(shí),for循環(huán)的修改循環(huán)變量中可先后執(zhí)行多個(gè)短小的操作,每個(gè)操作之間用逗號(hào)(,)分隔,省略循環(huán)體并加分號(hào)(;)結(jié)束——但不能改變?cè)瓉?lái)的執(zhí)行順序

_______________________________________________________________________________________________

break(中斷)?VS?continue(跳過(guò)):

break: 中斷并退出當(dāng)前循環(huán)

?? 何時(shí): 當(dāng)判斷條件非常復(fù)雜時(shí),就可用死循環(huán)+break的方式靈活控制循環(huán)退出——降低循環(huán)編寫(xiě)的難度

continue: 跳過(guò)本輪循環(huán),繼續(xù)執(zhí)行下一輪

?? 只要顛倒判斷條件,就可避免使用continue

強(qiáng)調(diào):break不能參與到任何簡(jiǎn)寫(xiě)中,必須獨(dú)立一句

嵌套循環(huán): 循環(huán)內(nèi),又執(zhí)行了另一個(gè)循環(huán)

步驟: 1. 截取片段找規(guī)律

? ? ? 2. 用外層循環(huán)反復(fù)調(diào)用規(guī)律的公式

_______________________________________________________________________________________________

二、數(shù)組類(lèi)型

什么是: 內(nèi)存中連續(xù)存儲(chǔ)多個(gè)數(shù)據(jù)的一塊存儲(chǔ)空間,再起一個(gè)名字

為什么: 便于維護(hù)和查找

? ? 程序=數(shù)據(jù)結(jié)構(gòu)+算法

??? 數(shù)據(jù)結(jié)構(gòu): 數(shù)據(jù)在內(nèi)存中的存儲(chǔ)結(jié)構(gòu)

??? 算法: 解決問(wèn)題的步驟

??? 好的數(shù)據(jù)結(jié)構(gòu)可極大提高程序的執(zhí)行效率

何時(shí): 今后只要保存多個(gè)同一類(lèi)型的數(shù)據(jù)時(shí),都必須用數(shù)組

如何: 3件事(創(chuàng)建、賦值、取值)

創(chuàng)建: 3種:

1.創(chuàng)建空數(shù)組2種:

?? 何時(shí): 創(chuàng)建數(shù)組時(shí),暫時(shí)不知道數(shù)組內(nèi)容

? ? ? ? var arr=[]; ? ? ? ? ? ? ? ? /*[]創(chuàng)建數(shù)組*/

? ? ? ?var arr=new Array();

2. 創(chuàng)建數(shù)組同時(shí)初始化數(shù)組內(nèi)容:

?? 何時(shí): 創(chuàng)建數(shù)組時(shí)已知數(shù)組的內(nèi)容

???????var arr=[值1,值2,...];

? ? ? ?var arr=new Array(值1,值2,...);

3. 創(chuàng)建n個(gè)空元素的數(shù)組(只有一種):

?? 何時(shí): 創(chuàng)建數(shù)組時(shí),只知道數(shù)組元素個(gè)數(shù),暫時(shí)不知道數(shù)據(jù)的內(nèi)容

? ? ?? var arr=new Array(n);?? //()里若只有一個(gè)數(shù)字,創(chuàng)建空數(shù)組,否則設(shè)置其為數(shù)組的內(nèi)容

訪問(wèn):

? 元素:數(shù)據(jù)中每個(gè)數(shù)據(jù),都稱(chēng)為元素

? 下標(biāo)(index): 每個(gè)元素的存儲(chǔ)位置的序號(hào)。默認(rèn)都是數(shù)字,從0開(kāi)始,連續(xù)不重復(fù)

賦值: 將數(shù)據(jù)保存到數(shù)組的某個(gè)元素中

? ? ?arr[i]=新值; ? ? ? ? ? ? ? ?/*i:下標(biāo)index*/

取值: 數(shù)組中每個(gè)元素的用法和普通的變量完全一樣

? ? ? 數(shù)組也稱(chēng)為一組變量的集合,起一個(gè)統(tǒng)一的變量名

? ? ?arr[i]

console.log(arr[i]); ? ? ? /*輸出數(shù)組下標(biāo)為i的元素*/

console.dir(arr); ? ? ? ? /*查看內(nèi)存中arr的結(jié)構(gòu)和內(nèi)容*/

dir問(wèn)題:不會(huì)立刻輸出結(jié)果

? 只有手動(dòng)點(diǎn)擊三角時(shí),才動(dòng)態(tài)查找內(nèi)存中對(duì)象的最終結(jié)構(gòu),會(huì)打亂程序的輸出結(jié)果順序

解決: 如果想查看數(shù)組中間狀態(tài)的內(nèi)容:

console.log(String(arr)); ? ? ? ? /*對(duì)數(shù)組拍照*/

js的數(shù)組三個(gè)不限制:

? 1. 不限制元素的數(shù)據(jù)類(lèi)型

? 2. 不限制下標(biāo)越界:

? ?? 賦值時(shí)越界: 不會(huì)報(bào)錯(cuò)!在指定的新位置自動(dòng)創(chuàng)建新元素保存新值(添加后,數(shù)組的元素下標(biāo)不連續(xù)則稱(chēng)為稀疏數(shù)組)

? ?? 取值時(shí)越界: 不會(huì)報(bào)錯(cuò)! 僅返回undefined

? 3. 不限制元素個(gè)數(shù):?在任何時(shí)候,在任何位置添加新元素

.length屬性: 記錄數(shù)組中理論上的元素個(gè)數(shù)(不一定和實(shí)際元素個(gè)數(shù)相符)

特點(diǎn):.length 永遠(yuǎn)等于最后一個(gè)數(shù)字下標(biāo)+1(自動(dòng)維護(hù),不需要手動(dòng)修改)

? ? ? .length 永遠(yuǎn)指向最后一個(gè)元素的下一個(gè)新位置

.length可修改數(shù)組大小——縮容(如使arr.length=5,可獲取數(shù)組的前5個(gè)值)

用法注意:arr.length ? ? ? ? ? ? ? ? ?/*.length屬性屬于數(shù)組,不能脫離數(shù)組單獨(dú)使用*/

固定套路: 1. 獲取數(shù)組最后一個(gè)元素:arr[arr.length-1]

? ? ? ? ? 2. 獲得倒數(shù)第n個(gè)元素:arr[arr.length-n]

? ? ? ? ? 3. 末尾追加一個(gè)新元素:arr[arr.length]=新元素

? ? ? ? ? 4. 刪除數(shù)組最后一個(gè)元素(改小length) :arr.length-=1;

? ? ? ? ? 5. 刪除數(shù)組末尾倒數(shù)n個(gè)元素(改小length):arr.length-=n;

_______________________________________________________________________________________________

數(shù)組是引用類(lèi)型的對(duì)象

原始類(lèi)型的值: 修改新變量,不影響原變量—————按值傳遞

原始類(lèi)型:基本數(shù)據(jù)類(lèi)型:值直接保存在變量本地的數(shù)據(jù)類(lèi)型,Number/String/Boolean/Undefined/null

? ? 原因:將原變量中的實(shí)際值復(fù)制一個(gè)副本給對(duì)方

引用類(lèi)型的對(duì)象: 用新變量修改對(duì)象,等效于直接修改原對(duì)象。新舊變量都受影響(arr2=arr1)

引用類(lèi)型:值無(wú)法直接保存在變量本地的復(fù)雜數(shù)據(jù)類(lèi)型

? ? 原因:僅將原變量中的地址值復(fù)制給新變量,導(dǎo)致兩個(gè)對(duì)象共用同一個(gè)對(duì)象

? ? ? ? ? 新舊變量使用相同的地址值,引用同一個(gè)對(duì)象(地址值相同)

遍歷:

什么是: 依次對(duì)數(shù)組中每個(gè)元素執(zhí)行相同的操作

何時(shí): 只要對(duì)數(shù)組中每個(gè)元素執(zhí)行相同的操作時(shí)

如何:循環(huán)

for(var i=0;i<arr.length;i++){

? ? arr[i]? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/*當(dāng)前元素*/

}

var i=0,len=arr.length; i<len; i++? ? ?//可使用緩存代替arr.length,減少延遲,提高性能

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容