你不知道的 JavaScript 基礎細節
語法部分
-
type 屬性: 默認的 type 就是 javascript, 所以不必顯式指定 type 為 javascript
-
javascript 不強制在每個語句結尾加 “;” , javascript 會自動加分號, 但是在某些情況下會改變程序的語義, 所以最好主動加 “;”
-
兩個相等運算符比較
‘==’ 相等( 值相等 ), 它會自動轉換數據類型再比較, 很多時候會得到非常詭異的結果
‘===’ 嚴格相等( 數據類型和值都相等 ) , 它不會自動轉換數據類型, 如果數據類型不一致, 返回false, 如果一致, 再比較
-
NaN 與所有其他值都不相等, 包括它自己:
NaN === NaN; // false
唯一能判斷 NaN 的方法是通過 isNaN() 函數
isNaN(NaN); // true
-
浮點數比較
浮點數在運算過程中會產生誤差, 因為計算機無法精確表示無限循環小數。 要比較兩個浮點數是否相等, 只能計算它們之差的絕對值, 看是否小於某個閾值:Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
-
null 和 undefined
大多數情況下,我們都應該用 null , undefined 僅僅在判斷函數參數是否傳遞的情況下有用
-
出於代碼的可讀性考慮,創建數組建議使用 ‘[ ]‘,而不使用 ‘new Array‘;
-
如果一個變量沒有通過 ‘var‘ 聲明就被使用,那麽該變量就自動被聲明為全局變量。使用 var 聲明的變量則不是全局變量,它的範圍就該被限制在該變量被聲明的函數體內
-
啟用 strict 模式(強制通過 var 聲明變量)
-
多行字符串用反引號表示
-
使用模版字符串
-
要獲取字符串某個指定位置的字符,使用類似 Array 的下標操作, 索引號從 0 開始。 字符串是不可變的, 如果對
字符串的某個索引賦值, 不會有任何錯誤,但是也沒有任何效果
-
直接給 Array 的 length 賦一個新的值會導致 Array 大小的變化
-
如果通過索引賦值時, 索引超過了範圍, 同樣會引起 `Array` 大小的變化, 但是不會有任何錯誤, 在編寫代碼時, 不建議直接修改 `Array` 的大小, 訪問索引時要確保索引不會越界
-
數字 30 和字符串 ‘30‘ 是不同的元素
-
slice() 的起止參數包括開始索引, 不包括結束索引。
-
如果不給 slice() 傳遞任何參數, 它就會從頭到尾截取所有元素。 利用這一點, 我們可以很容易地復制一個 Array
-
空數組繼續 `pop` 不會報錯,而是返回 `undefined`
-
`concat()` 方法並沒有修改當前 `Array`, 而是返回了一個新的 `Array`,`concat()` 方法可以接收任意個元素和 `Array`, 並且自動把 `Array` 拆開, 然後全部添加到新的 `Array` 裏
-
`javascript` 對象屬性名必須是一個有效的變量名。 如果屬性名包含特殊字符, 就必須用 `‘‘` 括起來
-
如果我們要檢測 `xiaoming` 是否擁有某一屬性, 可以用in操作符, 不過要小心, 如果 `in` 判斷一個屬性存在, 這個屬性不一定是`xiaoming` 的, 它可能是 `xiaoming` 繼承得到的
-
要判斷一個屬性是否是 `xiaoming` 自身擁有的,而不是繼承得到的,可以用 `hasOwnProperty()` 方法
-
JavaScript把 `null`、`undefined`、`0`、`NaN` 和空字符串 `‘‘` 視為 `false`,其他值一概視為 `true`
-
由於 `Array` 也是對象, 而它的每個元素的索引被視為對象的屬性, 因此, `for ... in` 循環可以直接循環出 `Array` 的索引
-
`for ... in` 循環由於歷史遺留問題, 它遍歷的實際上是對象的屬性名稱, `for ... of` 循環則完全修復了這些問題, 它只循環集合本身的元素
web前端/html5學習群:250777811
函數
-
函數如果沒有 `return` 語句, 函數執行完畢後也會返回結果, 只是結果為 `undefined`
-
由於 `JavaScript` 允許傳入任意個參數而不影響調用, 因此傳入的參數比定義的參數多也沒有問題, 雖然函數內部並不需要這些參數, 傳入的參數比定義的少也沒有問題
-
關鍵字 `arguments` 類似 `Array` 但它不是一個 `Array`
-
不在任何函數內定義的變量就具有全局作用域。 實際上, `JavaScript` 默認有一個全局對象 `window`。 以變量方式 `var foo = function () {}` 定義的函數實際上也是一個全局變量。
-
用 `var that = this;` , 你就可以放心地在方法內部定義其他函數,而不是把所有語句都堆到一個方法中。 對於普通函數調用, 通常把 `this` 綁定為 `null`。
-
`apply()` 與 `call()`的唯一區別
- `apply()` 把參數打包成 `Array` 再傳入;
- `call()` 把參數按順序傳入。
-
所有實例的原型引用的是函數的 prototype 屬性
-
箭頭函數內部的 `this` 是詞法作用域( 寫代碼或者定義時確定的 作用域,動態作用域是在運行時確定 ),由上下文確定。箭頭函數完全修復了 `this` 的指向,`this` 總是指向詞法作用域
標準對象
-
如果我們在使用 `Number`、`Boolean` 和 `String` 時, 沒有寫 `new` ,`Number()`、`Boolean()` 和 `String()` 被當做普通函數,把任何類型的數據轉換為 `number`、`boolean` 和 `string` 類型(註意不是其包裝類型)
-
不要使用 `new Number()`、`new Boolean()`、`new String()` 創建包裝對象;
-
用 `parseInt()` 或 `parseFloat()` 來轉換任意類型到 `number`;
-
用 `String()` 來轉換任意類型到 `string` ,或者直接調用某個對象的 `toString()` 方法;
-
通常不必把任意類型轉換為 `boolean` 再判斷,因為可以直接寫 `if (myVar) {...}` ;
-
`typeof` 操作符可以判斷出 `number` 、`boolean`、`string`、`function` 和 `undefined` ;
-
判斷 `Array` 要使用 `Array.isArray(arr)`;
-
判斷 `null` 請使用 `myVar === null`;
-
判斷某個全局變量是否存在用 `typeof window.myVar === ‘undefined‘`;
-
函數內部判斷某個變量是否存在用 `typeof myVar === ‘undefined‘`。
-
任何對象都有 `toString()` 方法嗎? `null` 和 `undefined` 就沒有!
-
`number` 對象調用 `toString()` 報 `SyntaxError`
web前端/html5學習群:250777811
歡迎關註此公眾號→【web前端EDU】跟大佬一起學前端!歡迎大家留言討論一起轉發
你不知道的 JavaScript 基礎細節