1. 程式人生 > >你不知道的 JavaScript 基礎細節

你不知道的 JavaScript 基礎細節

efi 模式 java 公眾 取字符串 檢測 需要 閾值 add

語法部分

  1. type 屬性: 默認的 type 就是 javascript, 所以不必顯式指定 type 為 javascript

  2. javascript 不強制在每個語句結尾加 “;” , javascript 會自動加分號, 但是在某些情況下會改變程序的語義, 所以最好主動加 “;”

  3. 兩個相等運算符比較

    ‘==’ 相等( 值相等 ), 它會自動轉換數據類型再比較, 很多時候會得到非常詭異的結果

    ‘===’ 嚴格相等( 數據類型和值都相等 ) , 它不會自動轉換數據類型, 如果數據類型不一致, 返回false, 如果一致, 再比較

  4. NaN 與所有其他值都不相等, 包括它自己:

    NaN === NaN; // false

    唯一能判斷 NaN 的方法是通過 isNaN() 函數

    isNaN(NaN); // true

  5. 浮點數比較

    浮點數在運算過程中會產生誤差, 因為計算機無法精確表示無限循環小數。 要比較兩個浮點數是否相等, 只能計算它們之差的絕對值, 看是否小於某個閾值:Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true

  6. null 和 undefined

    大多數情況下,我們都應該用 null , undefined 僅僅在判斷函數參數是否傳遞的情況下有用

  7. 出於代碼的可讀性考慮,創建數組建議使用 ‘[ ]‘,而不使用 ‘new Array‘;

  8. 如果一個變量沒有通過 ‘var‘ 聲明就被使用,那麽該變量就自動被聲明為全局變量。使用 var 聲明的變量則不是全局變量,它的範圍就該被限制在該變量被聲明的函數體內

  9. 啟用 strict 模式(強制通過 var 聲明變量)

  10. 多行字符串用反引號表示

  11. 使用模版字符串

  12. 要獲取字符串某個指定位置的字符,使用類似 Array 的下標操作, 索引號從 0 開始。 字符串是不可變的, 如果對

    字符串的某個索引賦值, 不會有任何錯誤,但是也沒有任何效果

  13. 直接給 Array 的 length 賦一個新的值會導致 Array 大小的變化

  14. 如果通過索引賦值時, 索引超過了範圍, 同樣會引起 `Array` 大小的變化, 但是不會有任何錯誤, 在編寫代碼時, 不建議直接修改 `Array` 的大小, 訪問索引時要確保索引不會越界

  15. 數字 30 和字符串 ‘30‘ 是不同的元素

  16. slice() 的起止參數包括開始索引, 不包括結束索引。

  17. 如果不給 slice() 傳遞任何參數, 它就會從頭到尾截取所有元素。 利用這一點, 我們可以很容易地復制一個 Array

  18. 空數組繼續 `pop` 不會報錯,而是返回 `undefined`

  19. `concat()` 方法並沒有修改當前 `Array`, 而是返回了一個新的 `Array`,`concat()` 方法可以接收任意個元素和 `Array`, 並且自動把 `Array` 拆開, 然後全部添加到新的 `Array` 裏

  20. `javascript` 對象屬性名必須是一個有效的變量名。 如果屬性名包含特殊字符, 就必須用 `‘‘` 括起來

  21. 如果我們要檢測 `xiaoming` 是否擁有某一屬性, 可以用in操作符, 不過要小心, 如果 `in` 判斷一個屬性存在, 這個屬性不一定是`xiaoming` 的, 它可能是 `xiaoming` 繼承得到的

  22. 要判斷一個屬性是否是 `xiaoming` 自身擁有的,而不是繼承得到的,可以用 `hasOwnProperty()` 方法

  23. JavaScript把 `null`、`undefined`、`0`、`NaN` 和空字符串 `‘‘` 視為 `false`,其他值一概視為 `true`

  24. 由於 `Array` 也是對象, 而它的每個元素的索引被視為對象的屬性, 因此, `for ... in` 循環可以直接循環出 `Array` 的索引

  25. `for ... in` 循環由於歷史遺留問題, 它遍歷的實際上是對象的屬性名稱, `for ... of` 循環則完全修復了這些問題, 它只循環集合本身的元素

web前端/html5學習群:250777811

函數

  1. 函數如果沒有 `return` 語句, 函數執行完畢後也會返回結果, 只是結果為 `undefined`

  2. 由於 `JavaScript` 允許傳入任意個參數而不影響調用, 因此傳入的參數比定義的參數多也沒有問題, 雖然函數內部並不需要這些參數, 傳入的參數比定義的少也沒有問題

  3. 關鍵字 `arguments` 類似 `Array` 但它不是一個 `Array`

  4. 不在任何函數內定義的變量就具有全局作用域。 實際上, `JavaScript` 默認有一個全局對象 `window`。 以變量方式 `var foo = function () {}` 定義的函數實際上也是一個全局變量。

  5. 用 `var that = this;` , 你就可以放心地在方法內部定義其他函數,而不是把所有語句都堆到一個方法中。 對於普通函數調用, 通常把 `this` 綁定為 `null`。

  6. `apply()` 與 `call()`的唯一區別

    - `apply()` 把參數打包成 `Array` 再傳入;

    - `call()` 把參數按順序傳入。

  7. 所有實例的原型引用的是函數的 prototype 屬性

  8. 箭頭函數內部的 `this` 是詞法作用域( 寫代碼或者定義時確定的 作用域,動態作用域是在運行時確定 ),由上下文確定。箭頭函數完全修復了 `this` 的指向,`this` 總是指向詞法作用域

標準對象

  1. 如果我們在使用 `Number`、`Boolean` 和 `String` 時, 沒有寫 `new` ,`Number()`、`Boolean()` 和 `String()` 被當做普通函數,把任何類型的數據轉換為 `number`、`boolean` 和 `string` 類型(註意不是其包裝類型)

  2. 不要使用 `new Number()`、`new Boolean()`、`new String()` 創建包裝對象;

  3. 用 `parseInt()` 或 `parseFloat()` 來轉換任意類型到 `number`;

  4. 用 `String()` 來轉換任意類型到 `string` ,或者直接調用某個對象的 `toString()` 方法;

  5. 通常不必把任意類型轉換為 `boolean` 再判斷,因為可以直接寫 `if (myVar) {...}` ;

  6. `typeof` 操作符可以判斷出 `number` 、`boolean`、`string`、`function` 和 `undefined` ;

  7. 判斷 `Array` 要使用 `Array.isArray(arr)`;

  8. 判斷 `null` 請使用 `myVar === null`;

  9. 判斷某個全局變量是否存在用 `typeof window.myVar === ‘undefined‘`;

  10. 函數內部判斷某個變量是否存在用 `typeof myVar === ‘undefined‘`。

  11. 任何對象都有 `toString()` 方法嗎? `null` 和 `undefined` 就沒有!

  12. `number` 對象調用 `toString()` 報 `SyntaxError`

web前端/html5學習群:250777811

歡迎關註此公眾號→【web前端EDU】跟大佬一起學前端!歡迎大家留言討論一起轉發

你不知道的 JavaScript 基礎細節