成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS 中的類型判斷

ChanceWong / 2601人閱讀

摘要:和這三種基本的數(shù)據(jù)類型,都有對(duì)應(yīng)的引用包裝類型和。應(yīng)用于引用類型的判斷,所以對(duì)于這三類基本類型沒有什么意義。

JS 中的類型判斷 js中的數(shù)據(jù)類型

基本數(shù)據(jù)類型

undefined、number、string、boolean

引用數(shù)據(jù)類型

null、Object、Number、String、Boolean、Function、Array、Date、RegExp、Error、Arguments

typeof

typeof操作符可能返回下面幾種字符串

"undefined" 如果這個(gè)值未定義

"boolean" 如果這個(gè)值是布爾值

"string" 如果這個(gè)值是字符串

"number" 如果這個(gè)值是數(shù)值,注意其中NaN 返回的也是"number"

"function" 如果這個(gè)值是函數(shù)

"object" 如果這個(gè)值是對(duì)象或者是null

undefined boolean string number 都是基本的數(shù)據(jù)類型
function 和 object是引用類型,變量指向的是對(duì)象的地址,
對(duì)于引用類型的變量,typeof只可以區(qū)分出function,其他類型的統(tǒng)一識(shí)別成object。

boolean string 和number這三種基本的數(shù)據(jù)類型,都有對(duì)應(yīng)的引用包裝類型
Boolean String 和Number。

對(duì)于這些包裝類型的變量,typeof統(tǒng)一識(shí)別成object

var a = new String("hello");
typeof a // object
var b = "hello";
a === b // false
a ==b //true
a 實(shí)際變成了一個(gè)String類型的引用變量
所以a === b 是false,但是用== 比較的時(shí)候 b隱式調(diào)用了toString的方法 所以是true


多說一句,其實(shí)我們?cè)谡{(diào)用基本類型的方法的時(shí)候,都是隱式的轉(zhuǎn)為包裝對(duì)象以后才能調(diào)用。

instanceof

instanceof 應(yīng)用于引用類型的判斷,所以對(duì)于string number boolean 這三類基本類型沒有什么意義。
instanceof 支持繼承 因?yàn)樗械囊妙愋投祭^承自O(shè)bject,所以所有引用變量都是Object的實(shí)例

var a = new String("hello");
a instanceof String  //true
a instanceof Object  //true
var b = "hello";
b instanceof String  // false

我開始以為instanceof是通過判斷a的__proto__ 上的constructor 屬性來判斷構(gòu)造函數(shù)的類型,但是改變a.__proto__.constructor = Number 之后
a instanceof String 仍然為true

var a = new String("hello");
a.__proto__.constructor = Number;
a instanceof String  //true
a instanceof Number  //false
Object.prototype.toString.call()

這個(gè)是通過調(diào)用Object原型上的toString方法來判斷變量的類型
這個(gè)方法不會(huì)區(qū)分是基本類型還是包裝的引用類型,其實(shí)大多數(shù)情況下我們真不不需要區(qū)分。

var a = new String("hello")
var b = "hello";
Object.prototype.toString.call(a)  //"[object String]"
Object.prototype.toString.call(b)  //"[object String]"

該方法還能夠區(qū)分null和undefined

Object.prototype.toString.call(null)  //"[object Null]"
Object.prototype.toString.call(undefined)  //"[object Undefined]"

所以判斷數(shù)據(jù)類型最靠譜的方法就是這個(gè)了。

underscore 中的實(shí)現(xiàn)
//代碼中的toString 方法 就是Object.prototype.toString
// Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
  _.each(["Arguments","Function", "String", "Number", "Date", "RegExp", "Error"], function(name) {
    _["is" + name] = function(obj) {
      return toString.call(obj) === "[object " + name + "]";
    };
  });
  
  _.isBoolean = function(obj) {
    return obj === true || obj === false || toString.call(obj) === "[object Boolean]";
  };
  
雖然這個(gè)方法很好但是沒有辦法區(qū)分基本類型和引用類型,采用typeof可以判斷:
    // 判斷是否是引用類型
    _.isObject = function(obj) {
    var type = typeof obj;
    return type === "function" || type === "object" && !!obj;
    };

    //通過instanceof Object  應(yīng)該也可以判斷 是不是引用類型 并且不是null和undefined
  
  
    // 判斷是否為數(shù)組
    _.isArray = nativeIsArray || function(obj) {
      return toString.call(obj) === "[object Array]";
    };
    //nativeIsArray 是ES5原生的Array.isArray
    
    //判斷是否是NaN,利用NaN是唯一一個(gè)不等于自己的Number類型
    _.isNaN = function(obj) {
      return _.isNumber(obj) && obj !== +obj;
    };
    
    _.isUndefined = function(obj) {
        return obj === void 0;
    };
  
    _.isNull = function(obj) {
        return obj === null;
    };
    
     _.isFinite = function(obj) {
    return isFinite(obj) && !isNaN(parseFloat(obj));
    };
    
    //在 IE < 9 下對(duì) arguments 調(diào)用 Object.prototype.toString.call,結(jié)果是 [object Object],所以利用他的callee屬性來判斷
    if (!_.isArguments(arguments)) {
        _.isArguments = function(obj) {
          return _.has(obj, "callee");
        };
    }

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/80891.html

相關(guān)文章

  • js筆記內(nèi)容

    摘要:定義運(yùn)算符用來判斷一個(gè)構(gòu)造函數(shù)的屬性所指向的對(duì)象是否存在另外一個(gè)要檢測(cè)對(duì)象的原型鏈上,用于引用類型。但其實(shí),實(shí)例的來自于構(gòu)造函數(shù)的。 一、關(guān)于css 樣式優(yōu)先級(jí): 行內(nèi)樣式>id選擇器樣式>類選擇器樣式>標(biāo)簽選擇器樣式>通配符選擇器的樣式>繼承樣式>默認(rèn)樣式 二、關(guān)于js 關(guān)于問題:**JavaScript中的所有事物都是對(duì)象??** 從typeof和instanceo...

    n7then 評(píng)論0 收藏0
  • JS中的typeof和類型判斷

    摘要:摘要這篇文章講述運(yùn)算符判斷基本類型和引用類型的區(qū)別,以及怎么判斷數(shù)組類型和空對(duì)象有種原始類型,即和。類型判斷類型判斷,一般就是判斷是否是數(shù)組,是否是空對(duì)象。方法四使用語法,返回一個(gè)數(shù)組,只需要判斷數(shù)組長(zhǎng)度是否大于即可。 摘要 這篇文章講述typeof運(yùn)算符判斷基本類型和引用類型的區(qū)別,以及怎么判斷數(shù)組類型和空對(duì)象 typeof ECMAScript 有 5 種原始類型(primitiv...

    cppowboy 評(píng)論0 收藏0
  • js

    摘要:所以我們又可以得出一個(gè)結(jié)論原型的屬性指向構(gòu)造函數(shù),構(gòu)造函數(shù)又通過屬性指回原型,但是并不是所有函數(shù)都具有這個(gè)屬性,就沒有這個(gè)屬性。 1.原始類型 boolean number string null undefined symbol原始類型儲(chǔ)存的都是值,是沒有函數(shù)可以調(diào)用的,undefined.toString() 顯示報(bào)錯(cuò),但是1.toString() // 1 ; 是因?yàn)?被強(qiáng)制轉(zhuǎn)...

    pubdreamcc 評(píng)論0 收藏0
  • 雜談數(shù)據(jù)類型獲取

    摘要:如果項(xiàng)目中需要頻繁的進(jìn)行數(shù)據(jù)類型的判斷與獲取可以考慮進(jìn)行封裝,簡(jiǎn)單的處理與已足夠。 前言 在js中數(shù)據(jù)我們經(jīng)常需要判斷或者獲取數(shù)據(jù)類型,大部分時(shí)候我們都是通過type加instanceof來組合判斷數(shù)據(jù)類型來實(shí)現(xiàn),大部分代碼中對(duì)于數(shù)據(jù)類型的獲取處理都比較丑陋,前段時(shí)間看了一下Q的源代碼中對(duì)數(shù)據(jù)類型的判斷與獲取處理,看起來相當(dāng)簡(jiǎn)潔也比較好用,這篇文章來進(jìn)行一下發(fā)散。 typeof 在js...

    newsning 評(píng)論0 收藏0
  • 分析 JavaScript 的數(shù)據(jù)類型與變量

    摘要:基本數(shù)據(jù)類型在中,基本數(shù)據(jù)類型有種,即數(shù)值字符串布爾值。兩個(gè)布爾值轉(zhuǎn)為數(shù)值進(jìn)行比較。對(duì)于對(duì)象和布爾值,調(diào)用它們的方法得到對(duì)應(yīng)的字符串值,然后進(jìn)行字符串相加。減法對(duì)于字符串布爾值或者,自動(dòng)調(diào)用,轉(zhuǎn)換結(jié)果若為,那么最終結(jié)果為。 這篇文章,來聊聊 JS 中的數(shù)據(jù)類型與變量。這是在學(xué)習(xí) JS 時(shí)最基礎(chǔ)的一類問題,但卻很重要。希望我的分享有幫助到你。 文章開頭,我先提幾個(gè)面試中遇到的問題: 比如...

    Mike617 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<