值类型(基本类型) 字符串(String)、数字(Number)、布尔(Boolean)、对空(Null)、未定义(Undefined)、Symbol、BigInt。
引用数据类型 对象(Object)、数组(Array)、函数(Function)。
字符串方法 charAt() 方法可返回指定位置的字符。 substring() 方法用于提取字符串中介于两个指定下标之间的字符。 toUpperCase() 方法用于把字符串转换为大写。 数组方法 sort() 方法用于对数组的元素进行排序。 concat() 方法用于连接两个或多个数组。concat 会返回一个新数组 reverse() 方法用于颠倒数组中元素的顺序。 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。(该方法会改变原始数组。) shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。(该方法会改变数组的长度。) resort 逆向排列已废弃; js 判断数据类型 typeof typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(全小写字母)形式表示,包括 number,string,boolean,undefined,object,function,symbol 等。
1 2 3 4 5 6 7 8 9 10 11 typeof "" ; typeof 1 ; typeof false ; typeof undefined ; typeof function ( ) {}; typeof {}; typeof Symbol (); typeof null ; typeof []; typeof new Date (); typeof new RegExp ();
instanceof instanceof 用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。instanceof 检测的是原型,内部机制是通过判断对象的原型链中是否有类型的原型。
1 2 3 4 5 {} instanceof Object ; [] instanceof Array ; [] instanceof Object ; "123" instanceof String ; new String (123 ) instanceof String ;
instanceof 方法封装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 function instance (left, right ) { let prototype = right.prototype; let proto = left.__proto__; while (true ) { if (proto === null || proto === undefined ) { return false ; } if (proto === prototype) { return true ; } proto = proto.__proto__; } } console .log(instance({}, Object )); console .log(instance([], Number ));
constructor 当一个函数 F 被定义时,JS 引擎会为 F 添加 prototype 原型,然后在 prototype 上添加一个 constructor 属性,并让其指向 F 的引用,F 利用原型对象的 constructor 属性引用了自身,当 F 作为构造函数创建对象时,原型上的 constructor 属性被遗传到了新创建的对象上,从原型链角度讲,构造函数 F 就是新对象的类型。这样做的意义是,让对象诞生以后,就具有可追溯的数据类型。
1 2 3 4 5 6 7 8 9 "" .constructor == String ; new Number (1 ).constructor == Number ; true .constructor == Boolean ; new Function ().constructor == Function ; new Date ().constructor == Date ; new Error ().constructor == Error ; [].constructor == Array ; document .constructor == HTMLDocument; window .constructor == Window;
Object.prototype.toString() toString()是 Object 的原型方法,调用该方法,默认返回当前对象的[[Class]]。这是一个内部属性,其格式为[object Xxx],其中 Xxx 就是对象的类型。
对于 Object 对象,直接调用 toString()就能返回[object Object],而对于其他对象,则需要通过 call、apply 来调用才能返回正确的类型信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Object .prototype.toString.call("" ); Object .prototype.toString.call(1 ); Object .prototype.toString.call(true ); Object .prototype.toString.call(Symbol ()); Object .prototype.toString.call(undefined ); Object .prototype.toString.call(null ); Object .prototype.toString.call(new Function ()); Object .prototype.toString.call(new Date ()); Object .prototype.toString.call([]); Object .prototype.toString.call(new RegExp ()); Object .prototype.toString.call(new Error ()); Object .prototype.toString.call(document ); Object .prototype.toString.call(window );
封装一个准确判断数据类型的函数 1 2 3 4 5 6 7 function getType (obj ) { let type = typeof obj; if (type != "object" ) { return type; } return Object .prototype.toString.call(obj).replace(/^\[object (\S+)\]$/ , "$1" ); }