《你不知道的Javascript--中卷 學習總結》(類型、值)

類型

類型是的內部特徵,它定義了值的行爲,以使其區別於其餘值。數組

內置類型

一、七種內置類型:安全

  • 空值(null)
  • 未定義(undefined)
  • 布爾值(boolean)
  • 數字(number)
  • 字符串(string)
  • 對象(object)
  • 符號(symbol,ES6中新增)

二、咱們能夠用typeof運算符來查看值的類型,它返回的是類型的字符串值bash

三、由於typeof null === 'object',因此檢測null值的類型須要下面這段複合條件函數

var a = null;
    (!a && typeof a == "object"); // true
複製代碼

四、函數其實是object的一個"子類型"。具體的說,函數是"可調用對象",它有一個內部屬性[[call]],該屬性使其能夠被調用。工具

五、函數對象的length屬性其聲明的參數的個數ui

值和類型

一、Javascript中的變量是沒有類型的,只有纔有。變量能夠隨時持有任何類型的值。spa

二、已在做用域中聲明但還沒有賦值的變量,是undefinedprototype

三、還沒有在做用域中聲明過得變量,是undeclaredcode

var a;
    typeof a // "undefined"
    typeof b // "undefined"   沒有聲明仍是undefined 這主要是由於typeof的安全防範機制
複製代碼

typeof安全防範機制

  • 全局變量的檢驗
// 這樣是安全的
    if(typeof DEBUG ! == "undefined"){
        console.log('xxxxx')
    }
複製代碼
  • 非全局變量是否認義
(function(){
        function FeatureXYZ(){};
        
        function doSomethingCool(){
            var helper = (typeof FeatureXYZ !== "undefined") ? FeatureXYZ :
            function(){
                // default feature
            }
            
            var a = helper();
        }
        doSomethingCool()
    })()
複製代碼
  • 函數傳遞參數檢測
function doSomethingCool(FeatureXYZ){
        var helper = FeatureXYZ || function(){}
        var val = helper();
        // ...
    }
複製代碼

數組

一、數組能夠容納任何類型的值,能夠是字符串數字對象,甚至是其餘數組對象

二、使用delete運算符能夠將單元從數組中刪除,可是請注意,單元刪除後,數組的length屬性並不會發生變化

三、在建立"稀疏"數組(即含有空白或空缺單元的數組)。a[1]的值爲undefined,但這與將其顯示賦值爲undefined(a[1] = undefined)仍是有所區別。

var a = [];
    a[0] = 1;
    a[2] = [3];
    a[1] // undefined
    
    a.length // 3
複製代碼

四、數組經過數字進行索引,可是他們也是對象,因此也能夠包含字符串鍵值屬性(但這些並不計算在數組長度內)。

五、若是字符串鍵值可以被強制類型轉換爲十進制數字的話,它就會被當作數字索引來處理

var a = [];
    a[0] = 1;
    a['foo'] = 2;
    a.length // 1
    a['foobar'] //2
    a.foobar //2
    
    
    
    var a = [];
    a['13'] = 42;
    a.length // 14
複製代碼

六、類數組=>數組的方式

  • slice
function foo(){
        var arr = Array.prototype.slice.call(arguments);
        arr.push('bam');
        console.log(arr)
    }
    
    foo('bar','baz') // ['bar','baz','bam']
複製代碼
  • Array.from() (ES6)
var arr = Array.from(arguments)
複製代碼

字符串

一、Javascript中字符串是不可變的(指字符串的成員函數不會改變其原始值,而是建立並返回一個新的字符串),而數組是可變的。

二、字符串沒有reverse方法,變通方法能夠先轉換爲數組而後轉換爲字符串。

var a = 'foo'
    var c = a.split("").reverse().join("")
    c; //"oof"
複製代碼

數字

一、Javascript中的數字類型是基於IEEE754標準來實現的,該標準一般也被稱爲"浮點數"。Javascript使用的是"雙精度"格式。

二、toFixed() 方法能夠指定小數部分的顯示位數,若是指定的小數部分的顯示位數多於實際位數就用0補齊。

三、toPrecision() 方法用來指定有效數位的顯示位數。

四、.運算符須要給與特別的注意,由於它是一個有效的數字字符,會被優先識別爲數字字面量的一部分,而後纔是對象屬性訪問運算符

// 無效語法
    42.toFixed(3)  // SyntaxError
    
    // 下面的語法都有效
    (42).toFixed(3) // 42.000
    0.42.toFixed(3) // 0.420
    42..toFixed(3) // 42.000
複製代碼

五、二進制浮點數最大的問題(全部遵循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
複製代碼

六、可使用Number.isInteger()來檢測一個值是不是整數。

Number.isInteger(42) // true
    Number.isInteger(42.000) // true
    Number.isInteger(42.3) // false
    
    
    // polyfill
    if(!Number.isInteger){
        Number.isInteger = function(num){
            return typeof num === 'number' && num % 1 == 0
        }
    }
複製代碼

七、a | 0 能夠將變量a中的數值轉換爲32位有符號整數,由於數位運算符|只適用於32位整數(它只關心32位之內的值,其餘的數位將被忽略)。

八、undefined類型只有一個值,即undefined。null類型也只有一個值,即null。他們的名稱既是類型也是值。undefined指從未賦值null只曾賦過值,可是目前沒有值

九、null是一個特殊關鍵字,不是標識符,咱們不能將其當作變量來使用和賦值。然而undefined倒是一個標識符,能夠被看成變量來使用和賦值。

十、在非嚴格模式下,咱們能夠爲全局標識符undefined賦值

function foo(){
        undefined = 2; // 很是糟糕的作法
    }
    
    foo();
    
    function foo(){
        "use strict";
        undefined = 2; // TypeError
    }
    
    foo()
複製代碼

十一、咱們能夠經過void運算符便可獲得undefined。表達式void __ 沒有返回值,所以返回結果是undefined。void並不改變表達式的結果,只是讓表達式不返回值。一般咱們用void 0 來得到undefined。

var a = 42;
    console.log(void a,a) // undefined 42
複製代碼

十二、不是數字的數字(NaN)

  • NaN是數字類型的
var a = 2 / "foo"; // NaN
    typeof a === 'number' // true
複製代碼
  • 檢測NaN
// 全局函數isNaN判斷。(可是有一個缺陷,就是當傳遞一個非數字的時候,isNaN也返回true)
    var a = 2 / 'foo';
    var b = 'foo';
    
    window.isNaN(a) // true 
    window.isNaN(b) // true 
    
    // ES6 的Number.isNaN
    if(!Number.isNaN){
        Number.isNaN = function(n){
            return (
                typeof n === "number" && 
                window.isNaN(n)
            )
        }
    }
    
    // 最簡單的方法,NaN是Javascript中惟一一個不等於自身的值
    if(!Number.isNaN){
        Number.isNaN = function(){
            return n !== n;
        }
    }
複製代碼

1三、零值

  • Javascript中有一個常規的0和一個-0
  • 負零進行字符串化會返回'0'
var a = 0 / -3;
    a; // -0
    a.toString() // '0'
    a+'' // '0'
    String(a) // '0'
複製代碼
  • 字符串轉換爲數字,獲得的結果是準確的。
+"-0" // -0
   Number("-0") // -0
   JSON.parse("-0") // -0
複製代碼
  • 判斷-0
function isNegZero(n){
       n = Number(n);
       return (n===0) && (1/n===-Infinity)
   }
複製代碼

1四、ES6新加入了一個工具方法Object.is()來判斷兩個值是否絕對相等(加入了NaN和-0的判斷)

if(!Object.is){
       Object.is = function(v1,v2) {
           // 判斷是否爲-0
           if(v1===0 && v2===0){
               return 1/v1 === 1/v2
           }
           //判斷是否爲NaN
           if(v1!==v1){
               return v2!==v2;
           }
           
           // 其餘狀況
           return v1 === v2;
       }
   }
複製代碼
相關文章
相關標籤/搜索