《你不知道的Javascript--中卷 学习总结》(类型、值)
類型
類型是值的內部特征,它定義了值的行為,以使其區別于其他值。
內置類型
1、七種內置類型:
- 空值(null)
- 未定義(undefined)
- 布爾值(boolean)
- 數字(number)
- 字符串(string)
- 對象(object)
- 符號(symbol,ES6中新增)
2、我們可以用typeof運算符來查看值的類型,它返回的是類型的字符串值。
3、因為typeof null === 'object',所以檢測null值的類型需要下面這段復合條件
var a = null;(!a && typeof a == "object"); // true 復制代碼4、函數實際上是object的一個"子類型"。具體的說,函數是"可調用對象",它有一個內部屬性[[call]],該屬性使其可以被調用。
5、函數對象的length屬性是其聲明的參數的個數
值和類型
1、Javascript中的變量是沒有類型的,只有值才有。變量可以隨時持有任何類型的值。
2、已在作用域中聲明但還沒有賦值的變量,是undefined。
3、還沒有在作用域中聲明過得變量,是undeclared。
var a;typeof a // "undefined"typeof b // "undefined" 沒有聲明還是undefined 這主要是因為typeof的安全防范機制 復制代碼typeof安全防范機制
- 全局變量的檢驗
- 非全局變量是否定義
- 函數傳遞參數檢測
值
數組
1、數組可以容納任何類型的值,可以是字符串、數字、對象,甚至是其他數組。
2、使用delete運算符可以將單元從數組中刪除,但是請注意,單元刪除后,數組的length屬性并不會發生變化。
3、在創建"稀疏"數組(即含有空白或空缺單元的數組)。a[1]的值為undefined,但這與將其顯示賦值為undefined(a[1] = undefined)還是有所區別。
var a = [];a[0] = 1;a[2] = [3];a[1] // undefineda.length // 3 復制代碼4、數組通過數字進行索引,但是他們也是對象,所以也可以包含字符串鍵值和屬性(但這些并不計算在數組長度內)。
5、如果字符串鍵值能夠被強制類型轉換為十進制數字的話,它就會被當做數字索引來處理
var a = [];a[0] = 1;a['foo'] = 2;a.length // 1a['foobar'] //2a.foobar //2var a = [];a['13'] = 42;a.length // 14 復制代碼6、類數組=>數組的方式
- slice
- Array.from() (ES6)
字符串
1、Javascript中字符串是不可變的(指字符串的成員函數不會改變其原始值,而是創建并返回一個新的字符串),而數組是可變的。
2、字符串沒有reverse方法,變通方法可以先轉換為數組然后轉換為字符串。
var a = 'foo'var c = a.split("").reverse().join("")c; //"oof" 復制代碼數字
1、Javascript中的數字類型是基于IEEE754標準來實現的,該標準通常也被稱為"浮點數"。Javascript使用的是"雙精度"格式。
2、toFixed() 方法可以指定小數部分的顯示位數,如果指定的小數部分的顯示位數多于實際位數就用0補齊。
3、toPrecision() 方法用來指定有效數位的顯示位數。
4、.運算符需要給與特別的注意,因為它是一個有效的數字字符,會被優先識別為數字字面量的一部分,然后才是對象屬性訪問運算符。
// 無效語法42.toFixed(3) // SyntaxError// 下面的語法都有效(42).toFixed(3) // 42.0000.42.toFixed(3) // 0.42042..toFixed(3) // 42.000 復制代碼5、二進制浮點數最大的問題(所有遵循IEEE754規范的語言都是如此)就是小數的精度不準。(例如0.1+0.2===0.3 等于false的經典問題)
// 判斷兩個小數相等function numberCloseEnoughToEqual(n1,n2){return Math.abs(n1-n2) < Number.EPSILON;}var a = 0.1 + 0.2;var b = 0.3;numberCloseEnoughToEqual(a,b) // true 復制代碼6、可以使用Number.isInteger()來檢測一個值是否是整數。
Number.isInteger(42) // trueNumber.isInteger(42.000) // trueNumber.isInteger(42.3) // false// polyfillif(!Number.isInteger){Number.isInteger = function(num){return typeof num === 'number' && num % 1 == 0}} 復制代碼7、a | 0 可以將變量a中的數值轉換為32位有符號整數,因為數位運算符|只適用于32位整數(它只關心32位以內的值,其他的數位將被忽略)。
8、undefined類型只有一個值,即undefined。null類型也只有一個值,即null。他們的名稱既是類型也是值。undefined指從未賦值,null只曾賦過值,但是目前沒有值
9、null是一個特殊關鍵字,不是標識符,我們不能將其當做變量來使用和賦值。然而undefined卻是一個標識符,可以被當作變量來使用和賦值。
10、在非嚴格模式下,我們可以為全局標識符undefined賦值
function foo(){undefined = 2; // 非常糟糕的做法}foo();function foo(){"use strict";undefined = 2; // TypeError}foo() 復制代碼11、我們可以通過void運算符即可得到undefined。表達式void __ 沒有返回值,因此返回結果是undefined。void并不改變表達式的結果,只是讓表達式不返回值。通常我們用void 0 來獲得undefined。
var a = 42;console.log(void a,a) // undefined 42 復制代碼12、不是數字的數字(NaN)
- NaN是數字類型的
- 檢測NaN
13、零值
- Javascript中有一個常規的0和一個-0
- 對負零進行字符串化會返回'0'
- 將字符串轉換為數字,得到的結果是準確的。
- 判斷-0
14、ES6新加入了一個工具方法Object.is()來判斷兩個值是否絕對相等(加入了NaN和-0的判斷)
if(!Object.is){Object.is = function(v1,v2) {// 判斷是否為-0if(v1===0 && v2===0){return 1/v1 === 1/v2}//判斷是否為NaNif(v1!==v1){return v2!==v2;}// 其他情況return v1 === v2;}} 復制代碼總結
以上是生活随笔為你收集整理的《你不知道的Javascript--中卷 学习总结》(类型、值)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 会议2.4
- 下一篇: 基于 HTML5 网络拓扑图的快速开发之