用法
1 外部 javascript 文件不使用 <script> 標簽,直接寫 javascript 代碼。
2 HTML 輸出流中使用 document.write,相當于添加在原有html代碼中添加一串html代碼。而如果在文檔加載后使用(如使用函數(shù))程帕,會覆蓋整個文檔住练。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鳥教程(runoob.com)</title>
</head>
<body>
<p>
JavaScript 能夠直接寫入 HTML 輸出流中:
</p>
<script>
document.write("<h1>這是一個標題</h1>");
function changeImage()
{
alert("歡迎來到JavaScript的世界地啰,這里將為你開啟新世界的大門")
document.getElementById("demo").innerHTML="我的第一個 JavaScript 函數(shù)";
document.write("<p>哈哈哈哈哈</p>")//執(zhí)行該操作,會覆蓋整個文檔
}
</script>
<p id="demo">一個段落</p>
<button type="button" onclick="changeImage()">點我!</button>
<p>
您只能在 HTML 輸出流中使用 <strong>document.write</strong>讲逛。
如果您在文檔已加載后使用它(比如在函數(shù)中)亏吝,會覆蓋整個文檔。
</p>
</body>
</html>
字符串
規(guī)則:如果把數(shù)字與字符串相加盏混,結(jié)果將成為字符串蔚鸥!
typeof 操作符
JavaScript中,數(shù)組是一種特殊的對象類型许赃。 因此 typeof [1,2,3,4] 返回 object
用 typeof 檢測 null 返回是object止喷。
變量提升
var x = 5; // 初始化 x
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; // 顯示 x 和 y
var y = 7; // 初始化 y
輸出結(jié)果
x 為:5,y 為:undefined
之所以輸出了 undefined混聊,這是因為變量聲明 (var y) 提升了弹谁,但是初始化(y = 7) 并不會提升,所以 y 變量是一個未定義的變量句喜。
也就是等同于下面的代碼
var x = 5; // 初始化 x
var y; // 聲明 y
elem = document.getElementById("demo"); // 查找元素
elem.innerHTML = x + " " + y; // 顯示 x 和 y
y = 7; // 設置 y 為 7
雖然感覺這個變量提升很闊以的樣子预愤,但是作為一個碼農(nóng),還是遵循老祖宗的規(guī)矩咳胃,用之前就聲明植康,一是方便閱讀維護,二是避免出現(xiàn)問題再需要各種排查
JavaScript 嚴格模式(use strict)
"use strict" 指令只允許出現(xiàn)在腳本或函數(shù)的開頭
然后禁止了一堆東西如下列
禁止刪除變量或?qū)ο?br>
禁止刪除函數(shù)
禁止變量重名
禁止使用八進制
禁止使用轉(zhuǎn)義字符
禁止對只讀屬性賦值
禁止對一個使用getter方法讀取的屬性進行賦值
禁止刪除一個不允許刪除的屬性
變量名不能使用 "arguments" 字符串
由于一些安全原因展懈,在作用域 eval() 創(chuàng)建的變量不能被調(diào)用
禁止this關(guān)鍵字指向全局對象
使用構(gòu)造函數(shù)時销睁,如果忘了加new,this不再指向全局對象存崖,而是報錯
JavaScript 使用誤區(qū)
最常見的判斷錯誤
var x = 10;
var y = "10";
if (x == y)
true
在嚴格的比較運算中冻记,===為恒等計算符,同時檢查表達式的值與類型金句,如下
var x = 10;
var y = "10";
if (x ===y)
false
這種錯誤經(jīng)常會在switch語句中出現(xiàn)檩赢,switch語句會使用恒等計算符(===)進行比較
var x = 10;
switch(x) {
case 10: alert("Hello");//會執(zhí)行
}
var x = 10;
switch(x) {
case "10": alert("Hello");//不會執(zhí)行
}
加法與連接以及減法
var x = 10 + 5; // x 的結(jié)果為 15
var x = 10 + "5"; // x 的結(jié)果為 "105"
var x = "5" + 10; // x 的結(jié)果為 "510"
var x = 10 - "5"; // x 的結(jié)果為 5
var x = "5" - 10 ; // x 的結(jié)果為 -5
浮點型數(shù)據(jù)使用注意事項
var x = 0.1;
var y = 0.2;
var z = x + y // z 的結(jié)果為 0.3
if (z == 0.3) // 返回 false
<script>
var x = 0.1;
var y = 0.2;
var z = x + y;
document.getElementById("demo").innerHTML = z;
</script>
運行結(jié)果 0.30000000000000004
JavaScript中的所有數(shù)據(jù)都是以64為浮點型數(shù)據(jù)(float)來存儲
為了解決上述問題,可以用整數(shù)的乘除法來解決
var z = (x * 10 + y * 10) / 10; // z 的結(jié)果為 0.3
JavaScript this 關(guān)鍵字
面向?qū)ο笳Z言中 this 表示當前對象的一個引用。
但在 JavaScript 中 this 不是固定不變的贞瞒,它會隨著執(zhí)行環(huán)境的改變而改變偶房。
- 在方法中,this 表示該方法所屬的對象军浆。
- 如果單獨使用棕洋,this 表示全局對象。
- 在函數(shù)中乒融,this 表示全局對象掰盘。
- 在函數(shù)中,在嚴格模式下赞季,this 是未定義的(undefined)愧捕。
- 在事件中,this 表示接收事件的元素申钩。
- 類似 call() 和 apply() 方法可以將 this 引用到任何對象次绘。
函數(shù)
在 JavaScript 中, 函數(shù)是對象。JavaScript 函數(shù)有它的屬性和方法撒遣。
call() 和 apply() 是預定義的函數(shù)方法邮偎。 兩個方法可用于調(diào)用函數(shù),兩個方法的第一個參數(shù)必須是對象本身义黎。
function myFunction(a, b) {
return a * b;
}
myObject = myFunction.call(myObject, 10, 2); // 返回 20
function myFunction(a, b) {
return a * b;
}
myArray = [10, 2];
myObject = myFunction.apply(myObject, myArray); // 返回 20
兩個方法都使用了對象本身作為第一個參數(shù)禾进。 兩者的區(qū)別在于第二個參數(shù): apply傳入的是一個參數(shù)數(shù)組,也就是將多個參數(shù)組合成為一個數(shù)組傳入廉涕,而call則作為call的參數(shù)傳入(從第二個參數(shù)開始)泻云。
在 JavaScript 嚴格模式(strict mode)下, 在調(diào)用函數(shù)時第一個參數(shù)會成為 this 的值, 即使該參數(shù)不是一個對象火的。
在 JavaScript 非嚴格模式(non-strict mode)下, 如果第一個參數(shù)的值是 null 或 undefined, 它將使用全局對象替代壶愤。
閉包
變量聲明時如果不使用 var 關(guān)鍵字,那么它就是一個全局變量馏鹤,即使它在函數(shù)內(nèi)定義
閉包會持有父方法的局部變量并且不會隨父方法銷毀而銷毀
閉包這里的使用和理解單獨再寫個筆記吧征椒,東西可能有些多
JavaScript 閉包 深入理解