You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Checks if the provided value is of the specified type.
Ensure the value is not undefined or null using Array.includes(), and compare the constructor property on the value with type to check if the provided value is of the specified type.
Checks if the provided argument is array-like (i.e. is iterable).
Use the spread operator (...) to check if the provided argument is iterable inside a try... catch block and the comma operator (,) to return the appropriate value.
Returns true if the a value is an empty object, collection, map or set, has no enumerable properties or is any type that is not considered a collection.
Check if the provided value is null or if its length is equal to 0.
Returns a boolean determining if the passed value is an object or not.
Uses the Object constructor to create an object wrapper for the given value. If the value is null or undefined, create and return an empty object. Οtherwise, return an object of a type that corresponds to the given value.
Returns a boolean determining if the passed value is primitive or not.
Use Array.includes() on an array of type strings which are not primitive, supplying the type using typeof. Since typeof null evaluates to 'object', it needs to be directly compared.
getType
返回值的元类型。
返回值的
constructor
名的小写字母。undefined
或者null
将会返回undefined
或null
。字面意思很好理解,不多说。
is
检测提供的
val
是否属于指定的类型type
。运用
Array.includes()
确保undefined
和null
被排除在外,并且比较val
的constructor
属性和指定的类型type
是否相等。MDN
的 constructor ,你值得拥有。isArrayLike
检测变量是否是
类数组
(比如是可迭代对象)。结合
try... catch
使用…
扩展运算表达式对提供的变量进行是否可迭代的检测,同时使用,
运算表达式返回适当的结果。在这里类数组判断的依据是变量可迭代,所以对应的检测方法就是可以用扩展运算表达式
…
进行展开,如果能正确展开,返回true
,否则返回false
。return [...val], true
,这里如果能展开,会能执行到,
表达式,返回true
,否则将进入catch
流程而返回false
。lodash
对于isArrayLike
(类数组)的判断依据是变量不是undefined
或者null
,也不是function
,同时含有length
属性且该属性值是一个整数并且大于等于0
且小于等于Number.MAX_SAFE_INTEGER
(9007199254740991)。代码和逻辑一一对应,不细讲。不过换我写的话,我会把
==
都写成===
。即使value != null
写成value !== null && value !== undefined
会变得很长。isBoolean
检测提供的变量是否是布尔类型。
用
typeof
来检测val
是否应该归为布尔原型。布尔型直接用
typeof
就能判断。isEmpty
如果
value
是一个空的object
、collection
、map
或者set
,或者没有任何可枚举的属性以及任何没有被当做collection
的类型都返回true
。检测提供的变量是否为
null
或者变量的length
属性是否等于0。这里注意的是
val == null
用的是==
而不是===
,也就是说undefined
也会返回true
。isFunction
检测提供的变量的类型是否是
function
。使用
typeof
进行判断给定的变量是否是function
原型。类型为
function
的判断比较简单,只需要用typeof
就可以区分。isNil
指定的变量是
null
或者undefined
,返回true
,否则返回false
。使用严格相等运算符去对变量进行是否等于
null
或者undefined
的检测。这还真没啥好说的了,我觉得名字起得非常好,
go
也用nil
。isNull
如果变量是
null
,返回true
,否则返回false
。使用严格相等运算符判断变量是否为
null
。isUndefined
如果变量是
undefined
,返回true
,否则返回false
。使用严格相等运算符判断变量是否为
undefined
。isNumber
检测提供的变量是否为
number
型。使用
typeof
检测给定变量是否是number
原型。这里注意的是
NaN
也是一个number
类型。isObject
检测给定的变量是否为
object
类型。使用
Object
的constructor
对给定的变量构造一个对象。如果变量是null
或者undefined
,将会生成一个空对象。否则生成一个类型和变量本身相等的对象。数组、对象、方法都会返回
true
。这里跟lodash
的isObject
有点不太一样:对于
null
来说typeof value === 'object'
,所以这是必须要排除掉的, 但是直接用value != null
进行判断比typeof
运行的效率高。对于数组和对象来说,
typeof
都会返回object
。所以type == 'object'
就能包含两者。另外
typeof
值为function
也满足,所以加上一个||
即可。其实本质上用构造函数和
lodash
的判断方法一样,但是lodash
没有涉及原型链的操作。所以效率高,虽然写法上比较费事。isObjectLike
检测一个变量是否是类对象。
只需要判断给定变量不是
null
且typeof
结果与object
相等即可。这里判断方法和
lodash
的isObjectLike
一样。isPlainObject
检测提供的变量是否是一个由对象的
constructor
创建的对象。先判断变量的布尔运算是否为
true
,然后使用typeof
判断变量是否为object
,最后判断变量的constructor
是否是object
。这三个步骤的运算都为true
才返回true
。代码正如注解一样一一对应,但意外的是它和
lodash
的isPlainObject
是不一样的,唯一差别是lodash
把Object.create(null)
创建的对象也归为plainObject
。但对应上各自的解释都是没错的。lodash
的isPlainObject
代码实现如下:lodash
的代码我认为应该加注释的都加上了,不清楚的可以MDN
自查:Symbol.toStringTag
Object.getPrototypeOf()
isPrimitive
检测变量是否是基本数据类型。
使用
Array.includes()
结合typeof
把不是基本数据类型的排除掉。由于typeof null
返回的是object
,需要直接对它进行单独判断。MDN
上关于primitive
的解释如下:primitive
(primitive 数值, primitive 数据类型) 是指不是一个object
并且不包含方法的数据。在JavaScript
中,属于primitive
的是string
、number
、boolean
、null
、undefined
和symbol
(ECMAScript2015新增)。!['object', 'function'].includes(typeof val)
这里就是把typeof
运算结果为object
或者function
都排除掉,由于null
的typeof
是object
,而includes
会把它也排除了,需要用||
把它加回来。如果你还有印象的话,
isObject
正好是isPrimitive
的对立面,所以其实我觉得!isObject
也行。lodash
暂时没有提供isPrimitive
的计划,但在issues
1406
中提到了可以用!_.isObject(value)
或者_.negate(_.isObject)
代替。isPromiseLike
如果一个对象看起来像
Promise
,返回true
,否则返回false
。首先该对象不能为
null
,其次它的typeof
是object
或者function
之一,最后它有一个.then
属性且该属性是一个function
。isString
检测一个变量是否是
string
类型。用
typeof
进行检测即可。isSymbol
检测一个变量是否是
symbol
类型。用
typeof
进行检测即可。isValidJSON
检测一个变量是否是合法的
JSON
。使用
JSON.parse()
结合try… catch
对变量进行判断,如果能正确解析返回true
,否则返回false
。isStrictNaN
这个方法是我自己加的,有时候需要判断是不是
NaN
,NaN
有一个独特的特性是它不等于它本身。这个方法和isNaN
有什么不同,可以看NDN
的isNaN
。终极大法
一般来说,大家如果不用
underscore
或者lodash
的话,通常都是用以下方法进行判断的:或者是正则:
这块就不用给例子了,有心人会自己去试。
一般我倾向于使用第一种,因为用正则一是比较难读懂,二是速度比较慢,实在是不用正则不能解决问题的时候才会用。
以上的方法是终极大法,但速度会比较慢,所以对于能直接用
typeof
进行判断的类型,通常直接用typeof
即可。不考虑运行效率的话,以上方法自然是一劳永逸。The text was updated successfully, but these errors were encountered: