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
functionisArrayLike(o){if(o&&// o is not null, undefined, etc// o is an objecttypeofo==="object"&&// o.length is a finite numberisFinite(o.length)&&// o.length is non-negativeo.length>=0&&// o.length is an integero.length===Math.floor(o.length)&&// o.length < 2^32o.length<4294967296)//数组的上限值returntrue;elsereturnfalse;}
typeof
JavaScript定义的数据类型有
Undefined
、Null
、Boolean
、Number
、String
、Object
、Symbol
(ES6新增)。其中
typeof
对大部分的数据类型都能够准确识别,如下:其中返回的字符串首字母都是小写的。
对于
typeof null === 'object'
来说,这其实是一个bug
。在JavaScript中,
Object
下还有很多细分的类型,比如说Date
、RegExp
、Error
、Array
、Function
。typeof
除了能够准确的判断出Function
之外,对于其他细分类型均返回object
。Object.prototype.toString()
当
toString
方法被调用的时候,下面的步骤会被执行:this
值是undefined
,就返回[object Undefined]
this
的值是null
,就返回[object Null]
O
成为ToObject(this)
的结果class
成为O
的内部属性[[Class]]
的值"[object "
和class
和"]"
三个部分组成的字符串该方法至少可以识别14种类型。
type API
通过
toLowerCase()
小写化和typeof
的结果是小写一致。注意IE6中
toString()
会把Undefined
和Null
都识别为[object Object]
,所以加了一个判断,直接调用+
来隐式toString()-> "null"
。这里之所以
class2type[Object.prototype.toString.call(obj)] || "object"
是考虑到ES6
新增的Symbol
、Map
、Set
在集合class2type
中没有,直接把他们识别成object
。这个
type
其实就是jQuery
中的type
。isFunction
之后可以直接封装:
数组
jQuery3.0中已经完全使用
Array.isArray()
。plainObject
plainObject
翻译为中文即为纯对象,所谓的纯对象,就是该对象是通过{}
或new Object()
创建的。判断是否为“纯对象”,是为了和其他对象区分开比如说
null
、数组以及宿主对象(所有的DOM
和BOM
都是数组对象)等。jQuery中有提供了该方法的实现,除了规定该对象是通过
{}
或new Object()
创建的,且对象含有零个或者多个键值对外,一个没有原型(__proto__
)的对象也是一个纯对象。jQuery3.0版本的
plainObject
实现如下:注意最后这一句非常的重要:
hasOwn.toString
调用的其实是Function.prototype.toString()
而不是Object.prototype.toString()
,因为hasOwnProperty
是一个函数,它的原型是Function
,于是Function.prototype.toString
覆盖了Object.prototype.toString
。Function.prototype.toString()
会把整个函数体转换成一个字符串。如果该函数是内置函数的话,会返回一个表示函数源代码的字符串。比如说:Function.prototype.toString(Object) === function Object() { [native code] }
所以如果此时对象不是由内置构造函数生成的对象,这个
hasOwn.toString.call(Ctor) === hasOwn.toString.call(Object)
为false
。Window对象
Window
对象有一个特性:Window.window
指向自身。类数组对象
常见的类数组有函数的
arguments
和NodeList
对象。判断
对于类数组对象,只要该对象中存在
length
属性并且length
为非负整数且在有限范围之内即可判断为类数组对象。JavaScript权威指南中提供了方法:
以上的判断无论是真的数组对象或是类数组对象都会返回
true
,那我们如何区分到底是真的数组对象还是类数组对象?其实只需要先判断是否为数组对象即可。
类数组对象的特征
类数组对象并不关心除了数字索引和
length
以外的东西。比如说:
其中,
'0'
和'3'
没有直接省略为两个undefined
,同样的abc
被忽略为undefined
。如果
length
多出实际的位数会补undefined
(空位也补充undefined
),少位则截断后面的数组成员。类数组对象的转换
Array.from
该方法从一个类似数组或可迭代对象中创建一个新的数组实例。
Array.prototype.slice
该方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。
ES6扩展运算符
参考链接:
mqyqingfeng/Blog#28
mqyqingfeng/Blog#30
The text was updated successfully, but these errors were encountered: