国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

《JavaScript高級(jí)程序設(shè)計(jì)》(第3版)讀書筆記 第3章

renweihub / 655人閱讀

摘要:本質(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)      // false
Number 類型
// 八進(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));     //    false
NaN 即非數(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"); // 31250000

String 類型

單引號(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);

// 打印 4
while 語(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 example
break和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

相關(guān)文章

  • JavaScript高級(jí)程序設(shè)計(jì)》(3讀書筆記 1~2

    摘要:表示應(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要多得多...

    Corwien 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)》(3讀書筆記 4 變量、作用域和內(nèi)存問題

    摘要:具體說(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 ...

    lidashuang 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)》(3讀書筆記 7 函數(shù)表達(dá)式

    摘要:定義函數(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ì)...

    鄒立鵬 評(píng)論0 收藏0
  • Ajax與Comet-JavaScript高級(jí)程序設(shè)計(jì)21讀書筆記(1)

    摘要:技術(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,但...

    imingyu 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)》(3讀書筆記 11 DOM拓展

    摘要:對(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)的專...

    luck 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

renweihub

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<