答案:Object.prototype.toString.call([]) 返回 "[object Array]"
扩展答案
-
[].slice (能力判断 )
-
[] instanceof Array(类型判断)
-
[].proto === Array.prototype
-
Array.isArray([]) 存在兼容问题
数组也是引用类型,通过 typeof 依然返回 object
详细解析:
背景 —— typeof {}和typeof []的结果都是object,对象是对象,数组也是对象,js中万物皆对象,很显然,通过简单的typeof运算符不能判断一个对象是不是数组类型。
alert(typeof {}); // 返回字符串"object"
alert(typeof []); // 返回字符串"object "
在js中一个对象一旦被创建,在内部会携带创建对象的类型名,一旦创建就不能被修改了。那么怎么获取这个对象的类型名呢?
js中提供了,调用对象原型中的toString方法, Object.prototype.toString.call(obj);因为很多对象继承的 toString() 方法被重写了,为了能够调用正确的 toString() 版本,也就是最原始的版本。可以使用 Function.call() 的方法,其中 call 可以这么理解,相当于 obj 去借用这个 Object.prototype.toString();
扩展
2. [] instanceof Array(类型判断)
typeof 和 instanceof 的区别:
两者都可以用来判断变量,typeof会返回基本类型,而instanceof只会返回一个布尔值。
3. [].proto === Array.prototype
在JS里,万物皆对象。对象具有属性__proto__,称为隐式原型。每个函数实例对象都拥有一个__proto__属性,而这个属性指向了函数的prototype。
4. Array.isArray([]) 存在兼容问题
Array.isArray([1, 2, 3]); // true
Array.isArray({foo: 123}); // false
1. [].slice (能力判断 )
slice(start,end)(参数可选)
slice()
方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。原始数组不会被修改。
原数组:arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(0,-1); // 从索引0开始,到索引最后一个结束,不包括最后索引项
console.log(result); //输出:(6) ["A", "B", "C", "D", "E", "F"]
结果:
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(-1); //最后索引项的获取
console.log(result); //输出:["G"]
结果:
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(0,6); // 从索引0开始,到索引6结束,不包括最后索引项
console.log(result); //输出:(6) ["A", "B", "C", "D", "E", "F"]
结果:
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(0,7); // 从索引0开始,到索引6结束,获取全部元素
console.log(result); //输出:(7) ["A", "B", "C", "D", "E", "F", "G"]
结果:
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(); // 默认获取全部元素
console.log(result); //输出:(7) ["A", "B", "C", "D", "E", "F", "G"]
结果:
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(-2,-1); // 倒序索引6开始,倒数第二个元素
console.log(result); //输出:["F"]
结果:
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
result = arr.slice(-3,-1); // 倒序索引6开始,倒数第3个元素开始,不包括最后一个元素
console.log(result); //输出:(2) ["E", "F"]
结果: