摘要:和这三种基本的数据类型,都有对应的引用包装类型和。应用于引用类型的判断,所以对于这三类基本类型没有什么意义。
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"); }; }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/80891.html
摘要:摘要这篇文章讲述运算符判断基本类型和引用类型的区别,以及怎么判断数组类型和空对象有种原始类型,即和。类型判断类型判断,一般就是判断是否是数组,是否是空对象。方法四使用语法,返回一个数组,只需要判断数组长度是否大于即可。 摘要 这篇文章讲述typeof运算符判断基本类型和引用类型的区别,以及怎么判断数组类型和空对象 typeof ECMAScript 有 5 种原始类型(primitiv...
摘要:所以我们又可以得出一个结论原型的属性指向构造函数,构造函数又通过属性指回原型,但是并不是所有函数都具有这个属性,就没有这个属性。 1.原始类型 boolean number string null undefined symbol原始类型储存的都是值,是没有函数可以调用的,undefined.toString() 显示报错,但是1.toString() // 1 ; 是因为1被强制转...
摘要:基本数据类型在中,基本数据类型有种,即数值字符串布尔值。两个布尔值转为数值进行比较。对于对象和布尔值,调用它们的方法得到对应的字符串值,然后进行字符串相加。减法对于字符串布尔值或者,自动调用,转换结果若为,那么最终结果为。 这篇文章,来聊聊 JS 中的数据类型与变量。这是在学习 JS 时最基础的一类问题,但却很重要。希望我的分享有帮助到你。 文章开头,我先提几个面试中遇到的问题: 比如...
阅读 881·2021-11-22 13:54
阅读 2811·2021-09-28 09:36
阅读 2952·2019-08-30 15:55
阅读 1928·2019-08-30 15:44
阅读 510·2019-08-29 12:31
阅读 2537·2019-08-28 18:18
阅读 1169·2019-08-26 13:58
阅读 1283·2019-08-26 13:44