摘要:本質(zhì)上是由一組無(wú)序名值對(duì)組成的。浮點(diǎn)數(shù)值的最高精度是位小數(shù),但在進(jìn)行計(jì)算時(shí)其精度遠(yuǎn)遠(yuǎn)不如證書。例如這是使用基于數(shù)值的浮點(diǎn)計(jì)算的通病,并非獨(dú)此一家數(shù)值范圍。
函數(shù)名不能使用關(guān)鍵字(typeof不行但typeOf可以,區(qū)分大小寫)
標(biāo)識(shí)符就是指變量、函數(shù)、屬性的名字,或者函數(shù)的參數(shù)。
第一個(gè)字符必須是一個(gè)字母、下劃線(_)或者一個(gè)美元符號(hào)($)
其他字符可以是字母、下劃線、美元符號(hào)或者數(shù)字
嚴(yán)格模式 在嚴(yán)格模式下ECMAScript3中的一些不確定的行為將得到處理,而且某些不安全的操作也會(huì)拋出錯(cuò)誤。
// 在整個(gè)腳本頂部添加 "use strict"; // 在函數(shù)內(nèi)部上方使用 function deSmoething() { "use strict"; // 函數(shù)體 }
關(guān)鍵字和保留字
break,do,instanceof,typeof,case,else,new,var,catch,finally,return,viod,continue,for,switch,while,debugger*,function,this,with,default,if,throw,delete,in,try
在函數(shù)中不用var聲明變量會(huì)變成全局變量,有效但不推薦
function test() { message = "hi"; //全局變量 } test() alert(message); // "hi"
數(shù)據(jù)類型 ECMAScript中有5種簡(jiǎn)單數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型):Undefined,Null,Boolean,Number,String 還有1種復(fù)雜數(shù)據(jù)類型Object。本質(zhì)上Object是由一組無(wú)序名值對(duì)組成的。
typeof返回值"undefined","boolean","string","number","object","function" (typeof null 返回結(jié)果是"object") (typeof 是操作符不是函數(shù)因此最好不要用括號(hào))
Undefined// 在使用bar聲明變量但未對(duì)其加以初始化,這個(gè)變量的值就是undefined var message; alert(message == undefined); // true alert(message === undefined); // true // 下面這個(gè)變量并沒有聲明 // var age alert(age); // 報(bào)錯(cuò) // 對(duì)于尚未聲明過的變量,只能執(zhí)行一項(xiàng)操作,即使用typeof操作符檢測(cè)其數(shù)據(jù)類型 // 對(duì)未經(jīng)聲明的變量使用delete不會(huì)導(dǎo)致錯(cuò)誤,但這樣沒什么意義,而且在嚴(yán)格模式下確實(shí)會(huì)導(dǎo)致錯(cuò)誤 var message; // var age alert(typeof message); // "undefined" alert(typeof age); // "undefined" // 兩者都返回了undefined這個(gè)結(jié)果有其邏輯上的合理性。 // 因?yàn)殡m然這兩種變量從技術(shù)角度看有本質(zhì)區(qū)別,但實(shí)際上無(wú)論對(duì)那種變量也不可能執(zhí)行真正的操作Null 只有一個(gè)值的數(shù)據(jù)類型(null)
// 從邏輯角度來(lái)看,null值表示一個(gè)空對(duì)象指針,而這也正是使用typeof 操作符檢測(cè)null值時(shí)會(huì)返回"object"的原因 var car = null; alert(typeof car); // "object" // 如果定義變量準(zhǔn)備在將來(lái)用于保存對(duì)象,那么最好將該變量初始化為null而不是其他值 if (car != null) { ... } // 實(shí)際上 undefined值時(shí)派生自null值得,因此ECMA-262規(guī)定他們的相等性測(cè)試要返回true alert(null == undefined) // true
Boolean 類型
// 雖然Boolean類型的字面值只有2個(gè),但ECMAScript中所有類型的值都有與這兩個(gè)Boolean值等價(jià)的值。 // 任何非零的數(shù)字值(包括無(wú)窮大)返回true 0 和 NaN 返回false var message = "Hello world!"; Boolean(message); // true Boolean(0); // false Boolean(NaN); // false Boolean(Infinity) // true Boolean({}) // true Boolean(null) // falseNumber 類型
// 八進(jìn)制如果字面值中的數(shù)值超出了范圍,那么前導(dǎo)零將被忽略,后面的數(shù)值將被當(dāng)做十進(jìn)制數(shù)值解析 var num1 = 070; // 八進(jìn)制的56 var num2 = 079; // 無(wú)效的八進(jìn)制數(shù)值 解析為79 var num3 = 08; // 無(wú)效的八進(jìn)制數(shù)值 解析為8 // 八進(jìn)制字面量在嚴(yán)格模式下是無(wú)效的,會(huì)導(dǎo)致支持該模式的JavaScript引擎拋出錯(cuò)誤 // 十六進(jìn)制字面值的前兩位必須是0x 后跟任何十六進(jìn)制數(shù)字 (0~9 和 A~F)其中字母不區(qū)分大小寫 // 在進(jìn)行算術(shù)計(jì)算時(shí),所有八進(jìn)制和十六進(jìn)制表示的數(shù)值最終都將被轉(zhuǎn)換成十進(jìn)制數(shù)值 // 鑒于JavaScript中數(shù)值的保存方式,可以保存正零和負(fù)零,兩者被認(rèn)為相等 0 === -0 // true浮點(diǎn)數(shù)。
由于保存浮點(diǎn)數(shù)值需要的內(nèi)存空間是保存證書值得兩倍,因此ECMAScript會(huì)不失時(shí)機(jī)的將浮點(diǎn)數(shù)值轉(zhuǎn)換為整數(shù)值。
浮點(diǎn)數(shù)值的最高精度是17位小數(shù),但在進(jìn)行計(jì)算時(shí)其精度遠(yuǎn)遠(yuǎn)不如證書。例如 0.1 + 0.2 = 0.30000000000000004
這是使用基于IEEE754數(shù)值的浮點(diǎn)計(jì)算的通病,ECMASscript并非獨(dú)此一家
數(shù)值范圍。由于內(nèi)存限制,ECMAScript能夠表示的最小值保存在Number.MIN_VALUE 在大多數(shù)瀏覽器中這個(gè)值時(shí) 5e-324
最大值在Number.MAX_VALUE中在大多數(shù)瀏覽器中,這個(gè)值是1.7976931348623157e+308;
如果計(jì)算中超過了范圍將會(huì)自動(dòng)轉(zhuǎn)換成Infinity或-Infinity
Infinity無(wú)法參加計(jì)算
想要確定某個(gè)值是不是有窮的(在范圍內(nèi))使用isFinite()函數(shù)
訪問Number.NEGATIVE_INFINITY 和 Number.POSITIVE_INFINITY 也可以得到負(fù)和正Infinity的值
Infinity + -Infinity // NaN var res = Number.MAX_VALUE + Number.MAX_VALUE; alert(isFinite(res)); // falseNaN 即非數(shù)值(Not a Number)
是一個(gè)特殊的數(shù)值,這個(gè)數(shù)值用于表示一個(gè)本來(lái)要返回?cái)?shù)值的操作數(shù)值未返回?cái)?shù)值的情況
任何涉及NaN的操作都會(huì)返回NaN
NaN與任何值都不相等,包括NaN本身
isNaN() 在接受到一個(gè)值之后,會(huì)嘗試將其轉(zhuǎn)換為數(shù)值,而任何不能轉(zhuǎn)換為數(shù)值的值都會(huì)導(dǎo)致整個(gè)函數(shù)返回true
isNaN(NaN); // true isNaN(10); // false isNaN("10"); // false isNaN("blue"); // ture isNaN(true); // false 可以被轉(zhuǎn)換成數(shù)值1 // isNaN()也適用于對(duì)象,在基于對(duì)象調(diào)用isNaN()函數(shù)時(shí),會(huì)首先調(diào)用對(duì)象的valueOf()方法,然后確定該方法返回的值是否可以轉(zhuǎn)換為數(shù)值 // 如果不能,則基于整個(gè)返回值再調(diào)用toString()方法,再測(cè)試返回值 // 整個(gè)過程也是ECMAScript中內(nèi)置函數(shù)和操作符的一般執(zhí)行流程 var o = { valueOf: function() { return "10"; } } isNaN(o) // false 先返回"10" 再轉(zhuǎn)換成數(shù)值10 var o2 = { valueOf: function() { return "blue"; } } isNaN(o2) // ture 先返回"blue" 不能轉(zhuǎn)換成數(shù)值
數(shù)值轉(zhuǎn)換。Number() parseInt() parseFloat()
Number(true) // 1 Number(false) // 0 Number(null) // 0 Number(undefined) // NaN Number("") // 0 // 如果字符串中包含有效的十六進(jìn)制格式,例如"0xf" 則將其轉(zhuǎn)換為相同大小的十進(jìn)制數(shù)值 // Number()也適用于對(duì)象,在基于對(duì)象調(diào)用isNaN()函數(shù)時(shí),會(huì)首先調(diào)用對(duì)象的valueOf()方法,然后確定該方法返回的值是否可以轉(zhuǎn)換為數(shù)值 // 如果不能,則基于整個(gè)返回值再調(diào)用toString()方法,再測(cè)試返回值 // 由于Number()函數(shù)在轉(zhuǎn)換字符串時(shí)比較復(fù)雜而且不夠合理,因此在處理整數(shù)和浮點(diǎn)數(shù)的時(shí)候更通常的做法是用parseInt() 和 parseFloat()函數(shù) Number(" 0.2") // 0.2 Number(" 02blue") // NaN parseInt(" 02blue") // 2 Number(" 0.2blue;") // NaN parseFloat(" 0.2blue;") // 0.2 // 在使用parseInt() 解析八進(jìn)制字面量的字符串時(shí) ECMAScript 3 和 5 存在分歧 // ECMAScript 3 認(rèn)為56(八進(jìn)制), ECMAScript 5 認(rèn)為是70(十進(jìn)制) var num = parseInt("070") // ECMAScript 5 中 parseInt()已經(jīng)不具有解析八進(jìn)制值得能力 即使在非嚴(yán)格模式下也是如此 // 可以為這個(gè)函數(shù)提供第二個(gè)參數(shù)避免歧義 var num = parseInt("0xAF", 16); // 175 // 實(shí)際上,如果有第二個(gè)參數(shù),字符串可以不帶“0x” var num1 = parseInt("AF", 16); // 175 var num2 = parseInt("AF"); // NaN // parseFloat() 從第一個(gè)字符開始解析,直到末尾,除非解析到遇見一個(gè)無(wú)效的浮點(diǎn)數(shù)為止 // 第一個(gè)小數(shù)點(diǎn)有效之后就無(wú)效 // parseFloat() 只能解析十進(jìn)制值,因此它沒有用的哥參數(shù)指定基數(shù)的用法,非十進(jìn)制數(shù)值都返回0 // 如果字符串包含的是一個(gè)可解析為整數(shù)的數(shù),會(huì)返回一個(gè)整數(shù) parseFloat("1234blue"); // 1234 parseFloat("0xA"); // 0 parseFloat("22.24.5") // 22.24 parseFloat("0980.5"); // 980.5 parseFloat("3.125e"); // 31250000String 類型
單引號(hào)和雙引號(hào)都可以用,單首尾必須匹配
字符字面量換行
制表
退格
回車
f 進(jìn)紙
斜杠
" 單引號(hào)
" 雙引號(hào)
xnn 以十六進(jìn)制代碼nn表示的一個(gè)字符(其中n為0~F) 例如 x41表示"A"
unnnn 以十六進(jìn)制代碼nnnn表示一個(gè)Unicode字符 (其中n為0~F) 例如 u03a3 表示希臘字符 sigma 字符串length為1
字符串的特點(diǎn)ECMAScript 中的字符串時(shí)不可變的,字符串一旦創(chuàng)建,它們的值就不能改變
要改變某個(gè)變量保存的字符串,首先要銷毀原來(lái)的字符串,然后再用另一個(gè)包含新值得字符串填充該變量
var lang = "Java"; lang = lang + "Script"; /* * 實(shí)現(xiàn)這個(gè)操作的過程 * 首先創(chuàng)建一個(gè)能容納10個(gè)字符的新字符串,然后再這個(gè)字符串中填充"Java" 和 "Script" * 最后銷毀原來(lái)的字符串"Java"和字符串"Script",因?yàn)檫@個(gè)兩個(gè)字符串都沒用了 * 這個(gè)過程是在后臺(tái)發(fā)生的,而這也是某些舊版本的瀏覽器 (1.0以下的Firefox IE6等)拼接字符串速度很慢的原因所在 */轉(zhuǎn)換為字符串
使用幾乎每個(gè)值都有的toString()方法 數(shù)值、布爾值、對(duì)象和字符串值(沒錯(cuò),字符串也有)
在不知道要轉(zhuǎn)換的值是不是null或undefined的情況下,還可以使用轉(zhuǎn)型函數(shù)String()
// toSring()可以傳一個(gè)參數(shù):輸出數(shù)值的基數(shù) 默認(rèn)十進(jìn)制 var num = 10; num.toString(); // "10" num.toString(2); // "1010" num.toString(8); // "12" num.toString(10); // "10" num.toSring(16); // "a" null.toString(); // 報(bào)錯(cuò) undefined.toString() // 報(bào)錯(cuò) String(null); // "null" String(undefined); // "undefined"Object 類型
// 三種寫法等價(jià) 但不建議省略小括號(hào) var o = {}; var o = new Object(); var o = new Object; o.constructor // ? Object() { [native code] } 就是Object()
從技術(shù)角度講,ECMA-262中對(duì)象的行為不一定適用于JavaScript中的其他對(duì)象。瀏覽器環(huán)境中的對(duì)象,比如BOM DOM中的對(duì)象都屬于宿主中的對(duì)象
Object 的每個(gè)實(shí)例都具有下列屬性和方法
constructor: 保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)
hasOwnProperty(propertyName): 用于檢查給定的屬性在當(dāng)前對(duì)象實(shí)例中(而不是在實(shí)例的原型中)是否存在。其中propertyName必須為字符串
isPrototypeOf(object): 用于檢查傳入的對(duì)象是否是當(dāng)前對(duì)象的原型
propertyIsEnumerable(propertyName): 用于檢查給定的屬性是否能使用for-in語(yǔ)句來(lái)枚舉
toLocaleString(): 返回對(duì)象的字符串表示,該字符串與執(zhí)行環(huán)境的地區(qū)對(duì)應(yīng)
toString(): 返回對(duì)象的字符串
valueOf(): 返回對(duì)象的字符串、數(shù)值或布爾值表示。通常與toString()方法的返回值相同
// Baz.prototype, Bar.prototype, Foo.prototype 和 Object.prototype 在 baz 對(duì)象的原型鏈上: function Foo() {} function Bar() {} function Baz() {} Bar.prototype = Object.create(Foo.prototype); Baz.prototype = Object.create(Bar.prototype); var baz = new Baz(); console.log(Baz.prototype.isPrototypeOf(baz)); // true console.log(Bar.prototype.isPrototypeOf(baz)); // true console.log(Foo.prototype.isPrototypeOf(baz)); // true console.log(Object.prototype.isPrototypeOf(baz)); // true操作符
包括算數(shù)操作符、位操作符、關(guān)系操作符和相等操作符
遞增和遞減操作符前置型 在賦值前改變
后置型 在賦值后改變
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
在應(yīng)用于一個(gè)包含有效數(shù)字字符串時(shí),先將其轉(zhuǎn)換為數(shù)值
在應(yīng)用于一個(gè)包含有效數(shù)字的字符串時(shí),將變量的值設(shè)置為NaN,字符串變量變成數(shù)值變量
false,先將其轉(zhuǎn)換為0
true,先將其轉(zhuǎn)換為1
浮點(diǎn)數(shù),正常加減1
對(duì)象,先調(diào)用vlueOf()方法,如果結(jié)果是NaN則調(diào)用toString()方法后再應(yīng)用前述規(guī)則
var s1 = "2"; var s2 = "z"; var b = false; bar f = 1.1; var o = { varluOf: function() { return -1; } }; s1++; // 3 s2++; // NaN b++; // 1 f--; // 0.10000000000000009 浮點(diǎn)運(yùn)算舍入錯(cuò)誤導(dǎo)致 o--; // -2一元加減操作符
+號(hào)會(huì)對(duì)值自動(dòng)轉(zhuǎn)換成數(shù)值
-號(hào)會(huì)變成負(fù)數(shù)
位操作符ECMAscript中的所有數(shù)值都以IEEE-754 64位格式存儲(chǔ),但位操作符并不直接操作64位值。而是先將64位的值轉(zhuǎn)成32位的整數(shù),然后執(zhí)行操作 ,最后再將結(jié)果轉(zhuǎn)回64位。
32位中的前31位表示整數(shù)的值,第32位表示數(shù)值的符號(hào),0為正數(shù) 1為負(fù)數(shù),即為符號(hào)位
正數(shù)以純二進(jìn)制格式存儲(chǔ),沒有用到的位用0填充
負(fù)數(shù)同樣二進(jìn)制,但使用的格式是二進(jìn)制補(bǔ)碼
求數(shù)值絕對(duì)值的二進(jìn)制碼
求二進(jìn)制反碼 將0換成1 1換成0
得到的二進(jìn)制反碼加1
NaN 和 Infinity 應(yīng)用位操作符時(shí),會(huì)被當(dāng)做0處理,由于64位轉(zhuǎn)存32位導(dǎo)致
按位非(NOT) ~
按位與(AND) &
按位或(OR) |
按位異或(XOR) ^ 兩個(gè)數(shù)值對(duì)應(yīng)位上只有一個(gè)1時(shí)才返回1,其他情況返回0
左移 << 右側(cè)以0填充
有符號(hào)的右移 >> 數(shù)值向右移動(dòng),保留符號(hào)位,左側(cè)以符號(hào)位數(shù)值填充
無(wú)符號(hào)的右移 >>> 數(shù)值向右移動(dòng),不保留符號(hào)位 ,左側(cè)以0來(lái)填充
var oldvalue = 64; var newvalue = oldvalue >> 5; // 二進(jìn)制10 var oldvalue = 64; var newvalue = oldvalue >>> 5; // 二進(jìn)制 10 var oldvalue = -64; var newvalue = oldvalue >>> 5; // 等于十進(jìn)制的134217726布爾操作符
邏輯非 !
!"blue" // false !0 // true !NaN // true !null // true !undefined // true !"" // true !12345 // false
邏輯與 && 邏輯與是短路操作,如果第一個(gè)操作數(shù)能夠決定結(jié)果,就不會(huì)對(duì)第二個(gè)操作數(shù)求值
var found = true; var result = (found && someUndefinedVariable); // 拋出錯(cuò)誤 alert(result); // 這里不會(huì)執(zhí)行 var found = false; var result = (found && someUndefindedVariable); // 不會(huì)發(fā)生錯(cuò)誤 alert(result); // false
如果第一個(gè)操作數(shù)是對(duì)象,則返回第二個(gè)操作數(shù)
如果第二個(gè)操作數(shù)是對(duì)象,則只有在第一個(gè)求值結(jié)果為true的時(shí)候才會(huì)返回該對(duì)象
如果兩個(gè)都是對(duì)象,則返回第二個(gè)操作數(shù)
如果有一個(gè)操作數(shù)是null 則返回null
如果有一個(gè)操作數(shù)是NaN 則返回NaN
如果有一個(gè)操作數(shù)是undefined 則返回undefined
如果求值的操作數(shù)沒有聲明會(huì)拋出錯(cuò)誤
邏輯或 || 短路操作
var found = true; var result = (found || someUndefinedVariable); // 不會(huì)拋出錯(cuò)誤 alert(result); // true var found = false; var result = (found || someUndefindedVariable); // 發(fā)生錯(cuò)誤 alert(result); // 這里不會(huì)執(zhí)行
如果第一個(gè)操作數(shù)是對(duì)象,則返回第一個(gè)操作數(shù)
如果第一個(gè)操作數(shù)求值為false,則返回第二個(gè)
如果兩個(gè)都是對(duì)象,則返回第一個(gè)操作數(shù)
如果兩個(gè)操作數(shù)都是null 則返回null
如果兩個(gè)操作數(shù)都是NaN 則返回NaN
如果兩個(gè)操作數(shù)都是undefined 則返回undefined
如果求值的操作數(shù)沒有聲明會(huì)拋出錯(cuò)誤
乘性操作符如果參與計(jì)算的某個(gè)操作數(shù)不是數(shù)值,后臺(tái)會(huì)先試用Number()轉(zhuǎn)型函數(shù)
如果有一個(gè)操作數(shù)是NaN 則結(jié)果是NaN
如果Infinity 與 0 相乘 則結(jié)果是NaN
如果Infinity 與 非0相乘 則結(jié)果是Infinity 或 -Infinity
Infinity * Infinity = Infinity
-Infinity * Infinity = -Infinity
Infinity / Infinity = NaN
0 / 0 = NaN
非0的有限數(shù) / 0 = Infinity 或 - Infinity
0 / 非0的有限數(shù) = Infinity 或 - Infinity
有限數(shù)值 % 0 = NaN
Infinity % Infinity = NaN
Infinity % 有限數(shù)值 = NaN
Infinity + -Infinity = NaN
+0 + -0 = +0
兩個(gè)操作數(shù)都是字符串 結(jié)果是拼接字符串
如果只有一個(gè)操作數(shù)是字符串,則將另一個(gè)操作數(shù)轉(zhuǎn)換為字符串
+0 - -0 = +0
var num1 = 5; var num2 = 10; var message = "the sum of 5 and 10 is " + num1 + num2; alert(message); // "the sum of 5 and 10 is 510" var message = "the sum of 5 and 10 is " + (num1 + num2); alert(message); // "the sum of 5 and 10 is 15" var res6 = 5 - null; // 5 null轉(zhuǎn)為0關(guān)系操作符
如果兩個(gè)操作數(shù)都是字符串,則比較兩個(gè)字符串對(duì)應(yīng)的字符編碼值
如果一個(gè)操作數(shù)是數(shù)值,則將另一個(gè)操作數(shù)轉(zhuǎn)換為一個(gè)數(shù)值進(jìn)行比較
如果一個(gè)操作數(shù)是對(duì)象,調(diào)用valueOf()方法,如果沒有則調(diào)用toString()
如果一個(gè)操作數(shù)是布爾值,則先將其轉(zhuǎn)換為數(shù)值
任何操作數(shù)與NaN進(jìn)行關(guān)系比較,結(jié)果都是false
// 字母B的字符編碼為66 而字母a的字符編碼是97 // 如果要真正按照字母順序比較字符串,就要相同大小 var result = "Brick" < "alphabet"; // true var result = "Brick".toLowerCase() < "alphabet".toLowerCase(); // false // "2" 字符編碼是50,而"3"的字符編碼是51 var result = "23" < "3"; // true var result = "23" > 3; // false var result = "a" < 3; // false 因?yàn)?a"被轉(zhuǎn)換成了NaN var result = NaN < 3; // false var result = NaN >= 3; // false相等操作符
相等和不相等 == , !=
這兩個(gè)操作符都會(huì)先轉(zhuǎn)換操作數(shù)(通常稱為強(qiáng)制轉(zhuǎn)型),然后再比較他們的相等性
如果有一個(gè)操作數(shù)是布爾值,先轉(zhuǎn)為1或0再比較
如果一個(gè)是字符串另一個(gè)是數(shù)值,則轉(zhuǎn)換為數(shù)值比較
對(duì)象先調(diào)用valueOf(),用得到的基本類型值按照前面規(guī)則進(jìn)行比較
null 和 undefined 相等
比較之前不能講null和undefined轉(zhuǎn)換成其他任何值
如果有一個(gè)操作數(shù)是NaN,則相等操作符返回false, NaN也不等于NaN
如果兩個(gè)操作數(shù)都是對(duì)象,則比較他們是不是同一個(gè)對(duì)象,如果都指向同一個(gè)對(duì)象,則相等操作符返回true
全等和不全等 ===, !==
除了比較之前不轉(zhuǎn)換操作數(shù)類型,全等和不全等與相等和不相等操作符沒有掃碼區(qū)別。
null == undefined // true null === undefined // false null 和 undefined是兩個(gè)基本類型條件操作符(條件運(yùn)算符、三元表達(dá)式)
variable = boolean_expression ? true_value : false_value;賦值操作符
= 把右側(cè)的值賦給左側(cè)的變量
*= /= %= += -=
<<= 左移賦值
">>=" 有符號(hào)右移賦值
">>>=" 無(wú)符號(hào)右移賦值
主要目的就是簡(jiǎn)化賦值操作,使用它們不能帶來(lái)任何性能的提升
逗號(hào)操作符使用逗號(hào)操作符可以在一條語(yǔ)句中執(zhí)行多個(gè)操作
逗號(hào)操作符總會(huì)返回表達(dá)式中的最后一項(xiàng)
var num1=1, num2=2, num3=3; var num = (5,3,2,4,0); // num的值為0語(yǔ)句 if語(yǔ)句
推薦代碼塊寫法
do-while 語(yǔ)句后測(cè)試循環(huán)語(yǔ)句,只有在循環(huán)體中的代碼執(zhí)行之后,才會(huì)測(cè)試出口條件
var i = 2; do { i += 2; console.log(i); } while (i < 2); // 打印 4while 語(yǔ)句
前測(cè)試循環(huán)語(yǔ)句,在循環(huán)體內(nèi)的代碼被執(zhí)行之前,就會(huì)對(duì)出口條件求值
var i = 2; while (i < 2 ) { i += 2; console.log(i); } // 沒有打印for 語(yǔ)句
前測(cè)試循環(huán)語(yǔ)句,在循環(huán)體內(nèi)的代碼被執(zhí)行之前,就會(huì)對(duì)出口條件求值
使用while循環(huán)做不到的,使用for循環(huán)同樣做不到,也就是說(shuō)for循環(huán)只是把循環(huán)有關(guān)的代碼集中在了一個(gè)位置
由于ECMAScript中不存在塊級(jí)作用域,因此在循環(huán)內(nèi)部定義的變量也可以在外部訪問到
// 無(wú)限循環(huán) for (;;) { ... }for-in 語(yǔ)句
for-in語(yǔ)句是一種精準(zhǔn)迭代語(yǔ)句,可以用來(lái)枚舉對(duì)象的屬性
循環(huán)輸出的屬性名的順序是不可預(yù)測(cè)的,根據(jù)瀏覽器而異
迭代對(duì)象為null或undefined會(huì)拋出錯(cuò)誤, ECMAScript 5 更正了這一行為,不再拋出錯(cuò)誤,而是不執(zhí)行語(yǔ)句
label語(yǔ)句加標(biāo)簽的語(yǔ)句一般都要與for語(yǔ)句等循環(huán)語(yǔ)句配合使用
var i, j; loop1: for (i = 0; i < 3; i++) { //The first for statement is labeled "loop1" loop2: for (j = 0; j < 3; j++) { //The second for statement is labeled "loop2" if (i == 1 && j == 1) { continue loop1; } console.log("i = " + i + ", j = " + j); } } // Output is: // "i = 0, j = 0" // "i = 0, j = 1" // "i = 0, j = 2" // "i = 1, j = 0" // "i = 2, j = 0" // "i = 2, j = 1" // "i = 2, j = 2" // Notice how it skips both "i = 1, j = 1" and "i = 1, j = 2"
var itemsPassed = 0; var i, j; top: for (i = 0; i < items.length; i++){ for (j = 0; j < tests.length; j++){ if (!tests[j].pass(items[i])){ continue top; } } itemsPassed++; }
var i, j; loop1: for (i = 0; i < 3; i++) { //The first for statement is labeled "loop1" loop2: for (j = 0; j < 3; j++) { //The second for statement is labeled "loop2" if (i == 1 && j == 1) { break loop1; } console.log("i = " + i + ", j = " + j); } } // Output is: // "i = 0, j = 0" // "i = 0, j = 1" // "i = 0, j = 2" // "i = 1, j = 0" // Notice the difference with the previous continue examplebreak和continue語(yǔ)句
break會(huì)立即退出循環(huán)
continue雖然也會(huì)立即退出循環(huán),但會(huì)從循環(huán)頂部繼續(xù)執(zhí)行
with語(yǔ)句 (不推薦使用)嚴(yán)格模式下不能使用
定義with語(yǔ)句的目的主要是為了簡(jiǎn)化多次編寫同一個(gè)對(duì)象的工作
大量使用with語(yǔ)句會(huì)導(dǎo)致性能下降,同時(shí)也會(huì)給調(diào)式代碼造成困難
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 = href; }switch語(yǔ)句
通過為每個(gè)case后面都添加一個(gè)break語(yǔ)句,就可以避免同時(shí)執(zhí)行多個(gè)case
假如確實(shí)需要混合集中情形,不要忘了添加注釋,說(shuō)明有意省略了break關(guān)鍵字
switch語(yǔ)句在比較值時(shí)使用的是全等操作,因此"10"不等于10
switch (i) { case 25: // 合并兩種情況 case 35: alert("25 or 35"); break; case 45: alert("45"); break; default: alert("Other"); }函數(shù)
return語(yǔ)句可以不帶任何返回值,函數(shù)在停止執(zhí)行后返回undefined
推薦的做法是要么讓函數(shù)始終都返回一個(gè)值要么永遠(yuǎn)都不要返回值,否則會(huì)給調(diào)試帶來(lái)麻煩
嚴(yán)格模式對(duì)函數(shù)有一些限制,否則會(huì)拋出錯(cuò)誤
不能把函數(shù)命名為eval或arguments
不能把參數(shù)命名為eval或arguments
不能出現(xiàn)兩個(gè)命名參數(shù)同名的情況
理解參數(shù)ECMAScript函數(shù)不介意傳遞進(jìn)來(lái)多少個(gè)參數(shù),也不在乎數(shù)據(jù)類型,即便定義接受兩個(gè)參數(shù),調(diào)用時(shí)也未必要傳兩個(gè)
原因是ECMAScript中的參數(shù)在內(nèi)部是用一個(gè)數(shù)組來(lái)表示的,在函數(shù)體內(nèi)可以通過arguments對(duì)象來(lái)訪問這個(gè)參數(shù)數(shù)組
arguments對(duì)象只是與數(shù)組類似,它并不是Array的實(shí)例,可以用方括號(hào)語(yǔ)法訪問每個(gè)元素,也有l(wèi)ength屬性
函數(shù)體內(nèi)部可以arguments[0],arguments[1]...不顯式地使用參數(shù),說(shuō)明ECMAScript函數(shù)的一個(gè)重要特點(diǎn):命名的參數(shù)只提供便利性,但不是必需的,解析器不會(huì)驗(yàn)證參數(shù)名
函數(shù)體內(nèi)可以直接使用arguments[1] = 10 來(lái)給參數(shù)賦值,但嚴(yán)格模式下會(huì)報(bào)錯(cuò)不能使用
沒有重載ECMAScript函數(shù)不能像傳統(tǒng)意義上那樣實(shí)現(xiàn)重載,而在其他語(yǔ)言中可以為一個(gè)函數(shù)編寫兩個(gè)定義,只要這兩個(gè)定義的簽名(接受的參數(shù)的類型和數(shù)量)不同即可
如果在ECMAscript中定義了兩個(gè)名字相同的函數(shù),則該名字只屬于后定義的函數(shù)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/104062.html
摘要:表示應(yīng)該立即下載腳本,但不應(yīng)妨礙頁(yè)面中的其他操作可選。表示通過屬性指定的代碼的字符集。表示腳本可以延遲到文檔完全被解析和顯示之后再執(zhí)行。實(shí)際上,服務(wù)器在傳送文件時(shí)使用的類型通常是,但在中設(shè)置這個(gè)值卻可能導(dǎo)致腳本被忽略。 第1章 JavaScript 簡(jiǎn)介 雖然JavaScript和ECMAScript通常被人們用來(lái)表達(dá)相同的含義,但JavaScript的含義比ECMA-262要多得多...
摘要:具體說(shuō)就是執(zhí)行流進(jìn)入下列任何一個(gè)語(yǔ)句時(shí),作用域鏈就會(huì)得到加長(zhǎng)語(yǔ)句的塊。如果局部環(huán)境中存在著同名的標(biāo)識(shí)符,就不會(huì)使用位于父環(huán)境中的標(biāo)識(shí)符訪問局部變量要比訪問全局變量更快,因?yàn)椴挥孟蛏纤阉髯饔糜蜴湣? 基本類型和引用類型的值 ECMAscript變量包含 基本類型值和引用類型值 基本類型值值的是基本數(shù)據(jù)類型:Undefined, Null, Boolean, Number, String ...
摘要:定義函數(shù)表達(dá)式的方式有兩種函數(shù)聲明。不過,這并不是匿名函數(shù)唯一的用途。可以使用命名函數(shù)表達(dá)式來(lái)達(dá)成相同的結(jié)果閉包匿名函數(shù)和閉包是兩個(gè)概念,容易混淆。匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其對(duì)象通常指向通過改變函數(shù)的執(zhí)行環(huán)境的情況除外。 定義函數(shù)表達(dá)式的方式有兩種: 函數(shù)聲明。它的重要特征就是 函數(shù)聲明提升(function declaration hoisting) 即在執(zhí)行代碼之前會(huì)...
摘要:技術(shù)的核心是對(duì)象即。收到響應(yīng)后,響應(yīng)的數(shù)據(jù)會(huì)自動(dòng)填充對(duì)象的屬性,相關(guān)的屬性有作為響應(yīng)主體被返回的文本。收到響應(yīng)后,一般來(lái)說(shuō),會(huì)先判斷是否為,這是此次請(qǐng)求成功的標(biāo)志。中的版本會(huì)將設(shè)置為,而中原生的則會(huì)將規(guī)范化為。會(huì)在取得時(shí)報(bào)告的值為。 Ajax(Asynchronous Javascript + XML)技術(shù)的核心是XMLHttpRequest對(duì)象,即: XHR。雖然名字中包含XML,但...
摘要:對(duì)的兩個(gè)主要拓展是選擇和。以下插入標(biāo)記的拓展已經(jīng)納入了規(guī)范。在寫模式下,會(huì)根據(jù)指定的字符串創(chuàng)建新的子樹,然后用這個(gè)子樹完全替換調(diào)用元素。在刪除帶有時(shí)間處理程序或引用了其他對(duì)象子樹時(shí),就有可能導(dǎo)致內(nèi)存占用問題。 盡管DOM作為API已經(jīng)非常完善了,但為了實(shí)現(xiàn)更多功能,仍然會(huì)有一些標(biāo)準(zhǔn)或?qū)S械耐卣埂?008年之前,瀏覽器中幾乎所有的拓展都是專有的,此后W3C著手將一些已經(jīng)成為事實(shí)標(biāo)準(zhǔn)的專...
閱讀 999·2019-08-30 15:55
閱讀 3440·2019-08-30 13:10
閱讀 1268·2019-08-29 18:45
閱讀 2347·2019-08-29 16:25
閱讀 2107·2019-08-29 15:13
閱讀 2421·2019-08-29 11:29
閱讀 551·2019-08-26 17:34
閱讀 1485·2019-08-26 13:57