變量
- 聲明變量
var count;
var amount,level;
var count = 0, amount = 100;
-
命名變量
- 區(qū)分大小寫的語言
- 第一個字符是字母或下劃線_,數(shù)字不能作為第一個字符
- 字符必須是字母忆肾,數(shù)字或者下滑線
- 變量名不得為保留字
需要聲明并初始化變量,可以為變量分配null值
聲明了變量但是不為其賦值。該值為undefined傲隶。
var current; consoloe.log(current) //underfined
- null與0的行為類似,而underfined行為與NaN類似,null與undefined值他們相等声滥。
var current; //undefined var a = null; console.log( current == a); //true console.log( current === a) //false
- 可以不使用var關(guān)鍵字聲明一個變量,為隱式聲明
noString = 'abc';
- 不能使用從未聲明過的變量
注:underfined 是聲明未定義侦香,is not defined 是使用了從未聲明過的變量var area = length * width; //width is not defined
數(shù)據(jù)類型
js中有5種基本數(shù)據(jù)類型:undefined落塑,Null,Boolean,Number,String罐韩。還有一個復(fù)雜的數(shù)據(jù)類型 object
typeof操作符
undefined -- 這個值未定義
boolean -- 布爾值
string -- 字符串
number -- 數(shù)字
object -- 對象或者null
function -- 函數(shù)
是一個操作符而不是一個函數(shù)
var message = 'some';
console.log(typeof message);
console.log(typeof(message));
兩者方式都可以
undefined 類型
使用var聲明變量但是未對其加以初始化憾赁,就為underfined
var message;
console.log(message); //undefined
console.log(typeof message); //undefined
var message;
console.log(typeof message); //undefined
console.log(typeof a); //undefined
console.log(a); // a is not defined
typeof 給未初始化的變量和未聲明的變量都返回了undefined的值
null類型
var car = null;
console.log(car); // null
console.log( typeof car); //object
undefined值是派生自null值,只要保存對象散吵,應(yīng)該明確讓變量保存null值龙考,體現(xiàn)null作為空指針,也有助于區(qū)分null和undefined的區(qū)別
console.log(null == undefined); true
Boolean類型
var found = true;
var lost = false;
//區(qū)分大小寫矾睦,True晦款,F(xiàn)alse只是一個標(biāo)識符
其他數(shù)據(jù)轉(zhuǎn)為boolean值
數(shù)據(jù)類型 | true | false |
---|---|---|
string | 任何非空的字符串 | ""(空字符串) |
number | 任何非零數(shù)字值 | 0和NaN |
object | 任何對象 | null |
undefined | 不適用 | undefined |
var message = 'hello world';
if (message){ //參照上表對字符串進行布爾值的轉(zhuǎn)化
alert('true')
}
Number類型
- 最基本的字面格式是十進制 var num = 55;
- 還可以通過八進制或十六進制表示,八進制必須以0為開頭枚冗,數(shù)字序列(0~7)
- var num1 = 070; 有效56
- var num2 = 079; 無效解析為79
- 八進制在嚴(yán)格模式是拋出錯誤
- 十六進制前兩位必須是0X缓溅,后跟數(shù)字(09及AF)。A~F可以大寫可以小寫赁温。
- var num1 = 0xA; 10;
在算數(shù)計算中坛怪,所有的八進制和十六進制都最終轉(zhuǎn)化成十進制淤齐。
浮點數(shù)
- 幾種形式
var floatnum1 = 1.1;
var floatnum2 = .1; //有效,但是不推薦
- 浮點數(shù)值的內(nèi)存空間是整數(shù)數(shù)值的兩倍袜匿。js會把浮點數(shù)值不失時機的轉(zhuǎn)化為整數(shù)值更啄。
- e的用法 小數(shù)點后有6個零以上的浮點數(shù)值轉(zhuǎn)化為e的表示法
var floatnum1 = 3.125e7; //等于31250000
var floatnum2 = 3e-7; // 等于0.0000003
var num = 3.12e7;
console.log(num); // 3125000
var num2 = 0.000000000008;
console.log(num2) //8e-12
- 浮點數(shù)值的最高精度是17位小數(shù)。0.1加0.2結(jié)果是0.30000000000000004沉帮。
console.log(0.300000.toFixed(1)) // 0.3
var s = 0.300000.toFixed(1);
console.log( typeof s); // string
數(shù)字的范圍
- 由于內(nèi)存的問題锈死,js能夠保存的最小數(shù)字是5e-324;最大的數(shù)字是1.7976931348623157e308穆壕;如果超出的話待牵,則換成Infinity(-Infinity)。如果超出的話是不能參與計算喇勋∮Ц茫可以用isFinite()判斷數(shù)字是否位于最小和最大的數(shù)值之間
var result = 900;
console.log(isFinite(result)) // true
var result2 = Number.MAX_VALUE + Number.MIN_VALUE; //表達(dá)最大和最小值
console.log(isFinite(result2)); // true
var result3 = Number.MAX_VALUE + Number.MAX_VALUE; //表達(dá)最大和最小值
console.log(isFinite(result3)) //false
console.log(isFinite(result2));
if ( Number.MAX_VALUE > Number.POSITIVE_INFINITY){
console.log('大于')
}else{
console.log('小于') // Number.MAX_VALUE 并沒有達(dá)到無窮大
}
var num = Number.MAX_VALUE + Number.MAX_VALUE;
if ( num > Number.POSITIVE_INFINITY){
console.log('大于')
}else{
console.log('小于') // 無窮大與無窮大并不能做比較
}
NaN
- 非數(shù)值的數(shù)值。在其他的語言中任何數(shù)除以0川背,報錯贰拿,js中返回NaN。
- 任何涉及到NaN的操作返回都是NaN
- NaN與任何數(shù)都不相等熄云,包括NaN本身膨更。
alert(NaN == NaN) // false
- isNaN()接收到一個值,會嘗試將這個值轉(zhuǎn)化成數(shù)值缴允。任何不能被轉(zhuǎn)換為數(shù)字的值會返回ture荚守;
console.log(iaNaN(NaN)); // true
console.log(isNaN('blue')); // true
console.log(isNaN('1.32元')) // true 內(nèi)部通過valueOf()函數(shù)轉(zhuǎn)化
console.log(isNaN(10)) //false
console.log(isNaN(ture)) // false
- isNaN();會首先調(diào)用valueOf()方法,確定返回值是否可以轉(zhuǎn)換练般,如果不能矗漾,基于這個返回值調(diào)用toString(),在測試返回值。
數(shù)值的轉(zhuǎn)換
有3個函數(shù)運用于數(shù)值的轉(zhuǎn)換:Number(),parseInt(),parseFloat();Number()可以運用于任何數(shù)據(jù)的類型薄料,parseInt(),parseFloat()專門運用于將字符串變?yōu)閿?shù)值敞贡。
Number();
- 可以運用于任何的數(shù)據(jù)類型
- 如果是Boolean值,true轉(zhuǎn)化為1摄职,false值轉(zhuǎn)為0誊役;
- 數(shù)字值只是簡單的傳入
- null值,返回的是0
var a = null;
console.log(Number(a)) // 0
- undefined,返回為NaN谷市。
var a ;
console.log(Number(a)) // NaN
- 字符串的話
var a = '123';
console.log(Number(a)) // 123
var a = '0123214';
console.log(Number(a)) // 123214 去掉開頭的0
var a = '1.234';
console.log(Number(a)) // 1.234
var a = '0xf';
console.log(Number(a)) // 15十六進制的轉(zhuǎn)化為十進制
var a = '070';
console.log(Number(a)) // 70在這里八進制不能轉(zhuǎn)化為十進制
var a = '';
console.log(Number(a)) // 0
var a = ' 80';
console.log(Number(a)) // 80前面的空的字符串忽略
var a = '1.23元';
console.log(Number(a)) // NaN
// 除此之外的任何形式都是NaN
- 如果是對象势木,則先調(diào)用valueOf(),然后再調(diào)用toString()。后再按照前面的方法返回字符串的值歌懒;
parseInt()
- 忽略字符串前面的空格,一直找到第一個非空格的字符溯壶。如果第一個字符不是數(shù)字或者負(fù)號的話則返回NaN及皂。然后解析后面的字符甫男,直到遇到了一個非數(shù)字的字符
var a = 'fasd12314';
console.log(parseInt(a)) // NaN
var a = '';
console.log(parseInt(a)) // NaN
var a = '1234blue';
console.log(parseInt(a)) // 1234
var a = '123.89';
console.log(parseInt(a)) // 123 . 是一個非數(shù)字的字符
var a = '0000231';
console.log(parseInt(a)) // 231
- 在ES3中可以識別八進制的數(shù)值進行轉(zhuǎn)換為十進制,但是在ES5中不能識別验烧,因此可以寫成parseInt('a',8)或者parseInt('a',16);
console.log(parseInt('0xaf',16)) // 175
console.log(parseInt('af',16)) // 175
console.log(parseInt('af')) // NaN
console.log(parseInt('070',8)) // 56
parseFloat()
- 與parseInt()類似板驳,但是遇見一個無效的數(shù)字字符為止。第一個小數(shù)點有效碍拆,第二個小數(shù)點無效
var a = 22.34.5
console.log(parseFloat(a)) // 22.34
- 十六進制的字符串始終會被轉(zhuǎn)為0
var a = '0xa';
console.log(parseFloat(a)) // 0
- 只解析十進制的值若治,沒有第二個參數(shù)指定參數(shù)的用法
var a = '0xa';
console.log(parseFloat(a,16)); // 0
- 如果字符串是一個可以解析為整數(shù)的書(沒有小數(shù),或者小數(shù)點后面都是零)感混,parseFloat()會返回一個整數(shù)端幼。
console.log(parseFloat('1234ble')) // 1234
console.log(parseFloat('0xa')) // 0
console.log(parseFloat('22.5')) // 22.5
console.log(parseFloat('22.34.5')) // 22.5
console.log(parseFloat('009765.8')) // 9765.8
console.log(parseFloat('3.125e7')) // 31250000
toFixed()
var s = 123.090;
console.log(s.toFixed(1)); // 123.1 四舍五入
var s = 123.000;
console.log(s.toFixed(1)); // 123.0
console.log(typeof s.toFixed(1)) //string
String類型
- 字符的字面量 p33
字面量 | 含義 |
---|---|
\n | 換行 |
\t | 制表 |
\b | 空格 |
' | 單引號' |
" | 雙引號" |
轉(zhuǎn)義字符只表示一個字符
var text = "this is this letter sigma: \u03a3."
console.log(text.length); // 29
-
字符串的特點
- 字符串是不可變的,要改變變量保存的字符串弧满,首先要銷毀原來的字符串婆跑,然后再用一個新值的字符串填充變量
var lang = 'java'; lang = lang + 'script';
轉(zhuǎn)化為字符串
toString()方法
- 返回相應(yīng)值的字符串表現(xiàn)。數(shù)值庭呜,布爾值滑进,對象和字符串都有toString方法,但是null和undefined沒有
var num = 10;
console.log(num.toString()); // 10
var on = true;
console.log(on.toString()); // true
var boo = false;
console.log(boo.toString()) // false
var now = new Date();
console.log(now.toString()); // Tue Jul 04 2017 22:02:45 GMT+0800
var arr = [1,2,3,4];
console.log(arr.toString()); // 1,2,3,4
var a;
console.log(a.toString()); // 報錯
var b = null;
console.log(b.toString()) // 報錯
- 傳遞參數(shù)募谎,輸出數(shù)值的基數(shù)扶关,可以輸出以二進制,八進制数冬,十六進制节槐,以及其他任意的有效進制格式的字符串。
var 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'
String()能將任意的類型轉(zhuǎn)為字符串
- 如果有toString()方法吉执,調(diào)用該方法后返回相對應(yīng)的結(jié)果
- 如果是null疯淫,則返回null
- 如果是undefined,則返回undefined戳玫。
var value1 = 10;
console.log(String(value1)) // '10'
var value2 = true;
console.log(String(value2)) // 'true'
var value3 = null;
console.log(String(value3)) // 'null'
var value4;
console.log(String(value4)) // 'undefined'
Object 類型
- 對象是一組數(shù)據(jù)和功能的集合熙掺。對象可以通過執(zhí)行new創(chuàng)建
var o = new Object();
- 在js中創(chuàng)建實例并沒有什么用處,Object類型是所有的實例基礎(chǔ)咕宿。Object類型所具有的任何屬性和方法也同樣存在于更具體的對象中币绩。
所有的Object類型都有下面的屬性和方法- constructor : 保存著用于創(chuàng)建當(dāng)前對象的函數(shù)
- hasOwnProperty : 用于檢查給定的屬性在當(dāng)前的對象實例中(而不是在實例原型)是否存在,如: o.hasOwnProperty('name');
- isPrototypeOf(Object) : 用于檢查傳入的對象是否是傳入對象的原型中
- propertyIsEnumerable(name) : 檢查給定的屬性是否能夠使用for-in語句
- toLocalString() : 返回對象的字符串表示府阀,該字符串與執(zhí)行環(huán)境的地區(qū)對應(yīng)
- toString() : 返回對象的字符串表示
- valueOf() : 返回對象的字符串缆镣,數(shù)值,布爾值表示试浙,通常與toString()方法返回值相同
操作符
一元操作符:只能操作一個值的操作符
- 遞增和遞減操作符(++,--)
前置性和后置型
前置遞增和遞減董瞻,變量的值都是在語句被求值以前改變的。
var age = 27;
console.log(++age); // 28
var age2 = 27;
console.log(age++) // 27
var num1 = 2;
var num2 = 20;
var num3 = -- num1 + num2; //21
var num4 = num1 + num2; // 21
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 22
var num4 = num1 + num2; // 21
這四個操作符對任何值都適用
var s = '2';
console.log(++s) //3
console.log(typeof s) // number
var s2 = 'z';
console.log(++s2) // NaN
//字符串將值轉(zhuǎn)換為數(shù)字再進行操作
var boo = false;
console.log(++boo) // 1
var f = 1.1;
console.log(--f) // 0.1000000000000009
var o = {
valueOf : function(){
return -1;
}
}
console.log(--0) // -2
//隱式類型轉(zhuǎn)換,上面的幾種類型都被轉(zhuǎn)換成了number類型
一元加和減操作符
“+”钠糊,“-”挟秤,該操作符像Number()對這個值進行轉(zhuǎn)換,而對象則會先調(diào)用他們的valueOf(),toString(),在求值抄伍。
```js
var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1
var o = {
valueOf : function(){
return -1;
}
}
-s1 // -1
-s2 // -1.1
-s3 // NaN
-b // 0
-f // -1.1
-o // 1
- 主要運用于基本的算術(shù)運算艘刚,隱式轉(zhuǎn)化數(shù)據(jù)的類型
布爾操作符
- 邏輯非(!),非布爾值的類型先按照Boolean()函數(shù)轉(zhuǎn)換,后再取反截珍。
邏輯與(&&)
邏輯與操作不一定返回布爾值(同時為true時才返回true)攀甚,遵循以下操作
- 第一個操作數(shù)是對象,則返回第二個操作數(shù)
- 第二個操作數(shù)是對象岗喉,則只有在第一個操作數(shù)的求值結(jié)果為true才返回該對象
- 兩個操作數(shù)都是對象秋度,則返回第二個操作數(shù)
- 如果有一個操作數(shù)是null,則返回null
- 如果有一個操作數(shù)是undefined沈堡,則返回undefined
- 如果有一個操作數(shù)是NaN静陈,則返回NaN。
var found = 'yes';
var s = 'not';
console.log((found && s)) // not
var found = true
var s = [1,2,3];
console.log((found&&s)) // [1,2,3]
console.log('fasd'&&NaN) //NaN
如果第一個數(shù)值是false诞丽,則只能返回false鲸拥,短路操作
var found = true;
console.log(found&&someundefined) // 報錯
var found = false;
console.log((found&&someundefined)) // false
邏輯或(||)
邏輯或也不一定返回布爾值(有一個為true則為true),但是有一個不是布爾值僧免,也不一定返回布爾值刑赶。
var s = 'jfs';
console.log((s||'abc')) // jfs 如果第一個是對象,則返回對象
console.log((false||NaN)) // NaN 如果第一求值是false懂衩,則返回第二個
console.log('adsf'||'123') // 如果都是對象則返回第一個
console.log(null||null) // null
console.log(NaN||NaN) //NaN
console.log(undefined|| undefined) // undefined
短路操作符撞叨,第一個操作符為true,就不對第二個數(shù)求值,利用這種方法浊洞,避免為變量賦值null或undefined
var found = true;
var result = (found || someundefined) // true
乘性操作符
定義了3個乘性操作符:乘法牵敷,除法,求模法希。在操作數(shù)為非數(shù)值的情況下后臺會使用Number()轉(zhuǎn)化枷餐,是隱式類型轉(zhuǎn)換。
- 乘法
- 乘積超過了js數(shù)值的范圍苫亦,返回Infinity或者-Infinity毛肋;
- 一個數(shù)為NaN,結(jié)果為NaN屋剑;
- Infinity與0相乘润匙,結(jié)果為NaN;
- Infinity與非0相乘唉匾,結(jié)果為Infinity或者-Infinity孕讳;
- Infinity與Infinity相乘,結(jié)果為Infinity;
- 如果一個數(shù)不是數(shù)值厂财,后臺調(diào)用Number(),后按照上面的方法
除法
- 商超過了js數(shù)值的范圍油啤,返回Infinity或者-Infinity;
- 一個數(shù)為NaN蟀苛,結(jié)果為NaN;
- Infinity除以Infinity逮诲,結(jié)果為NaN帜平;
- 零被零相除,結(jié)果是NaN
- Infinity與0相乘梅鹦,結(jié)果為NaN裆甩;
- 非零的有限數(shù)被零除,結(jié)果是Infinity或者-Infinity
- Infinity被任何非零的數(shù)值相除齐唆,結(jié)果是Infinity或者-Infinity嗤栓,符號取決于操作數(shù)的復(fù)合
- 如果一個數(shù)不是數(shù)值,后臺調(diào)用Number(),后按照上面的方法
加法
- 如果一個操作數(shù)是NaN,則結(jié)果是NaN
- Infinity加Infinity箍邮,結(jié)果是Infinity茉帅;
- -Infinity加-Infinity,結(jié)果是-Infinity锭弊;
- Infinity加-Infinity堪澎,結(jié)果是NaN;
- +0加+0味滞,結(jié)果是+0樱蛤;
- -0加-0,結(jié)果是-0剑鞍;
- +0加-0昨凡,結(jié)果是+0;
不過一個操作數(shù)是字符串蚁署,那么就應(yīng)該如下規(guī)則 - 兩個都是字符串便脊,則是兩個字符串拼接
- 一個是字符串,則將另一個轉(zhuǎn)換為字符串形用,作為字符串的拼接
- 一個是對象就轧,數(shù)值,布爾值田度,則調(diào)用他們的toString()方法取得字符串妒御,后拼接
var a ;
var b = null;
console.log(a+b); // NaN
var num1 = 5;
var num2 = 10;
var message = 'this sum is' + num1 + num2 // this sum is 510
var message2 = 'this sum is' + (num1+num2)//this sum is 15
減法
- 兩個都是數(shù)值,常規(guī)數(shù)值運算
- 一個操作數(shù)是NaN镇饺,則結(jié)果是NaN
- Infinity減Infinity乎莉,結(jié)果是NaN
- -Infinity減-Infinity,結(jié)果是NaN
- Infinity減-Infinity,結(jié)果是Infinity
- -Infinity減Infinity惋啃,結(jié)果是-Infinity
- +0減+0哼鬓,結(jié)果是+0;
- +0減-0边灭,結(jié)果是-0异希;
- -0減-0,結(jié)果是+0绒瘦;
- 其他字符串称簿,布爾值,null惰帽,undefined憨降,先在后臺調(diào)用Number()函數(shù)。
- 如果是對象的話该酗,則先調(diào)用valueOf()授药,如果沒有則調(diào)用toString()
關(guān)系操作符(<,>,<=,>=)
- 兩個都是數(shù)值,直接比較
- 兩個都是字符串呜魄,則比較編碼
- 一個是數(shù)值悔叽,則將另一個轉(zhuǎn)換成數(shù)值
- 操作數(shù)是對象,則調(diào)用valueOf(),如果沒有valueOf(),則調(diào)用toString()
var result = '23' < '3' //true
var result = '23' < 3 //false
var result = 'a' < 3 // false ,'a'轉(zhuǎn)換成NaN耕赘,任何操作數(shù)與NaN比較骄蝇,結(jié)果都是false
相等操作符
- 相等和不相等"=="和'!=',這兩個操作符都會先轉(zhuǎn)換操作數(shù)(強制轉(zhuǎn)換),然后再比較他們的相等性
- 布爾值false => 0,true => 1;
- 一個操作數(shù)是字符串操骡,另一是數(shù)值九火,比較時先將字符串變?yōu)閿?shù)值
- 一個是對象,另一個不是册招,則調(diào)用valueOf(),得到基本值后進行比較
- null 和undefined 相等
- 在比較相等性之前岔激,不能將null和undefined轉(zhuǎn)換成任何值
- 當(dāng)一個是NaN時,相等為false是掰,不相等為true虑鼎。即便是兩個都是NaN的情況下,NaN不和任何值相等键痛,也不和自己本身相等
- 如果兩個都是對象炫彩,則比較他們是不是同一個對象,如果兩個操作數(shù)指向同一個對象則返回true絮短,否則返回false
null == undefined // true null 和 undefined 相等
'NaN' == NaN // false NaN 與任何值都是false
NaN == NaN // false
NaN != NaN // true NaN自己和本身也不相等
false == 0 // true false轉(zhuǎn)化Number()為0
true == 1 // true true Number()為1
undefined == 0 // false
null == 0 // false 在比較相等性之前江兢,不能將null和undefined 轉(zhuǎn)化成任何值
'5' == 5 // true 字符串5變?yōu)閿?shù)值
全等和不全等("=="和"===")
除了在比較之前不轉(zhuǎn)換操作數(shù)之外,"=="和"==="沒有什么區(qū)別 "!="和"!=="
var result1 = ( '55'==55) // true
var result2 = ( '55'===55) //false
null == undefined // true
null === undefined // false
條件操作符
variable = boolean_expressin ? true_value : false_value;
var max = (num1 > num2) ? mun1 : mun2; // 三目運算取兩者之間較大值
賦值操作符
var num = 10;
num = num + 10 => num += 10
// *= , /= , %= , += , -= ,
逗號操作符
- 使用逗號可以在一條語句中執(zhí)行多個操作
var num1 = 1, num2 = 2, num3 = 3;
- 用于賦值丁频,逗號操作符總返回表達(dá)式的最后一項
var num = (5,1,4,8) // num 為8
語句
if 語句
if (i > 25){
alert('i > 25')
}else if (i < 0){
alert('i<0')
}else{
alert('其他數(shù)值')
}
do-while 語句
var i = 0;
do {
i += 2;
}while(i < 10)
// 循環(huán)體中的代碼至少被執(zhí)行一次
var i = 12;
do {
i += 2;
}while(i < 10)
console.log(i) // 14
while 語句
在循環(huán)體的代碼執(zhí)行之前對條件做判斷杉允,循環(huán)體的代碼可能永遠(yuǎn)不會執(zhí)行
var i = 0;
while(i < 10){
i += 2
}
console.log(i) // 10
for 語句
for 語句也是一種前測試循環(huán)語句邑贴,他具有執(zhí)行循環(huán)之前初始化變量和定義循環(huán)后要執(zhí)行的代碼能力
for ( initialization ; expression ; post-loop-expression ) statement
var count = 10;
for ( var i = 0; i < count; i ++){
console.log(i) // 0,1,2,3,4,5,6,7,8,9
}
// 功能一致
var count = 10;
var i = 0;
while(i<count){
console.log(i);
i ++ ;
}
在for循環(huán)的變量初始化表達(dá)式中,也可以不使用var關(guān)鍵字
var count = 10;
var i ;
for (i=0; i < count; i ++){
console.log(i)
}
js中不存在塊級作用域叔磷,因此在循環(huán)內(nèi)部定義的變量可以在外部訪問
for ( var i = 0; i < 10 ; i ++){
console.log(i) // 0,1,2,3,4,5,6,7,8,9
}
console.log(i) // 10
for 語句中的初始化表達(dá)式拢驾,控制表達(dá)式,循環(huán)后的表達(dá)式都是可選的。將這三個表達(dá)式全部省略,則是一個無限循環(huán)
for (; ;){
doSomething() // 無限循環(huán)
}
給出一個控制表達(dá)式就是把for循環(huán)變成了while循環(huán)
var count = 10;
var i = 0;
for ( ; i < count;){
console.log(i);
i ++ ;
}
for-in 語句
用來枚舉對象的屬性
for (var proName in window){
console.log(proName) // var 操作符不是必須的,但是為了保證使用局部變量,推薦使用
}
for-in 輸出的屬性名順序不可預(yù)測捧弃,返回的先后順序可能會因為瀏覽器而異
如果迭代對象的變量值為null 或者 undefined for-in 語句會拋錯,但是ES5不再拋出錯誤,只是不執(zhí)行循環(huán)體
label 語句
給代碼中添加一個標(biāo)簽
break 和 continue 語句
break 語句會立即退出當(dāng)前循環(huán)矮烹,強制執(zhí)行循環(huán)后面的語句,continue 也是立即退出當(dāng)前循環(huán)褐啡,但是會從循環(huán)的頂部繼續(xù)執(zhí)行
var num = 0;
for ( var i = 1 ; i < 10 ; i ++){
if ( i % 5 == 0){
break
}
console.log(num) // 4 直接跳出for的循環(huán)
}
var num = 0;
for ( var i = 1; i < 10 ; i ++){
if ( i%5 == 0){
continue
}
console.log(num) // 8 跳出當(dāng)前循環(huán)語句诺舔,但是繼續(xù)在循環(huán)頂部執(zhí)行
}
var num = 0;
outer:
for (var i = 0; i < 10 ; i ++){
for ( var j = 0; j < 10 ; j ++){
if ( i == 5 && j == 5){
break;
}
num ++
}
}
// 最終num = 95; 當(dāng)i= 5备畦,j = 5 時只是跳出了j的循環(huán)低飒,從i= 6開始
var num = 0;
outer:
for (var i = 0; i < 10 ; i ++){
for ( var j = 0; j < 10 ; j ++){
if ( i == 5 && j == 5){
break outer;
}
num ++
}
}
// 最終num = 55; 當(dāng)i= 5懂盐,j = 5 時不但退出了j的循環(huán)褥赊,也退出了i的循環(huán)
var num = 0;
outer:
for (var i = 0; i < 10 ; i ++){
for ( var j = 0; j < 10 ; j ++){
if ( i == 5 && j == 5){
continue outer;
}
num ++
}
}
// 最終num = 99; 當(dāng)i= 5莉恼, j = 5 時拌喉,跳出j的循環(huán),從j= 6開始
var num = 0;
outer:
for (var i = 0; i < 10 ; i ++){
for ( var j = 0; j < 10 ; j ++){
if ( i == 5 && j == 5){
continue outer;
}
num ++
}
}
// 最終num = 95俐银; 當(dāng)i= 5尿背, j = 5 時,跳出j的循環(huán)捶惜,從i= 6的循環(huán)開始
with語句
主要作用就是將代碼的作用域設(shè)置到一個特定的對象中
var qs = location.search.substring(1);
var hostName = location.hostName;
var url = location.href;
// 可以改寫成如下
with(location){
var qs = search.substring(1);
var hostName = hostName;
var url = host
}
switch 語句
switch(i){
case 25:
alert('25');
break;
case 35:
alert('35');
break;
case 45:
alert('45');
break;
default:
alert('other');
}
如果省略break田藐,就會導(dǎo)致執(zhí)行完當(dāng)前的case,繼續(xù)執(zhí)行下個case
需要同時執(zhí)行多個case的話
switch(i){
case 25:
/*合并兩種情況*/
case 35:
alert('35 or 25');
break;
case 45:
alert('45');
break;
default:
alert('other');
}
case的值不一定是常量吱七,可以是變量汽久,可以是表達(dá)式,可以是字符串
switch('hello world'){ // 字符串
case 'hello'+'world': // 表達(dá)式
alert('1');
break;
case 'good'
alert('2');
break;
default :
alert('888')
}
var num = 25;
switch(true){ // 每個case都可以返回一個布爾值
case num < 0:
alert('小于0');
break;
case num == 0 : // 這個地方是判斷
alert(0);
break;
}
switch 使用的是全等操作符踊餐,所以'10'與10不相等
函數(shù)
- 形式
function say(name , message){
alert(name + message);
}
- 函數(shù)在定義時不必指定是否返回值景醇,任何函數(shù)在任何時候都可以通過return語句后跟著要返回的值
- 函數(shù)在執(zhí)行return語句之后停止并立即退出
- return語句也可以不帶有任何返回值,這個時候返回undefined
- 參數(shù)
- js函數(shù)內(nèi)部中市袖,參數(shù)是用一個數(shù)組來表示的啡直,所以并不關(guān)心數(shù)組中有哪些參數(shù)
- 函數(shù)體內(nèi)可以通過arguments對象來訪問這個參數(shù)數(shù)組
function say(){
alert(arguments[0]+ arguments[1]);
}
- 命名形參只是提供了便利烁涌,但是不是必需的。
function doAdd(){
if ( arguments.length == 1){
alert(arguments[0]= 10)
}else if ( arguments.length == 2){
alert(arguments[0]+ arguments[1])
}
}
- arguments對象和命名參數(shù)一起使用
function doAdd(num1,num2){
if (arguments.length == 0){
console.log(num1+10)
}else if (arguments.length == 2){
console.log(num1+num2)
}
}
- arguments的值與形參一致
var n1 = 10;
var n2 = 20;
doAdd(n1,n2);
function doAdd(num1,num2){
arguments[1] = 10;
console.log(num2); //10
console.log(n2); //20
}
- 沒有傳遞命名參數(shù)將被自動賦予undefined值
- 嚴(yán)格模式下酒觅,如果沒有傳入num2,即使設(shè)置arguments[1]設(shè)為10撮执,num2 依然是undefined,重新修改arguments的值會導(dǎo)致錯誤(代碼將不會執(zhí)行)
- 沒有重載
function add(num){
return num + 100;
}
function add(num){
return num + 200;
}
add(100) // 300 只有覆蓋舷丹,沒有重載