1. 程式人生 > >看文章時發現的遺漏的點

看文章時發現的遺漏的點

Object.prototype.toString.call(obj).slice(8, -1)判斷其內建class


編譯型語言和解釋型語言

1、編譯型語言

需通過編譯器(compiler)將原始碼編譯成機器碼,之後才能執行的語言。一般需經過編譯(compile)、連結(linker)這兩個步驟

編譯是把原始碼編譯成機器碼,

連結是把各個模組的機器碼和依賴庫串連起來生成可執行檔案。

優點:編譯器一般會有預編譯的過程對程式碼進行優化。因為編譯只做一次,執行時不需要編譯,所以編譯型語言的程式執行效率高。可以脫離語言環境獨立執行。
缺點:編譯之後如果需要修改就需要整個模組重新編譯。編譯的時候根據對應的執行環境生成機器碼,不同的作業系統之間移植就會有問題,需要根據執行的作業系統環境編譯不同的可執行檔案。
代表語言:C、C++、Pascal、Object-C以及最近很火的蘋果新語言swift

2、解釋型語言

解釋性語言的程式不需要編譯,相比編譯型語言省了道工序,解釋性語言在執行程式的時候才逐行翻譯。
優點:有良好的平臺相容性,在任何環境中都可以執行,前提是安裝瞭解釋器(虛擬機器)。靈活,修改程式碼的時候直接修改就可以,可以快速部署,不用停機維護。
缺點:每次執行的時候都要解釋一遍,效能上不如編譯型語言。
代表語言:JavaScript、Python、Erlang、PHP、Perl、Ruby

3、混合型語言

既然編譯型和解釋型各有缺點就會有人想到把兩種型別整合起來,取其精華去其糟粕。就出現了半編譯型語言。比如C#,C#在編譯的時候不是直接編譯成機器碼而是中間碼,.NET平臺提供了中間語言執行庫執行中間碼,中間語言執行庫類似於Java虛擬機器。.net在編譯成IL程式碼後,儲存在dll中,首次執行時由JIT在編譯成機器碼快取在記憶體中,下次直接執行。Java先生成位元組碼再在Java虛擬機器中解釋執行。嚴格來說混合型語言屬於解釋型語言。C#更接近編譯型語言。

動態語言和靜態語言

1、動態語言

是一類在執行時可以改變其結構的語言:例如新的函式、物件、甚至程式碼可以被引進,已有的函式可以被刪除或是其他結構上的變化。通俗點說就是在執行時程式碼可以根據某些條件改變自身結構
主要動態語言:Object-C、C#、JavaScript、PHP、Python、Erlang。

2、靜態語言

與動態語言相對應的,執行時結構不可變的語言就是靜態語言。如Java、C、C++。

有三個名詞容易混淆:
Dynamic Programming Language (動態語言或動態程式語言)
Dynamically Typed Language (動態型別語言)
Statically Typed Language (靜態型別語言)

動態型別語言和靜態型別語言

1、動態型別語言

動態型別語言和動態語言是完全不同的兩個概念。

動態型別語言:是指在執行期間才去做資料型別檢查的語言,說的是資料型別,

動態語言:說的是執行是改變結構,說的是程式碼結構。
動態型別語言的資料型別不是在編譯階段決定的,而是把型別繫結延後到了執行階段。
主要語言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。

2、靜態型別語言

靜態語言的資料型別是在編譯期間(或執行之前)確定的,編寫程式碼的時候要明確確定變數的資料型別。
主要語言:C、C++、C#、Java、Object-C。

判斷頁面是在移動端還是PC端開啟

window.location.href = /Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent) ? "https://www.baidu.com/" :  "http://news.baidu.com/";複製程式碼

3、js中~~和^=分別代表什麼,用處是什麼?

先看個栗子:

複製程式碼
~~false === 0  
~~true === 1
~~undefined === 0 
~~!undefined === 1
~~null === 0
~~!null === 1  ~~"" === 0~~!"" === 1複製程式碼
複製程式碼

~是按位取反的意思,計算機裡面處理二進位制資料時候的非,~~就是再轉回來,利用兩個按位取反的符號,進行型別的轉換,轉換成數字符號。

~~能把undefined轉為0,number和parseInt只能轉為NaN!!!!!

而在計算機裡面的^=是異或運算,相同取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中的陣列的解構賦值,很方便的進行兩個變數的交換。 

4、this

這個this為啥 this==obj  為false

this == windon 也為false

但在node中為global

但如果不自執行,外面呼叫的話就是==obj

5、宣告提升

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"複製程式碼

6、localStorage存進去時是number 取出來就成string了

//示例一:
localStorage.setItem('test',1234567);
let test = localStorage.getItem('test');
console.log(typeof test, test); 

//示例二:
localStorage['name'] = '蘇南';
console.log(localStorage['name']);
/*
輸出:
"1234567" ,'蘇南',
這裡要注意,1234567 存進去時是number 取出來就成string了
*/
複製程式碼

7、undefined null ->number


7、字串與unicode的一些方法

字串的unicode表示法以及Unicode編碼大於65535的字元

"\u{20BB7}"; //��,如果看到的是亂碼,則自行在瀏覽器的console裡輸入本行程式碼檢視,下同

console.log("\u0041"); //A