一、 JS的發(fā)展歷史
,在1995年它抱,三十多歲的布蘭登·艾奇(Brendan Eich)在他任職的網(wǎng)景(Netscape)總部辦公桌旁,花了十天時(shí)間致力于編程工作中朴艰,最后成果是一種新的語(yǔ)言的誕生观蓄。最初的目的只是表單驗(yàn)證——為了減輕服務(wù)器的負(fù)擔(dān)。
1996年呵晚,微軟,JScript
1997年沫屡,ECMA(歐洲計(jì)算機(jī)制造商協(xié)會(huì))——TC39委員會(huì)(第一個(gè)標(biāo)準(zhǔn):ECMA-262)
javascript和java的關(guān)系——沒有關(guān)系饵隙,但是JS在結(jié)構(gòu)設(shè)計(jì)上,借鑒了很多Java的內(nèi)容
ECMA的組成
BOM(Brower Object Module)瀏覽器對(duì)象模型
DOM(Document Object Module)文檔對(duì)象模型
二沮脖、 JS語(yǔ)言特點(diǎn)
- 一個(gè)面向?qū)ο蟮目缙脚_(tái)的腳本語(yǔ)言
- 松散性(弱類型語(yǔ)言 eg:隱式數(shù)據(jù)類型轉(zhuǎn)換)
- 面向?qū)ο螅ǖ珱]有類的概念)金矛,基于原型的面向?qū)ο蟆?/li>
- 繼承
- 沒有多態(tài)芯急, 天生多態(tài),是鴨子類型語(yǔ)言
三驶俊、 JS引入方式
- 嵌入頁(yè)面
<script type="text/javascript">
document.write("hello world");
</script>
- 外部文件
<script src="路徑(當(dāng)前文件夾要加 ./)">
// 內(nèi)部不能編寫代碼, 編寫代碼無(wú)效;
</script>
四娶耍、變量
- 基本語(yǔ)法
var a; //聲明變量
a = 10;// 賦值變量
// 變量初始化(簡(jiǎn)寫操作);
var a = 10;
- 變量名
變量是一個(gè)變量?jī)?nèi)部?jī)?chǔ)存數(shù)據(jù)類型和意義的核心依據(jù),所以我們?nèi)∶M可能貼切;
- 匈牙利命名法
基本原則是:變量名 = 屬性 + 類型 + 對(duì)象描述
- 駝峰命名法(Camel-Case)
第一個(gè)單詞以小寫字母開始饼酿;從第二個(gè)單詞開始以后的每個(gè)單詞的首字母都采用大寫字母 , 例如:myFirstName , getElementById
- 關(guān)鍵字
var——定義變量的關(guān)鍵字
typeof——查看一個(gè)變量的類型
命名規(guī)則:只能包含數(shù)字榕酒、字母、下劃線故俐、$, 且不能用數(shù)字開頭
五想鹰、 數(shù)據(jù)類型
-
基本數(shù)據(jù)類型
-
number ——整數(shù)、浮點(diǎn)數(shù)
NaN(Not a Number) ——數(shù)值類型中的非數(shù)值
var a = "hello"; var b = a * 10; //非數(shù)字————內(nèi)容不確定 var c = a * 10; alert(b == c); //false, 兩個(gè)內(nèi)容不確定的變量药版,無(wú)法相等 document.write((isNaN)); //true document.write(isNaN(123)); //false
-
string——字符串
注:?jiǎn)我?hào)和雙引號(hào)沒有區(qū)別
字符串在控制臺(tái)打印的顏色的為黑色
boolean——布爾類型
undefined
對(duì)于JS來(lái)講辑舷,一個(gè)變量如果沒有賦值,不能確定類型槽片,那就是undefined
- null(null的類型也是object)
typeof(判斷數(shù)據(jù)類型的關(guān)鍵字)
alert(typeof null) // null在typeof運(yùn)算的時(shí)候會(huì)發(fā)生bug何缓;js認(rèn)為null是object alert(typeof NaN) // Number
-
-
復(fù)合類型
- object對(duì)象類型
包括:function函數(shù)類型、日期類型还栓、RegExp類型 ……
-
JS中的
等于
- 近似等于
`var int1 = 10碌廓,int2 = "10";` NaN == NaN //flase 自己不等于自己的特殊數(shù)字類型 document.write(int1 == int2) //true
- 絕對(duì)等于
優(yōu)先比對(duì)數(shù)據(jù)類型(絕對(duì)等于相比近似等于更省性能,開發(fā)的時(shí)候盡可能使用===)
document.write(int1 === int2); //false
六蝙云、 數(shù)據(jù)類型轉(zhuǎn)換;
含有布爾值氓皱、undefined、null類型的勃刨,與數(shù)值運(yùn)算時(shí)波材,優(yōu)先將以上三種轉(zhuǎn)換為數(shù)值Number();與字符相加時(shí),優(yōu)先將以上三種轉(zhuǎn)換為字符String();
- 隱式數(shù)據(jù)類型轉(zhuǎn)換
加法運(yùn)算中,只要有一個(gè)字符,另一個(gè)將隱式轉(zhuǎn)換為字符,然后首尾相連
var a = 1;
var b = {a:1,b:2};
var s = a + b;
console.log(s); //a[object Object]
空字符串轉(zhuǎn)換為數(shù)值以后身隐,變?yōu)?
var a = "";
a++;
console.log(a); //1
對(duì)象比較時(shí)廷区,不隱式轉(zhuǎn)換,而是比較引用地址
var obj = {
a: 1,
b: 2
};
var obj1 = obj;
obj1.a = 10;
console.log(obj === obj1); //true;
console.log({}=={}); //false(地址不同)
console.log({}==0); //false(地址不同)
console.log([]==[]);//false(數(shù)組是基于對(duì)象創(chuàng)建的,數(shù)組也是引用類型,也有引用地址)
數(shù)組轉(zhuǎn)換為字符串并不是[object Array], 而是直接將所有元素連接在一起形成字符串
"" == false == 0
console.log([]==false); //true,[]可以轉(zhuǎn)換為空字符串,而"" == false == 0
console.log([]==0); //true(同上)
console.log([]==""); //true(同上)
// 先將[]轉(zhuǎn)換為布爾值,然后求反:對(duì)象本身轉(zhuǎn)換布爾值是true,求反后就是false
console.log(![]==false); //true
console.log(![]===false); //true
console.log([]===""); //false
浮點(diǎn)數(shù)的運(yùn)算 ------ 0.1+0.2 為什么不等于0.3贾铝?隙轻??
解決方案:首先將浮點(diǎn)數(shù)轉(zhuǎn)為整數(shù)垢揩,進(jìn)行運(yùn)算玖绿,再除以相應(yīng)的位數(shù)
- 強(qiáng)制數(shù)據(jù)類型轉(zhuǎn)換
- String()
var a = 5;
var num = String(a);
console.log(num);//打印黑色的字符a
- toString()
十進(jìn)制 => R進(jìn)制; 如果直接使用就是轉(zhuǎn)換為字符串,如果加入?yún)?shù)數(shù)值(2-36)之間叁巨,則會(huì)得到對(duì)應(yīng)的進(jìn)制斑匪。
var a = 5;
var num = a.toString(2);
console.log(num);//101
- String()和toString()的區(qū)別
都是將其他類型的變量轉(zhuǎn)換為字符串類型,區(qū)別在于
toString
無(wú)法轉(zhuǎn)化null
和undefined
var a,b = null;
console.log(String(a)); //undefined
console.log(String(b)); //null
//null和undefined沒有toString()轉(zhuǎn)換方法
console.log(a.toString());
//Uncaught TypeError: Cannot read property 'toString' of undefined
console.log(b.toString());
//Uncaught TypeError: Cannot read property 'toString' of null
- toFixed()
//將數(shù)值轉(zhuǎn)換為字符串锋勺,并且四舍五入保留兩位小數(shù)(參數(shù)為任意正整數(shù))
var a = 34.567
var num = a.toFixed(2);
console.log(num);
- toPrecision()
//把數(shù)字四舍五入蚀瘸,格式化為指定的長(zhǎng)度
var a = 34.5678;
console.log(a.toPrecision(3));//34.6
- toExponential()
//使用科學(xué)計(jì)數(shù)法狡蝶,只表示整數(shù)位一位,規(guī)定指數(shù)計(jì)數(shù)法中的小數(shù)位數(shù)贮勃,是 0 ~ 20 之間的值贪惹,包括 0 和 20
var a = 456789;
console.log(a.toExponential(2));
- parseInt()
R進(jìn)制 => 十進(jìn)制
從左到右依次檢索,第一個(gè)不為數(shù)字的字符,省略并返回前面內(nèi)容寂嘉。 如果第一個(gè)字符不為數(shù)字 則轉(zhuǎn)換結(jié)果為NaN奏瞬。
var str1 = "hello world";
var str2 = "123.123hello world";
document.write(parseInt(str1)); //NaN
document.write(parseInt(str2)); //123
document.write(parseInt(true)); //NaN
var a = 24.56,b = 101;
console.log(a); //24
console.log(parseInt(b,2));
- parseFloat()
可以帶小數(shù)點(diǎn)的
var str1 = "hello world";
var str2 = "123.123ello world";
document.write(parseFloat(str1)); //NaN
document.write(parseFloat(str2)); //123.123
- Number()
只針對(duì)純數(shù)字內(nèi)容的字符串轉(zhuǎn)換有效,但凡是字符串中有不符合數(shù)字規(guī)則的部分垫释,都會(huì)轉(zhuǎn)換為NaN丝格。(true / false / null例外)
document.write(Number(56)); //56
document.write(Number("56")); //56
document.write(Number("56ab")); //NaN
var str1 = "hello world";
var str2 = "123.123ello world";
document.write(Number(str1)); //NaN
document.write(Number(str2)); //NaN
document.write(Number(true)); //1
document.write(Number(false)); //0
document.write(Number(null)); //0
document.write(Number(undefined)); //NaN
- 其他類型轉(zhuǎn)為boolean型
var a = "", b = 0, c, d = null, e = NaN, f = false;
a = Boolean(a);
b = Boolean(b);
c = Boolean(c);
d = Boolean(d);
e = Boolean(e);
f = Boolean(f);
console.log(a,b,c,d,e,f);//false false false false false false
//除了"" , 0 , undefined, null, NaN, false, 其他任何內(nèi)容轉(zhuǎn)為布爾值都是true;
- 取整規(guī)則
Math.round =>四舍五入
Math.floor =>向下取整
Math.ceil =>向上取整
直接保留方案(保留n位小數(shù))
toFixed(3)
//僅限于存儲(chǔ)了數(shù)字類型的變量使用
- 8進(jìn)制、16進(jìn)制
var num8 = 010; //0 + 八進(jìn)制數(shù)字】
var num16 = 0xffff; //num16 = 65535
- null和undefined的使用區(qū)別
目前棵譬,null和undefined基本是同義的显蝌,只有一些細(xì)微的差別。null表示"沒有對(duì)象"订咸,即該處不應(yīng)該有值曼尊。典型用法是:
(1) 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對(duì)象脏嚷。
(2) 作為對(duì)象原型鏈的終點(diǎn)骆撇。
Object.getPrototypeOf(Object.prototype)
// null
undefined表示"缺少值",就是此處應(yīng)該有一個(gè)值父叙,但是還沒有定義神郊。典型用法是:
(1)變量被聲明了,但沒有賦值時(shí)趾唱,就等于undefined涌乳。
(2) 調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒有提供甜癞,該參數(shù)等于undefined夕晓。
(3)對(duì)象沒有賦值的屬性,該屬性的值為undefined悠咱。
(4)函數(shù)沒有返回值時(shí)蒸辆,默認(rèn)返回undefined。
var i;
i // undefined
function f(x){console.log(x)}
f() // undefined
var o = new Object();
o.p // undefined
var x = f();
x // undefined