摘要:和這三種基本的數據類型,都有對應的引用包裝類型和。應用于引用類型的判斷,所以對于這三類基本類型沒有什么意義。
JS 中的類型判斷 js中的數據類型
基本數據類型
undefined、number、string、boolean
引用數據類型
null、Object、Number、String、Boolean、Function、Array、Date、RegExp、Error、Arguments
typeoftypeof操作符可能返回下面幾種字符串
"undefined" 如果這個值未定義
"boolean" 如果這個值是布爾值
"string" 如果這個值是字符串
"number" 如果這個值是數值,注意其中NaN 返回的也是"number"
"function" 如果這個值是函數
"object" 如果這個值是對象或者是null
undefined boolean string number 都是基本的數據類型
function 和 object是引用類型,變量指向的是對象的地址,
對于引用類型的變量,typeof只可以區分出function,其他類型的統一識別成object。
boolean string 和number這三種基本的數據類型,都有對應的引用包裝類型
Boolean String 和Number。
對于這些包裝類型的變量,typeof統一識別成object
var a = new String("hello"); typeof a // object var b = "hello"; a === b // false a ==b //true a 實際變成了一個String類型的引用變量 所以a === b 是false,但是用== 比較的時候 b隱式調用了toString的方法 所以是true
多說一句,其實我們在調用基本類型的方法的時候,都是隱式的轉為包裝對象以后才能調用。
instanceof 應用于引用類型的判斷,所以對于string number boolean 這三類基本類型沒有什么意義。
instanceof 支持繼承 因為所有的引用類型都繼承自Object,所以所有引用變量都是Object的實例
var a = new String("hello"); a instanceof String //true a instanceof Object //true var b = "hello"; b instanceof String // false
我開始以為instanceof是通過判斷a的__proto__ 上的constructor 屬性來判斷構造函數的類型,但是改變a.__proto__.constructor = Number 之后
a instanceof String 仍然為true
var a = new String("hello"); a.__proto__.constructor = Number; a instanceof String //true a instanceof Number //falseObject.prototype.toString.call()
這個是通過調用Object原型上的toString方法來判斷變量的類型
這個方法不會區分是基本類型還是包裝的引用類型,其實大多數情況下我們真不不需要區分。
var a = new String("hello") var b = "hello"; Object.prototype.toString.call(a) //"[object String]" Object.prototype.toString.call(b) //"[object String]"
該方法還能夠區分null和undefined
Object.prototype.toString.call(null) //"[object Null]" Object.prototype.toString.call(undefined) //"[object Undefined]"
所以判斷數據類型最靠譜的方法就是這個了。
underscore 中的實現//代碼中的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]"; }; 雖然這個方法很好但是沒有辦法區分基本類型和引用類型,采用typeof可以判斷: // 判斷是否是引用類型 _.isObject = function(obj) { var type = typeof obj; return type === "function" || type === "object" && !!obj; }; //通過instanceof Object 應該也可以判斷 是不是引用類型 并且不是null和undefined // 判斷是否為數組 _.isArray = nativeIsArray || function(obj) { return toString.call(obj) === "[object Array]"; }; //nativeIsArray 是ES5原生的Array.isArray //判斷是否是NaN,利用NaN是唯一一個不等于自己的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 下對 arguments 調用 Object.prototype.toString.call,結果是 [object Object],所以利用他的callee屬性來判斷 if (!_.isArguments(arguments)) { _.isArguments = function(obj) { return _.has(obj, "callee"); }; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80891.html
摘要:摘要這篇文章講述運算符判斷基本類型和引用類型的區別,以及怎么判斷數組類型和空對象有種原始類型,即和。類型判斷類型判斷,一般就是判斷是否是數組,是否是空對象。方法四使用語法,返回一個數組,只需要判斷數組長度是否大于即可。 摘要 這篇文章講述typeof運算符判斷基本類型和引用類型的區別,以及怎么判斷數組類型和空對象 typeof ECMAScript 有 5 種原始類型(primitiv...
摘要:所以我們又可以得出一個結論原型的屬性指向構造函數,構造函數又通過屬性指回原型,但是并不是所有函數都具有這個屬性,就沒有這個屬性。 1.原始類型 boolean number string null undefined symbol原始類型儲存的都是值,是沒有函數可以調用的,undefined.toString() 顯示報錯,但是1.toString() // 1 ; 是因為1被強制轉...
摘要:基本數據類型在中,基本數據類型有種,即數值字符串布爾值。兩個布爾值轉為數值進行比較。對于對象和布爾值,調用它們的方法得到對應的字符串值,然后進行字符串相加。減法對于字符串布爾值或者,自動調用,轉換結果若為,那么最終結果為。 這篇文章,來聊聊 JS 中的數據類型與變量。這是在學習 JS 時最基礎的一類問題,但卻很重要。希望我的分享有幫助到你。 文章開頭,我先提幾個面試中遇到的問題: 比如...
閱讀 921·2021-11-22 13:54
閱讀 2848·2021-09-28 09:36
閱讀 2986·2019-08-30 15:55
閱讀 1956·2019-08-30 15:44
閱讀 549·2019-08-29 12:31
閱讀 2566·2019-08-28 18:18
閱讀 1204·2019-08-26 13:58
閱讀 1389·2019-08-26 13:44