Array.isArray()方法
作用:判断某个对象是否是数组
语法:Array.isArray(对象),返回值为布尔值
注意点:兼容性问题(ES5)
面试题
var o = {};
var a ={};
var b = {name:"张三"};
o["a"] = "Test-a";
o["b"] = "Test-b";
o[b] = "Demo-b";
o[a] = "Demo-a";
console.log(o.a); // Test-a
console.log(o.b); // Test-b
console.log(o[a]); // Demo-a
console.log(o[b]); // Demo-a
console.log(o["a"]); // Test-a
console.log(o["b"]); // Test-b
var arr1= [1,2,3];
console.log( arr1.toString()); //字符串类型的1,2,3
var func = function () {
};
console.log(typeof func.toString()); //string
console.log(a.toString()); //[object Object] [类型 构造函数]
console.log(b.toString()); //[object Object]
console.log(o);
当使用[]访问属性的时候,属性是字符串,如果属性不是字符串,会将 属性当做变量来处理,当变量的值为数组,会将数组的值转换成字符串样式;当变量的值为函数,会将函数转换成字符串样式的函数;当变量为对象,会将对象的值都转换为[object Object] 的字符串,以上皆默认使用toString方法
在使用[]语法设置对象的时候:
- []中存放的是字符串,那么这个字符串就直接作为key
- []中存放的不是字符串,那么就把[]中部分当成一个变量来处理,查找最近变量,获取其值,如果对应的值是字符串,那么就直接作为key;如果对应的值是对象,那么就尝试把这个对象转换为字符串(toString)
toString:
返回的是对当前对象的字符串描述。
Array.isArray()方法兼容性问题
思路:根据上述面试题,能否借用Object的原型对象上的toString方法将数组转换成[object Array] ,由此来判断是否是数组
代码示例
var arr1 = [1,2,3];
console.log(Object.prototype.toString.call(arr1)); //[object Array]
var date = new Date();
console.log(typeof date); //[object Date]
console.log(Object.prototype.toString.call(function () {
})); //[object Function]
//由以上代码执行的结果可以判断,借用Object的原型对象上的toString方法可以将对象转换成[object 构造函数]的字符串形式,从中可以观察到对象的构造函数 ,进而我们可以通过这个方法来判断是否是数组
if (typeof Array.isArray !=‘function’){
Array.isArray=function(arr){
return Object.prototype.toString.call(arr)=='[object Array] ';
}
}
instanceOf补充
作用:
01 检查某个对象是否由某个构造函数创建出来的;
02 检查该对象的构造函数的原型对象是否在该对象的原型链上;
代码示例
function Person() {
}
var p1 = new Person();
console.log(p1 instanceof Person); //true
Person.prototype = {}; //原型对象被替换,
console.log(p1 instanceof Person); //false
基本包装类型
- String
- Number
- Boolean
基本包装类型创建对象
- new String/Number/Boolean()
- new Object('字符串' | 数值 | 布尔类型的值)
- Object('字符串' | 数值 | 布尔类型的值)
注意:new Object()与Object()会根据传入的参数,内部会做一个判断来创建字符串对象/数值对象/布尔类型的对象
注意:通过构造函数()方法创建的不是对象,是基本数据类型的值(除了Object)
var str1 = new String("demo01");
var str2 = "demo01";
var str3 = new Object("demo01");
var str4 = Object("demo01");
var str5 = String("demo01"); //字符串还是字符串对象?注意,通过构造函数()方法创建的不是对象,是基本数据类型的值
console.log(typeof str1, typeof str2,typeof str3,typeof str4); //
console.log(typeof str5); //string
var num1 = new Number(1);
var num2 = 1;
var num3 = new Object(1);
console.log(typeof num1, typeof num2,typeof num3);
var bool1 = new Boolean(true);
console.log(bool1);
var bool2 = true;
console.log(typeof bool1, typeof bool2);
基本包装类型注意点
- 比较,等于与全等于
var str1 = new String("demo01"); //ox11
var str2 = "demo01";
var str3 = new Object("demo01"); //0x22
var str4 = Object("demo01");
var str5 = String("demo01"); //字符串还是字符串对象?
var str6 = "demo01";
console.log(str2 == str6); //true 两个都是基本类型的值在比较的时候比较内容(demo01)
console.log(str1 == str2); //true 类型不一样,内部有隐式的转换(对象.valueOf)
console.log(str1 == str3); //false,存储的内容是地址
- 基本类型的数据也可以访问属性和方法
var str01 = "string01";
console.log(str01.length); //8
//var tmp = new String(str01);
//tmp.length ==>8
//tmp = null;
console.log(str01.substr(1, 2)); //tr
var str02 = new String("sting02");
str02.name = "默认的name";
console.log(str02.name); //默认的name
str01.name = "测试的名称";
console.log(str01.name); //undefined
实际上,每当读取一个基本数据类型的值,后台就会创建一个对应基本包装类型的对象,从而能够使基本数据调用一些方法。
引用类型与基本包装类型的主要区别就在于对象的生命周期,使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象,只存在于这一行代码的执行期(瞬间),然后立即销毁。这就意味着我们不能在运行时为基本数据类型添加属性和方法。
Number使用注意
<script>
Number.prototype.sum = function (n) {
return n + this;
};
var num1 = new Number(10);
console.log(num1.sum(20)); //30
var num2 = 11;
console.log(num2.sum(10)); //21
// console.log(10.sum(5)); //不可以这样调用
console.log((10).sum(5)); //这样是可以的 15 表达式 加上一个()
</script>