JavaScript小知識彙總

JavaScript小知識彙總

(本篇內容全部來自w3school)

操作符

===表示值和類型是否都相等

詳見JS Operators

數據類型

undefined

如果一個變量聲明瞭但是沒賦值,則該變量的值就是 undefined,類型也是 undefined .

var car;// Value is undefined, type is undefined

null

null表示nothing,通常被認爲變量不存在的意思。
但是,在JS中,null的類型是object。

var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
person = null;// Now value is null, but type is still an object

可以使用undefined將值設爲空。

var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
person = undefined;   // Now both value and type is undefined

null與undefined的不同

typeof undefined   // undefined
typeof null// object

null === undefined // false
null == undefined  // true

原始數據類型

typeof操作符會返回4種原始類型:

  • string
  • number
  • boolean
  • undefined

詳見JS DataTypes

變量作用域

JS有兩種類型的作用域:

  • Local Scope(本地作用域)

  • Global Scope(全局作用域)

在函數內聲明的變量,就是本地類型。只能被本函數訪問。
在函數外聲明的變量,就是全局類型。在頁面的所有腳本和函數都能訪問。

自動全局(Automatically Global)
如果在一個函數中,對一個未聲明的變量賦值,則該變量自動轉爲全局變量。
myFunction();

// code here can use carName 

function myFunction() {
    carName = "Volvo";
}

大多數瀏覽器都支持”Strict Mode”,該模式下,不會進行自動轉換爲全局變量的操作。

詳見JS Scope

字符串

長字符串換行

因爲有的瀏覽器可能不支持,所以不推薦反斜槓的方式:

document.getElementById("demo").innerHTML = "Hello \
Dolly!";

最好使用+號的方式:

document.getElementById("demo").innerHTML = "Hello " + 
"Dolly!";

字符串對象

通常,字符串是個原始類型,但也可以以對象的方式創建:

var x = "John";
var y = new String("John");

// typeof x will return string
// typeof y will return object

不推薦以對象的方式創建字符串,這樣會拖慢執行速度,同時也會造成其他後果:

var x = "John"; 
var y = new String("John");

// (x == y) is true because x and y have equal values
// (x === y) is false because x and y have different types (string and object)

或者更糟:

var x = new String("John"); 
var y = new String("John");

// (x == y) is false because x and y are different objects
// (x === y) is false because x and y are different objects

詳見JS Strings

JS String Methods

slice()

slice()可以截取字符串的一部分,返回一個新字符串。
兩個參數:第一個是其實位置;第二個是結束位置。
如果參數是負數,則位置從末尾算起。

var str = "Apple, Banana, Kiwi";
var res = str.slice(-12, -6);

Banana

如果省略第二個參數,則表示從起始位置到結束。

substring()

substring()與slice()類似,不同的是不接受負數。

substr()

substr()與slice()類似,不同的是第二個參數表示長度。

replace()

replace()函數將字符串的特定字符替換,並返回一個新字符串。
replace()函數並不改變原字符串。
默認情況,replace函數是大小寫敏感的,並且只替換第一個匹配項。可以使用正則表達式來解決這個問題。

str = "Please visit Microsoft!";
var n = str.replace(/MICROSOFT/i, "W3Schools");

注意:正則表達式是沒有引號的。

trim()

trim()會移除字符串兩邊的空格。
在IE 8及更低版本的IE中不被支持。
可以使用正則表達式:

var str = "   Hello World!      ";
alert(str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''));

也可以通過再String.prototype中增加trim函數:

if (!String.prototype.trim) {
    String.prototype.trim = function () {
    return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
};
var str = "   Hello World!      ";
alert(str.trim());

charAt()

charAt函數返指定位置的字符。

charCodeAt()

charCodeAt函數返回指定位置的unicode編碼。

像使用數組一樣訪問字符串是不安全的

原因主要是不安全並且不可預測的:

  • 並不是所有瀏覽器都支持。(如IE5,IE6,IE7)
  • 是字符串看起來像數組,但實際上它們不是。
  • str[0]=”H”並不會報錯,但實際上並不會起作用。

split()

split函數可以將字符串轉爲數組。

var txt = "Hello";   // String
txt.split("");   // Split in characters

toUpperCase()

將字符串轉爲大寫。

toLowerCase()

將字符串轉爲小寫。

詳見JS String Methods

數字類型

JS的數字都是64位的浮點型。

JS沒有像其它語言一樣,定了整型、短整型、長整型等。
JS數字都是按IEEE 754標準,存儲未雙精度浮點類型。

存儲格式:
Value (aka Fraction/Mantissa) Exponent Sign
52 bits (0 - 51) 11 bits (52 - 62) 1 bit (63)

精度

整型(非科學表示法)最高到15位數字。

var x = 999999999999999;   // x will be 999999999999999
var y = 9999999999999999;  // y will be 10000000000000000

小樹最高到17位,但是浮點型不是100%精確。

var x = 0.2 + 0.1; // x will be 0.30000000000000004
To solve the problem above, it helps to multiply and divide:
var x = (0.2 * 10 + 0.1 * 10) / 10;       // x will be 0.3

數字字符串

JS會嘗試在一個數字操作中將數字字符串轉換爲數字。

var x = "100";
var y = "10";
var z = x / y;   // z will be 10

但是+號除外:

var x = "100";
var y = "10";
var z = x + y;   // z will not be 110 (It will be 10010)

NaN

NaN是JS的保留字,表示非法數字。
當操作非數字的字符串是,會返回NaN。(Not a Number):

var x = 100 / "Apple";  // x will be NaN (Not a Number)
isNaN(x);   // returns true because x is Not a Number

var x = NaN;
var y = 5;
var z = x + y;         // z will be NaN

var x = NaN;
var y = "5";
var z = x + y;         // z will be NaN5

typeof NaN;            // returns "number"

Infinity

Infinity或-Infinity表示超出最大範圍的數字。

var x =  2 / 0;  // x will be Infinity
var y = -2 / 0;  // y will be -Infinity
typeof Infinity;        // returns "number"

Hexadeximal

以0x開頭的數字被認爲是16進制。

var x = 0xFF;   // x will be 255

默認,JS以10進制顯示數字。

var myNumber = 32;
myNumber.toString(10);   // returns 32
myNumber.toString(32);  // returns 10
myNumber.toString(16);  // returns 20
myNumber.toString(8);   // returns 40
myNumber.toString(2);   // returns 100000

數字對象

可以使用new創建數字對象:

var x = 123;
var y = new Number(123);

// typeof x returns number
// typeof y returns object

不推薦使用數字對象:

var x = 500; 
var y = new Number(500);

// (x == y) is true because x and y have equal values

var x = 500; 
var y = new Number(500);

// (x === y) is false because x and y have different types

var x = new Number(500); 
var y = new Number(500);

// (x == y) is false because objects cannot be compared

JS數字操作函數

toExponential()

toExponential函數返回數字的指數形式的字符串。

var x = 9.656;
x.toExponential(2); // returns 9.66e+0
x.toExponential(4); // returns 9.6560e+0
x.toExponential(6); // returns 9.656000e+0

toFixed()

toFixed返回指定小數位數的小數。

var x = 9.656;
x.toFixed(0);   // returns 10
x.toFixed(2);   // returns 9.66
x.toFixed(4);   // returns 9.6560
x.toFixed(6);   // returns 9.656000

toPrecision()

toPrecision返回指定位數的數字。

var x = 9.656;
x.toPrecision();// returns 9.656
x.toPrecision(2); // returns 9.7
x.toPrecision(4); // returns 9.656
x.toPrecision(6); // returns 9.65600

valueOf()

在JS中,數字可以是原始類型(typeof = number),也可以是對象類型(typeof = object).valueOf用於將數字對象轉換爲原始類型。

JS的所有數據類型都有valueOf和toString函數。

將變量轉換爲數字

有三個函數可以將變量轉換爲數字:

  • Number()
  • parseInt()
  • parseFloat()

Number()

Number()用於將變量轉換爲數字。

Number(true);  // returns 1
Number(false); // returns 0
Number("10");  // returns 10
Number("  10");// returns 10
Number("10  ");// returns 10
Number("10 20");   // returns NaN 
Number("John");// returns NaN

If the number cannot be converted, NaN (Not a Number) is returned.

Number()也可以轉換Date類型的數據。

Number(new Date("2017-09-30"));// returns 1506729600000
The Number() method above returns the number of milliseconds since 1.1.1970.

parseInt()

parseInt解析字符串,並返回一個數字。可以空格分割,只返回第一個數字:

parseInt("10"); // returns 10
parseInt("10.33");  // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN 

parseFloat()

parseFloat()解析字符串,並返回數字。可以空格分割,只返回第一個數字:

parseFloat("10");// returns 10
parseFloat("10.33"); // returns 10.33
parseFloat("10 20 30");  // returns 10
parseFloat("10 years");  // returns 10
parseFloat("years 10");  // returns NaN

Number的屬性

Number.MAX_VALUE 返回最大數值
Number.Min_VALUE 返回最小數值
Number.NEGATIVE_INFINITY 表示負無限
Number.NaN 表示非數字
Number.POSTIVE_INFINITY 表示正無限

不能在變量上使用這些屬性,如x.MAX_VALUE。

詳見JS Number Methods

數組

數組的typeof類型是object。
可以使用Array.isArray()判斷是否數組。
也可以自己實現一個isArray函數。

function isArray(x) {
    return x.constructor.toString().indexOf("Array") > -1;
}

也可以使用instanceof來判斷。

var fruits = ["Banana", "Orange", "Apple", "Mango"];

fruits instanceof Array // returns true

不要使用new創建數組,可以使用[]代替。

var points = new Array(); // Bad
var points = [];  // Good 

toString()

可以將數組轉換爲逗號分割的字符串。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
document.getElementById("demo").innerHTML = fruits.toString();
Banana,Orange,Apple,Mango

join()

join函數將數組所有元素組成一個字符串。跟toString類似,但是可以自己指定分隔符。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
document.getElementById("demo").innerHTML = fruits.join(" * ");

Banana * Orange * Apple * Mango

pop

pop函數將數組的最後一個元素移除。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x = fruits.pop();  // the value of x is "Mango"

push

push將一個新元素加入到數組中,並且返回數組長度。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x = fruits.push("Kiwi");   //  the value of x is 5

shift

shift函數與pop類似,不同的是移除第一個元素而不是最後一個。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.shift(); // Returns "Banana"

unshift

unshift函數會在數組頭部增加一個新元素。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.unshift("Lemon");// Returns 5

change elements

使用數組下標索引,修改數組中的值。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits[0] = "Kiwi";// Changes the first element of fruits to "Kiwi"

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits[fruits.length] = "Kiwi";  // Appends "Kiwi" to fruit

delete elements

可以使用delete關鍵字刪除數組中的某個元素。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
delete fruits[0];   // Changes the first element in fruits to undefined

使用delete會在數組中留下一個未定義的值,應該使用pop或shift替代。

splice

splice可以向數組中增加新的元素。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2, 0, "Lemon", "Kiwi");

第一個參數表示需要添加元素的起始位置;
第二個參數表示有幾個元素需要移除。
剩下的參數表示需要添加的數組元素。

也可以使用splice移除數組元素。(除了前面兩個元素,後面不傳需要增加的元素即可)

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(0, 1);// Removes the first element of fruits

concat

concat可以將已有的數組合並並返回一個新數組。
concat不會改變原數組。

var arr1 = ["Cecilie", "Lone"];
var arr2 = ["Emil", "Tobias", "Linus"];
var arr3 = ["Robin", "Morgan"];
var myChildren = arr1.concat(arr2, arr3); // Concatenates arr1 with arr2 and arr3

slice

slice函數將原數組切成一個新數組。

var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
var citrus = fruits.slice(1, 3);

第一個參數爲起始位置。
第二個參數爲結束位置,並不包括該位置。如果不傳第二個參數,則截取剩下所有元素。

字符串自動轉換

在需要原始類型的地方,數組會自動轉換爲字符串。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
document.getElementById("demo").innerHTML = fruits;

sort

sort函數按字符序排序數組。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();// Sorts the elements of fruits

reverse

reverse方法用於將數組中的元素調轉順序。

數字排序

默認情況下,sort函數將元素按照字符串類型排列。
對於字符串類型可以正常運行,比如“apple”在“banbana”前面;但是對於數字,“25”比“100”大,因爲“2”比“1”大。所以,對於數字類型的數組,sort函數產生不正確的結果。
可以使用自定義函數排序:

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});

隨機排序:

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return 0.5 - Math.random()});

Math.max

可以使用Math.max找出數組中的最大值。

function myArrayMax(arr) {
    return Math.max.apply(null, arr);
}

也可以使用Math.min找出數組中的最小值。

Array.forEach

forEach函數對於數組中的每個元素都調用一次函數。

var txt = "";
var numbers = [4, 9, 16, 25];
numbers.forEach(myFunction);

function myFunction(value, index, array) {
    txt = txt + item + "<br>"; 
}

注意函數有三個參數,元素值、索引、數組本身。

Array.Map

map函數對數組的每個元素執行一次函數,並返回一個新數組。

var numbers1 = [4, 9, 16, 25];
var numbers2 = numbers1.map(myFunction);

function myFunction(value, index, array) {
    return val * 2;
}

map函數對於數組中沒有值的元素不會執行函數。
map函數不會改變原數組的值。

Array.filter

filter函數篩選原數組的值,並返回一個新數組。

var numbers = [4, 9, 16, 25];
var over18 = numbers.filter(myFunction);

function myFunction(value, index, array) {
    return value > 18;
}

Array.reduce

reduce函數將數組返回一個值。
如數組求和:

var numbers1 = [4, 9, 16, 25];
var sum = numbers1.reduce(myFunction);

function myFunction(total, value, index, array) {
    return total + value;
}

total參數是指初始值或者前一個返回值。

Array.every

every函數測試是否所有元素都滿足條件。
比如檢查所有數字是否大於某個值:

var numbers = [4, 9, 16, 25, 29];
var allOver18 = numbers.every(myFunction);

function myFunction(value, index, array) {
    return value > 18;
}

Array.indexOf

在數組中查找某個元素第一次匹配的地方並返回索引。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var a = fruits.indexOf("Apple");

還可以在後面傳起始位置參數。

Array.lastIndexOf

查找某個元素最後一次匹配的地方,並返回索引。

var fruits = ["Banana", "Orange", "Apple", "Mango"];
var a = fruits.lastIndexOf("Apple");

還可以在後面傳起始位置參數。

JS Math

Math.PI

返回PI值。

Math.PI;// returns 3.141592653589793

Math.round

round函數對小數進行四捨五入。

Math.round(4.7);// returns 5
Math.round(4.4);// returns 4

Math.pow

pow函數返回x的y次冪。

Math.pow(8, 2); // returns 64

Math.sqrt

sqrt函數返回參數的平方根。

Math.sqrt(64);  // returns 8

Math.abs

abs函數返回參數的絕對值。

Math.abs(-4.7); // returns 4.7

Math.ceil

ceil函數將小數向上取整。

Math.ceil(4.4); // returns 5

Math.floor

floor函數將小數向下取整。

Math.floor(4.7);// returns 4

Math.sin

sin函數返回參數的正弦值。
如果要重角度替代弧度,需要將角度轉爲弧度。
Angle in radians = Angle in degrees x PI / 180.

Math.sin(90 * Math.PI / 180); // returns 1 (the sine of 90 degrees)

Math.cos

返回參數的餘弦值。(同sin)

Math.cos(0 * Math.PI / 180); // returns 1 (the cos of 0 degrees)

Math.min

返回數組的最小值。

Math.max

返回數組的最大值。

Math.random

random產生[0,1)之間的隨機數。

Math.random(); // returns a random number

Math屬性

Math.E// returns Euler's number
Math.PI   // returns PI
Math.SQRT2// returns the square root of 2
Math.SQRT1_2  // returns the square root of 1/2
Math.LN2  // returns the natural logarithm of 2
Math.LN10 // returns the natural logarithm of 10
Math.LOG2E// returns base 2 logarithm of E
Math.LOG10E   // returns base 10 logarithm of E

詳見JS Math

隨機數

Math.random返回[0,1)之間的隨機數。
返回其他大小的整型:

Math.floor(Math.random() * 10); // returns a random integer from 0 to 9

Math.floor(Math.random() * 11);  // returns a random integer from 0 to 10

可以定義隨機函數[x,y):

function getRndInteger(min, max) {
    return Math.floor(Math.random() * (max - min) ) + min;
}

也可以定義隨機函數[x,y]:

function getRndInteger(min, max) {
    return Math.floor(Math.random() * (max - min + 1) ) + min;
}

詳見JS Random

布爾值

var x = 0;
Boolean(x);   // returns false

var x = -0;
Boolean(x);   // returns false

var x = "";
Boolean(x);   // returns false

//undefined
var x;
Boolean(x);   // returns false

var x = null;
Boolean(x);   // returns false

//NaN
var x = 10 / "H";
Boolean(x);   // returns false

var x = new Boolean(false); 
var y = new Boolean(false);

// (x == y) is false because objects cannot be compared

詳見JS Booleans

跳轉

continue關鍵字,無論帶不帶label,都會跳過當前循環。
The continue statement (with or without a label reference) can only be used to skip one loop iteration.

break關鍵字,如果不帶label,會跳出當前的循環或switch。
The break statement, without a label reference, can only be used to jump out of a loop or a switch.

break關鍵字,帶label,會跳出當前代碼塊。代碼塊由{}包裹。
With a label reference, the break statement can be used to jump out of any code block.

詳見JS Break

類型轉換

JS有5中不同的數據類型:

  • string
  • number
  • boolean
  • object
  • function

對象類型有三種:

  • Object
  • Date
  • Array

還有兩種不包含值的類型:

  • null
  • undefined

構造函數原原型

"John".constructor// Returns function String()  {[native code]}
(3.14).constructor// Returns function Number()  {[native code]}
false.constructor // Returns function Boolean() {[native code]}
[1,2,3,4].constructor // Returns function Array()   {[native code]}
{name:'John',age:34}.constructor  // Returns function Object()  {[native code]}
new Date().constructor// Returns function Date(){[native code]}
function () {}.constructor// Returns function Function(){[native code]}

可以用函數原型判斷是否數組:

function isArray(myArray) {
    return myArray.constructor.toString().indexOf("Array") > -1;
}

也可以直接判斷該對象是不是數組:

function isArray(myArray) {
    return myArray.constructor === Array;
}

Unary + Operator

單+符號可以將變量轉換爲數字。

var y = "5";  // y is a string
var x = + y;  // x is a number

自動轉換

5 + null// returns 5 because null is converted to 0
"5" + null  // returns "5null"   because null is converted to "null"
"5" + 2 // returns "52"  because 2 is converted to "2"
"5" - 2 // returns 3 because "5" is converted to 5
"5" * "2"   // returns 10because "5" and "2" are converted to 5 and 2 

詳見JS Type Conversion

正則表達式

格式: /pattern/modifiers;

正則表達式通常用於字符串的兩個函數中:search和replace。

var str = "Visit W3Schools";
var n = str.search(/w3schools/i);

var str = "Visit Microsoft!";
var res = str.replace(/microsoft/i, "W3Schools");

修飾符(modifiers):

  • i 大小寫不敏感
  • g 全局搜索,而不是在第一個匹配的地方停止
  • m 多行搜索

模式:

  • [abc] 查找括號中的任一字符
  • [0-9] 查找括號中的任一數字
  • (x|y) 查找|號分割的任意字符

元字符:

  • \d 數字
  • \s 空格符號
  • \b 匹配詞的開頭和結尾
  • \uxxxx 查找16進製表示的unicode字符。

數量符號:

  • n+ 表示匹配一個或多個字符n
  • n* 表示匹配0個或多個字符n
  • n? 表示匹配0個或1個字符n

test

test函數查找一個字符串或模式,返回true或false。

var patt = /e/;
patt.test("The best things in life are free!");
true

exec

exec查找一個字符串或模式,並返回找到的字符串。

/e/.exec("The best things in life are free!");
e

詳見JS RegExp

異常

使用try catch捕獲異常。

<p id="demo"></p>

<script>
try {
    adddlert("Welcome guest!");
}
catch(err) {
    document.getElementById("demo").innerHTML = err.message;
}
</script>

throw

throw可以拋出一個自定義異常。

throw "Too big";// throw a text
throw 500;  // throw a number

finally

finally塊,不論代碼執行結果如何,finally塊中的代碼都會執行。

Error Object

error對象有兩個屬性:

  • name 錯誤的名稱
  • message 錯誤的信息

詳見JS Errors

Strict Mode

在腳本或者函數起始處,使用”use strict”聲明,會使用strict mode,比如強制變量聲明、不允許使用關鍵字爲變量名等。

"use strict";
x = 3.14;// This will cause an error

this關鍵字

var person = {
    firstName: "John",
    lastName : "Doe",
    id   : 5566,
    fullName : function() {
        return this.firstName + " " + this.lastName;
    }
};

在函數定義中,this表示該函數的所有者。
在上例中,this表示person對象。
person對象包含fullName函數。

默認綁定

當單獨使用this時,this表示全局對象。
在瀏覽器中,全局對象表示對象窗口。

var x = this;

在stric mode下,this是undefined,因爲該模式下不允許默認綁定。

詳見JS this Keyword

最佳實踐

避免使用全局變量

全局變量和函數會被其他腳本覆蓋。

永遠聲明局部變量

所有在函數中使用的變量都要使用var聲明爲局部變量,否則會被自動轉換爲全局變量。

strict mode可以禁止未聲明的變量

在起始處聲明變量

在腳本或函數的起始處聲明變量。

  • 代碼更清晰
  • 只有頭部放置局部變量,可以很容易排查
  • 可以很容易的避免自動轉換爲全局變量
  • 減少重複聲明的可能性

初始化變量

代碼更清晰
只有一個地方初始化
避免未定義的值

永遠不要使用Number、String或Boolean對象

對於這三種類型,要永遠使用原始類型,而不是對象類型。

不要使用new創建對象

  • 使用{}代碼new創建對象
  • 使用”“代替創建String對象
  • 使用0代替Number對象
  • 使用false代替Boolean對象
  • 使用[]代替Array對象
  • 使用/()/代替RegExp對象
  • 使用function(){}代替Function對象

注意自動類型轉換

JS是鬆散類型的語言。一個變量可以保護不同的數據類型,而且變量也可以改變數據類型。

var x = "Hello"; // typeof x is a string
x = 5;   // changes typeof x to a number

使用===比較

==號會在比較前進行類型轉換。
===同時會比較類型和值。

使用參數默認值

如果函數調用缺少參數,則該參數會被設爲undefined。比較好的做法是給該值設默認值。

function myFunction(x, y) {
    if (y === undefined) {
        y = 0;
    }
}

在switch語句中使用default

要使用default關鍵字結束switch語句。

避免使用eval

eval函數用於運行一段文本代碼。在大多數情況下,都不需要使用它。
因爲隨機代碼的運行,會有安全問題。

詳見JS Best Practice

常見錯誤

Undefined is not NUll

可以將一個對象與undefined比較,但是不能將一個undefined類型的對象與null比較,這樣做會拋出異常。

Incorrect: 
if (myObj !== null && typeof myObj !== "undefined") 

Correct:
if (typeof myObj !== "undefined" && myObj !== null) 

代碼塊範圍

JS並不會爲每個代碼塊創建新的作用域範圍。

for (var i = 0; i < 10; i++) {
    // some code
}
return i;

詳見JS Mistakes

性能

減少循環中的操作

循環中的每個語句,包括循環表達式,會在每次循環時執行。

Bad:
var i;
for (i = 0; i < arr.length; i++) {

Better:
var i;
for (i = 0; i < arr.length; i++) {

減少DOM的訪問

訪問DOM非常慢,如果要多次訪問,可以賦值給變量:

var obj;
obj = document.getElementById("demo");
obj.innerHTML = "Hello";

減少DOM個數

儘量減少頁面的元素個數。這樣可以改善頁面加載,加速頁面渲染,特別是在小的設備上。如果DOM個數少,那每次查找消耗的時間也會比較少。

減少不必要的變量

不要創建不需要存儲值的變量。

var fullName = firstName + " " + lastName;
document.getElementById("demo").innerHTML = fullName;

Better:
document.getElementById("demo").innerHTML = firstName + " " + lastName

延遲加載JS

將腳本放在頁面的底部,讓瀏覽器首先加載頁面。
當腳本在下載時,瀏覽器不會開始其他的下載。解析和渲染都會被阻塞。
Http規格定義瀏覽器不應該併發下載超過兩個組件。
替代做法是使用defer=”true”。defer屬性會告訴瀏覽器在頁面解析完之後再執行腳本,但是隻對外部腳本起作用。
也可以在頁面加載完後,通過代碼將腳本包含進來。

<script>
window.onload = function() {
    var element = document.createElement("script");
    element.src = "myScript.js";
    document.body.appendChild(element);
};
</script>

不要使用with

使用with關鍵字,會對速度有負面影響。
在strict模式下會禁用該關鍵字。

詳見JS Performance

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章