面向对象04

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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,716评论 2 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,591评论 18 139
  • 一、JavaScript基础知识回顾 1.1 JavaScript 1.1.1 javascript是什么? Ja...
    福尔摩鸡阅读 1,226评论 0 7
  • 开篇废话是一种情怀 在我们开始学习面向对象之前,首先得先想一个问题,那就是何为对象? 在日常生活中我们有男朋友\女...
    西巴撸阅读 513评论 4 3
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,054评论 1 10