需經過編譯器(compiler)將源代碼編譯成機器碼,以後才能執行的語言。通常需通過編譯(compile)、連接(linker)這兩個步驟。es6
編譯是把源代碼編譯成機器碼,web
連接是把各個模塊的機器碼和依賴庫串連起來生成可執行文件。編程
優勢:編譯器通常會有預編譯的過程對代碼進行優化。由於編譯只作一次,運行時不須要編譯,因此編譯型語言的程序執行效率高。能夠脫離語言環境獨立運行。
缺點:編譯以後若是須要修改就須要整個模塊從新編譯。編譯的時候根據對應的運行環境生成機器碼,不一樣的操做系統之間移植就會有問題,須要根據運行的操做系統環境編譯不一樣的可執行文件。
表明語言:C、C++、Pascal、Object-C以及最近很火的蘋果新語言swiftswift
解釋性語言的程序不須要編譯,相比編譯型語言省了道工序,解釋性語言在運行程序的時候才逐行翻譯。
優勢:有良好的平臺兼容性,在任何環境中均可以運行,前提是安裝瞭解釋器(虛擬機)。靈活,修改代碼的時候直接修改就能夠,能夠快速部署,不用停機維護。
缺點:每次運行的時候都要解釋一遍,性能上不如編譯型語言。
表明語言:JavaScript、Python、Erlang、PHP、Perl、Ruby
跨域
既然編譯型和解釋型各有缺點就會有人想到把兩種類型整合起來,取其精華去其糟粕。就出現了半編譯型語言。好比C#,C#在編譯的時候不是直接編譯成機器碼而是中間碼,.NET平臺提供了中間語言運行庫運行中間碼,中間語言運行庫相似於Java虛擬機。.net在編譯成IL代碼後,保存在dll中,首次運行時由JIT在編譯成機器碼緩存在內存中,下次直接執行。Java先生成字節碼再在Java虛擬機中解釋執行。嚴格來講混合型語言屬於解釋型語言。C#更接近編譯型語言。數組
是一類在運行時能夠改變其結構的語言:例如新的函數、對象、甚至代碼能夠被引進,已有的函數能夠被刪除或是其餘結構上的變化。通俗點說就是在運行時代碼能夠根據某些條件改變自身結構。
主要動態語言:Object-C、C#、JavaScript、PHP、Python、Erlang。瀏覽器
與動態語言相對應的,運行時結構不可變的語言就是靜態語言。如Java、C、C++。緩存
有三個名詞容易混淆:
Dynamic Programming Language (動態語言或動態編程語言)
Dynamically Typed Language (動態類型語言)
Statically Typed Language (靜態類型語言)bash
動態類型語言和動態語言是徹底不一樣的兩個概念。服務器
動態類型語言:是指在運行期間纔去作數據類型檢查的語言,說的是數據類型,
動態語言:說的是運行是改變結構,說的是代碼結構。
動態類型語言的數據類型不是在編譯階段決定的,而是把類型綁定延後到了運行階段。
主要語言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。
靜態語言的數據類型是在編譯期間(或運行以前)肯定的,編寫代碼的時候要明確肯定變量的數據類型。
主要語言:C、C++、C#、Java、Object-C。
window.location.href = /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent) ? "https://www.baidu.com/" : "http://news.baidu.com/";複製代碼
先看個栗子:
~~false === 0
~~true === 1
~~undefined === 0
~~!undefined === 1
~~null === 0
~~!null === 1 ~~"" === 0~~!"" === 1複製代碼
~是按位取反的意思,計算機裏面處理二進制數據時候的非,~~就是再轉回來,利用兩個按位取反的符號,進行類型的轉換,轉換成數字符號。
而在計算機裏面的^=是異或運算,相同取0,不一樣取1.
兩個整數交換能夠醬紫表示:
1
2
|
var
a = 10,b=20;
a ^= b; b^=a;a^=b;
|
將a = a ^= b; b = b^=a; a = a^=b;在js中相似於:
1
2
3
4
5
6
|
var
a = 1,b = 2;
a = a + b;
b = a - b;
a = a - b;
a
// 2
b
//1
|
不過這種方法適用於任意兩個數字類型的交換,不管是整數類型仍是小數。
其次,交換兩個變量,最簡單的方式是:
1
2
3
4
|
var
a = 2,b =
'Miya'
;
[a,b,] = [b,a,]
a
// Miya
b
//2
|
這個是ES6中的數組的解構賦值,很方便的進行兩個變量的交換。
上面的第一個,var obj; obj =xxxx 此時bind綁定的是已經聲明但沒賦值的obj,也就是undefined,這時候this指向的是window;;第二次obj已經聲明過了,因此展現出來的是第一個obj,因此他this不等於window也不等於新的obj
下面的是obj已聲明賦值,因此bind的就是obj
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
alert(a);複製代碼
這個的結果是 1
由於 function a (){} 等同於 var a = function () {}; 至關於聲明瞭一個變量
var a = 1; //defines "a" in global scope
function b() {
var a = function () {}; //defines "a" in local scope
a = 10; //overwrites local variable "a"
return;
}
b();
alert(a); //alerts global variable "a"複製代碼
//示例一:
localStorage.setItem('test',1234567);
let test = localStorage.getItem('test');
console.log(typeof test, test);
//示例二:
localStorage['name'] = '蘇南';
console.log(localStorage['name']);
/*
輸出:
"1234567" ,'蘇南',
這裏要注意,1234567 存進去時是number 取出來就成string了
*/
複製代碼
字符串的unicode表示法以及Unicode編碼大於65535的字符
"\u{20BB7}"; //��,若是看到的是亂碼,則自行在瀏覽器的console裏輸入本行代碼查看,下同
console.log("\u0041"); //A
原型繼承
構造繼承
組合繼承
class a {constructor(){}} //類聲明不會提高複製代碼
super 複製代碼
static
關鍵字用來定義一個類的一個靜態方法。調用靜態方法不須要實例化該類,但不能經過一個類實例調用靜態方法。直接經過類自己來調用
extends
關鍵字在類聲明或類表達式中用於建立一個類做爲另外一個類的一個子類。
hasOwnProperty
是 JavaScript 中處理屬性而且不會遍歷原型鏈的方法之一。(另外一種方法: Object.keys()
);可是hasOwnProperty能夠判斷出enumerable爲false的,Object.keys()不能夠遍歷出來
域名和dns解析對應的ip也算跨域(我我的認爲是由於瀏覽器進行跨域判斷,而dns解析是在dns服務器進行解析的,因此瀏覽器並不知道)