前端 基礎教程 將放入菜單欄中,便於閱讀! 是`web JavaScript JavaScript`是必備的前端技能。 是用來描述網頁的結構, 是用來描述網頁的延時,而 是用來描述網頁的行為的。 是一種高端,動態,弱類型的編程語言。來源於 ,它的一等函數來源於 ,原型來源於 。 windwo.onl ...
Web
前端-JavaScript
基礎教程
將放入菜單欄中,便於閱讀!
JavaScript
是web
前端開發的編程語言,大多數網站都使用到了JavaScript
,所以我們要進行學習,JavaScript
是必備的前端技能。
HTML
是用來描述網頁的結構,css
是用來描述網頁的延時,而JavaScript
是用來描述網頁的行為的。
JavaScript
是一種高端,動態,弱類型的編程語言。來源於Java
,它的一等函數來源於Scheme
,原型來源於Self
。
var x; // 聲明變數為x
x=0; // 給變數賦值為0
var student = {
name: "dashu",
age: "12"
};
// 通過"."或"[]"來訪問對象屬性
student.name;
student["age"];
// 創建新的屬性,進行添加操作
student.tall = "123";
// {}空對象,沒有屬性
student.dog = {};
var num = [1,2,3,4,5];
num[0];
num.length;
num[num.length-1];
// 添加新元素
num[num.length] = 6;
// 改變已有的元素
num[num.length] = 7;
// 定義空元素
var em = [];
em.length;
// 數組對象
var students = [
{ name: dashu1, age: 1 },
{ name: dashu2, age: 2 }
];
var dashu = {
dog: [ [1,2], [3,4] ],
dog1: [ [2,3] ]
};
function add(x) {
return x+1;
}
add(1);
var num = function(x) {
return x+1;
}
var arrs = []; // 定義空數組
arrs.push(1,2,3); // push()添加元素
arrs.reverse(); // 元素次序反轉
// 兩點
points.dist = function() {
var p1 = this[0];
var p2 = this[1];
// 數組的兩個元素
// x 軸距離
var a = p2.x - p1.x;
var b = p2.y - p2.y;
return Math.sqrt( a*a + b*b); //平方根
};
points.dist();
function da(x) {
if(x>=0){
return x;
}else{
return -x;
}
}
// 計算階乘
function da(n){
var num = 1;
while(n>1){
num *= n;
n--;
}
return num;
}
function Point(x,y) {
this.x = x;
this.y = y;
}
var a = new Point(1,1);
Point.prototype.r = function() {
return Math.sqrt{
this.x * this.x + this.y * this.y
};
}
p.r();
<html>
<head>
<script src="library.js"></script>
</head>
<body>
<p>html</p>
<script>
</script>
</body>
</html>
<script>
function add(){
var a = confirm("html");
if(a){
window.location = "";
}
}
setTimeout(add, 2222);
</script>
windwo.onload = function() {
var images = document.getElementsByTagName("img");
for(var i = 0; i<images.length; i++){
var image = images[i];
if(image.addEventListener){
image.addEventListener("click", hide, false);
}else{
image.attachEvent("onclick", hide);
}
}
}
font-weight: bold;
text-decoration: underline;
border: solid black 1px;
vertical-align: top;
保留字:
break, delete, function, return, typeof
case, do, if, switch, var
catch, else, in, this, void
continue, false, instanceof, throw, while
debugger, finally, new, true, with
default, for, null, try
class const enum export extends import super
implements let privae public yield
interface package protected static
abstract double gote native static
boolean enum implements package supper
byte export import private synchronized
char extends int protected throws
class final interface public transient
const float long short volatile
Math.pow() 次冪
Math.round() 四捨五入
Math.ceil() 向上求整
Math.floor() 向下求整
Math.abs() 求絕對值
Math.max()
Math.min()
Math.random() 隨機數
Math.PI 圓周率
Math.E 自然對數的底數
Math.sqrt() 平方根
Math.pow() 立方根
日期和時間:Date()
構造函數,創建時間和日期的對象。
var now = new Date(); 當前日期和時間
文本:是字元串,是由一組16位組成的不可變的有序列。
字元串
var s = "dashu";
s.charAt(0);
布爾值,在JavaScript
中有布爾值類型,為true
和false
。
null
在JavaScript
中表示空值,null
的typeof
運行為字元串object
。null為特殊的對象值,含義為非對象。
null
類型的唯一一個成語,它表示數字,字元串和對象是“無值”的。
undefined
值表示“空值”,表明變數沒有初始化,表明屬性或元素不存在,返回沒有值就為undefined
。值為“未定義”,運行typeof
時,返回的“undefined”。
全局屬性:
undefined,Infinity,NaN
String(),Number(),Boolean()
var s = "dashu";
var n = "123";
var b = true;
var S = new String(s);
var N = new String(n);
var B = new String(b);
"=="和"==="
第一個將原始值和其包裝對象視為相等
第二個則是視為不等
undefined, null, 布爾值, 數字, 字元串
數組和函數
var str = "dashu";
str.toUpperCase();
s;
var a = { x:1 };
a.x = 3;
a.y = 3;
var a = [1,2,3];
a[0]=2;
var a = { x: 1 };
var b = { x: 1 };
a === b // false
var a = [];
var b = [];
a === b; // false
對於上面的也是不相等的。
只有指向一樣的引用才是相等的。
var a = [];
var b = a;
b[0] = 1;
a[0]; // 1
a === b // true
複製數組:
var a = [ 1,2,3 ];
var b = [];
for(var i = 0; i<a.length; i++){
b[i] = a[i];
}
比較數組:
function equalArrays(a,b){
if(a.length != b.length) return false;
for(var i = 0; i<a.lenght; i++)
if(a[i] !== b[i]) return false;
return true;
}
類型轉換:
"2" * "3" // 6
undefined 轉 字元串 "undefined",數字"NaN",布爾值"false"
null 轉字元串"null", 數字為0
"" 空字元串 轉數字 0
相等:
null == undefined
"0" == 0
0 == false
"0" == false
Number("2"); // 2
String(false); // "false"
Boolean([]); // true
Object(2) // new Number(2);
toFixed
根據小數點後的指定數字轉字元串
var a = 1234.567;
a.toFixed(0) // "1234"
a.toFixed(2) // "1234.56"
parseInt("1 dash"); // 1
parseFloat(" 2, dashu") // 2
toString()
返回一個反映對象的字元串。
[1,2,3].toString(); // "1,2,3"
valueOf()
方法返回對象本身
變數聲明:
var i;
迴圈:
for(var i = 0; i<6; i++){
console.log(i);
};
for(var item in lists) console.log(item);
作用域:
var q = "dashu"; // 聲明一個全局變數
function add() {
var q = "da"; // 聲明一個局部變數
return q;
}
聲明全局變數可以不用var聲明
function test(item) {
var i = 0;
if(typeof item == "object"){
var j = 0;
for(var k = 0; k < 10; k ++){
console.log(k);
}
console.log(j);
}
}
函數定義表達式:
var a = function(x) {
return x++;
}
ECMAScript 6 入門
let
用於聲明變數,只有在所在代碼塊有效
{
let a = 1;
var b = 2;
}
a // ReferenceError: a is not defined.
b // 2
let
只有在它所在的代碼塊有效:
for (let i = 0; i < 10; i++) {
}
console.log(i);
// ReferenceError: i is not defined
for (let i = 0; i < 3; i++) {
let i = 'a';
console.log(i);
}
// a
// a
// a
函數內部變數i和迴圈變數i不在同一作用域。
// var
console.log(a); // 輸出undefined
var a= 2;
// let
console.log(b); // 報錯ReferenceError
let b= 2;
var
命令會發生變數的提升,運行時,變數a
已經存在了,而let
不會。
暫時性死區:
var a= 123;
if (true) {
a= '123'; // ReferenceError
let a;
}
如果一個變數沒有被聲明,不會報錯:
typeof a // "undefined"
如果調用函數,而函數中的參數變數沒有被聲明,就會導致死區,報錯。
// 不報錯
var a = a;
// 報錯
let a = a;
// ReferenceError: x is not defined
不可以重覆聲明:
// 報錯
function b() {
let a = 100;
var a = 10;
}
// 報錯
function b() {
let a = 100;
let a = 10;
}
塊級作用域的需要,如果沒有塊級作用域可能會覆蓋外層變數,塊級作用域,如,變數迴圈i,迴圈結束後,沒有消失,而是變為全局變數。
外層代碼塊不受內層代碼塊的影響。
function add() {
let a = 5;
if (true) {
let a = 1;
}
console.log(a); // 5
}
在ES6中允許使用塊級作用域中聲明函數。
const
命令
const
聲明常量的值,一旦聲明,就不能改變。
const PI = 3.14;
PI // 3.14
PI = 1;
// TypeError: Assignment to constant variable.
const
一旦聲明變數,就要進行初始化,不賦值,就報錯
const a;
// SyntaxError: Missing initializer in const declaration
const
只在聲明的塊中有效,聲明的變數不會提升,存在暫時性死區,不能重覆聲明,本質是指變數指向記憶體地址所保存的數據不能改動。
const a= {};
a.prop = b;
a.prop // b
// 將 a 指向另一個對象,就會報錯
a= {}; // TypeError: "a" is read-only
const ab = [];
ab.push('dashu'); // 可執行
ab.length = 0; // 可執行
ab = ['dashu']; // 報錯,這就導致了錯誤,因為把一個數組賦值給變數,就不是同個地址了
Object.freeze
對象凍結
const foo = Object.freeze({});
// 下麵一行不起作用;
// 會報錯
foo.prop = 12;
頂層對象
window.a = 1;
a // 1
a = 2;
window.a // 2
// es6開始
// var,function聲明變數是全局變數,是頂層對象的屬性
var a = 1;
window.a // 1
// let const class 聲明就不是了
let b = 1;
window.b // undefined
IE: trident內核
Firefox: gecko內核
Safari: webkit內核
Opera: Blink內核
Chrome: Blink
<!DOCTYPE>
聲明位於文檔中的最前面位置,處於<html>
標簽之前。
用於告訴瀏覽器文檔使用哪種HTML或XHTML規範。
區分Quirks
模式和Standards
模式區別:
Standards
模式是標準模式,遇到一個問題是以前的規則不相容新的規則,使用了新的功能,就弄個參數,如果等於就使用新的規則,不等於就使用之前的規則,這就是Quirks
模式。
區分與,佈局,樣式解析,腳本執行,三個方面。
div+css
佈局table
優點,改變的時候方便,只改css
文件,頁面載入速度快,結構化清晰,頁面顯示簡潔,表現與結構分離,易於seo優化。
JavaScript的數據類型有:
基本數據類型:
String, Boolean, Number, Undefined, Null
引用數據類型:
Object
JavaScript
中的繼承:
原型鏈繼承,構造函數繼承,組合繼承,寄生式繼承等
DOM
操作:
createDocumentFragment();
createElement()
createTextNode()
appendChild()
removeChild()
replaceChild()
insertBefore()
getElementsByTagName()
getElementsByName()
getElementsById()
JavaScript
中typeof
返回的數據:
object number function boolean underfined
JavaScript
本地對象可以實例化,內置對象不能實例化,宿主自帶document,window
。
var str = '123';
str = str.split('').reverse().join('');
// '321'
200:請求已成功
302:請求的資源臨時從不同的 URI 響應請求
403:伺服器已經理解請求,但是拒絕執行它
404:請求失敗
node.js, mongodb, npm, mvvm, react, angularjs, webpack等
應用 web 標準進行設計,99%的網站都需要被重構。
數組解構:
let a = 1;
let b = 2;
let c = 3;
let [a, b, c] = [1, 2, 3];
let [x, y, z] = new Set(['a', 'b', 'c']);
x // "a"
let [x = 1] = [undefined];
x // 1
let [x = 1] = [null];
x // null
var {x = 2} = {x: undefined};
x // 2
var {x = 2} = {x: null};
x // null
let {length : len} = 'hello';
len // 5
如何優化頁面的載入速度?
減少css文件的數量和大小,壓縮css和js文件代碼;圖片的大小;把css樣式表放在頂部,把js放置在底部;減少http請求數,使用外部js或css。
頁面性能優化:壓縮,合併,減少請求,diam層析優化
記憶體泄漏的原因有:記憶體泄漏是任何對象在不使用時它還存在,導致記憶體泄漏為setTimeout
,閉包,控制台日誌,迴圈等。
從伺服器推送數據到客戶端:
html5 websocket
websocket flash
庫:
jquery, yui, prototype, dojo, ext.js
框架:
modernizr, underscore, backbone
前端開發:
Sublime Text, Eclipse, Notepad, Firebug, HttpWatch
前端路由
是指
在不進行後端請求的情況下對頁面進行跳轉
雙向數據綁定:angular
單向數據綁定:knockout
單純地 View
層: React
jquery
優化,優先使用id
選擇器,jquery
如果要使用dom
元素,就建議存儲一個變數保存使用,使用dom
操作的過程非常耗性能。
class
前使用tag
。
jquery
操作dom
的框架,jqueryui
是基於jquery
做的一個ui
組件庫。
jquery
一個對象可以同時綁定多個事件,底層實現原理:addEventListener
與attachEvent
相容處理做事件註冊。
Jquery.extend
用來擴展 jQuery
對象本身
jquery.fn.extend
用來擴展 jQuery
實例的
如何將數組轉換為json
字元串,然後換回來?
$.parseJSON('{"name":"dashu"}');
JSON.stringify
在jquery.fn中的init返回的this指的是?返回this又是?
this
是執行init
構造函數自身的,其實就是jquery
實例對象,返回this
實現jquery
的鏈式操作。
http
狀態碼:
1##: 用於指定客戶端的動作;
2##: 用於表示請求成功;
3##: 用於定位頭信息;
4##: 用於指出客戶端的錯誤;
400 語義有誤
401 當前請求需要用戶驗證
403 伺服器已經接收請求,但拒絕執行
5##: 用於指出伺服器的錯誤
503: 服務不可用
前端開發優化:
減少http
請求次數,css,js
代碼壓縮,圖片大小控制適合,CDN
托管,Data
緩存。可以用innerHTML
代替dom
操作,減少dom
操作次數,優化js
性能。
可以多用className
,少用全局變數,緩存dom
節點。
少用css
表達式,圖片預載入,樣式放頂部,腳本放在底部,使用div+css
佈局。
var str=$("a").attr("href")
將數組轉化為 json
字元串
$.fn.stringifyArray = function(array) {
return JSON.stringify(array)
}
$.fn.parseArray = function(array) {
return JSON.parse(array)
}
jquery
是一個js
庫,而jquery ui
是在jquery
基礎上,利用jquery
的擴展性設計的插件。
sub,add.call(sub,3,1) == add(3,1)
alert(4);
function add(a,b){
alert(a+b);
}
function sub(a,b){
alert(a-b);
}
add.call(sub,3,1);
非同步載入方式:
defer, ie
async,
callBack
上述描述的json
術語是一種輕量級的數據交換格式,數據格式簡單,易於讀寫。
判斷對象是否屬於某個類:
instanceof
原型對象也是普通的對象,不為Null,就叫原型鏈
setInterval(fn1,500)// 重覆執行
setInterval(fn1(),500)// 只執行一次
原生
JavaScript
,return false;只阻止預設行為
jQuery中的return false; 既阻止預設行為,又阻止冒泡
事件委托指利用冒泡的原理,自己所要觸發的事件,讓其他元素取執行。
join()
表示用數據中所用元素拼接成字元串。
split()
把字元串分割開。
slice()
可以從已有的數組返回選定的元素。
splice()
從數據中添加或刪除,返回被刪除的部分數組。
閉包讀取函數內部的變數值,並保持在記憶體中。
apply()
和 call()
作用是一樣的,傳遞的參數就不同了。
Object.call(this,obj1,obj2,obj3)
Object.apply(this,arguments)
阻止冒泡:
ev.stopPropagation();
ev.cancelBubble = true;
高性能的JavaScript
?
使用DocumentFragment
,clone
,innerHTML
,switch
,三目運算符,setInterval
等。
call()
和apply()
區別在於apply
的參數是數組形式,而call
的參數是單個的值。
dom
操作:
createDocumentFragment()
createTextNode()
appendChild()
removeChild()
replaceChild()
insertBefore()
getElementsByTagName()
getElementsByName()
getElementById()
class Point {
add(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '('+this.x+', '+this.y+')';
}
}
判斷一個對象是否屬於某個類:
instanceof constructor
嚴格模式
"use strict";
function strict(){
"use strict";
return "這是嚴格模式。";
}
function notStrict() {
return "這是正常模式。";
}
window.onload()
方法需要等所有元素載入完畢才執行,$(document).ready
只要dom
結構載入完畢就行。
頁面載入性能優化:
壓縮css,js
文件;合併Js.css
文件,減少http
請求,使用外部js,css
文件,減少dom
操作。
this
:
var User = {
count: 1,
add: function() {
return this.count;
}
};
console.log(User.add());
var func = User.add;
console.log(func());
1 和 undefined
數組去重:
var arrs = [ 1,2,2,3,4 ];
function add(){
// 定義一個空數組
var newArr = [];
// 定義一個空對象
var obj = {};
// 定義索引
var index = 0;
// 定義數組的長度
var long = arr.length
// 迴圈索引
for(var i = 0; i<long; i++){
if(obj[arrs[i]]==undefined){
obj[arrs[i]] = 1;
newArr[index++] = arr[i];
}else if(obj[arrs[i]==1){
continue;
}
return newArr;
}
var new Arr2 = add(arrs);
}
// 數組去重:
function add(array){
var aaa = []; //一個新的臨時數組
for(var i = 0; i < array.length; i++){
if(aaa.indexOf(array[i]) == -1){
aaa.push(array[i]);
}
}
return temp;
}
var arr = [1,2,2,4,9,6,7,5,2,3,5,6,5];
console.log(add(arr));
function add(arr){
arr.sort();
for(var i = 0; i<arr.length-1; i++){
if(arr[i] == arr[i+1]){
arr.splice(i,1);
i--;
}
}
return arr;
}
function add(arr){
// 定義一個空數組
var newArr=[];
for(var i=0; i<arr.length; i++){
if(newArr.indexOf(arr[i]) == -1){
newArr.push(arr[i]);
}
}
return newArr;
}
function add(arr){
var obj = {};
var newArr = [];
for(var i = 0; i<arr.length; i++){
if(obj[arr[i]] == nudefined){
newArr.push(arr[i]);
obj[arr[i]] = 1;
}
}
return newArr;
}
ajax
的過程,創建XMLHttpRequest
對象,創建一個非同步調用對象,創建新的HTTP
請求,並指定HTPP
請求的方法,url
以及驗證信息,設置響應HTTP
請求狀態變化的函數,發送HTTP
請求,獲取非同步調用返回的數據。
如何解決跨域問題,跨域就是,協議,功能變數名稱,埠相同才同域,否則為跨域。ajax
不可以跨域獲取數據,可以獲取文件內容,使用js
腳本,函數調用,調用的參數為伺服器返回的數據。
ajax
請求,XMLHttpRequest
標準瀏覽器,ActiveXObject
ie瀏覽器:
var ha = null; // 創建對象
if(window.XMLHttpRequest){
ha = new XMLHttpRequest();
}else{
ha = new ActiveXObject("Microsoft.XMLHTTP");
}
ha.open(“方式”,”地址”,”標誌位”);//初始化請求
ha.setRequestHeader(“”,””);//設置 http 頭信息
ha.onreadystatechange =function(){}//指定回調函數
ha.send();//發送請求
標簽語義化複合物文檔語義的標簽。
用正確的標簽做正確的事情,html
語義化讓頁面的內容結構化,便於對瀏覽器,搜索引擎解析。
偽類清除浮動,after
偽元素,clear:both
,
window, document, location, screen, history, navigator
alert() open() close() setInterval() setTimeout() clearInterval() clearTimeout()
$.ajax({
url: "",
data: // post數組
dataType: "json",
type: "POST",
success: function(data){
},
error: function(){
}
});
記憶體泄漏:setTimeout
,閉包,控制台日誌,迴圈。
<script>
標簽的位置
<!DOCTYPE html>
<html>
<head>
<title></title>
<script></script>
</head>
<body>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script></script>
</body>
</html>
非同步腳本:
<script type="text/javascript" async src=""></script>
結言
好了,歡迎在留言區留言,與大家分享你的經驗和心得。
感謝你學習今天的內容,如果你覺得這篇文章對你有幫助的話,也歡迎把它分享給更多的朋友,感謝。
作者簡介
達叔,理工男,簡書作者&全棧工程師,感性理性兼備的寫作者,個人獨立開發者,我相信你也可以!閱讀他的文章,會上癮!,幫你成為更好的自己。長按下方二維碼可關註,歡迎分享,置頂尤佳。