关于Object

1. Array.isArray()

  • 作用:判断某个对象是否为数组
  • 使用:
  • Array.isArray(对象)
  • 返回值:布尔类型值
  • 注意:存在兼容性问题(ES5)

不使用该方法如何判断一个对象是否为数组?

插入介绍toString()方法的使用

    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-b
    console.log(o[b]);     //Demo-b
    console.log(o["a"]);   //Test-a
    console.log(o["b"]);   //Test-b

通过[]语法设置对象时的原则与注意点:

  1. []中存放的是字符串,那么这个字符串就直接作为key
  2. []中存放的不是字符串,那么就把[]中部分当成一个变量来处理,查找最近变量,获取其值
    2.1. 如果对应的值是字符串,那么就直接作为key
    2.2 如果对应的值是对象,那么就尝试把这个对象转换为字符串(toString)
  • toString():返回的事对当前对象的字符串描述。
  • object类型对象的toString: Object.prototype.toString(),返回[类型 构造函数](eg. [object Object])
  • 数组类型 toString: Array.prototype.toString(),返回数组元素值得字符串
  • 解决以上问题方法:返回true时则为数组,false则不是数组。
if(Array.isArray != 'function'){
      Array.isArray = function(obj){
            return Object.prototype.toString.call(obj) == "[object Array]";
      }
}

2. instanceof

  • 原理:检查该构造函数的原型对象是否在当前对象的原型链上面,如果在结果为true,如果不在结果为fasle。原型链详解

3. Object.prototype的部分方法属性

  1. constructor
  • 构造器属性:指向构造函数
  • 对象.constructor:该属性不是这个对象的实例属性,是其原型对象上的属性,指向创建该对象的构造函数。
  • 原型对象.constructor:该属性是这个原型对象的实例属性,指向与其相关联的构造函数。
  1. hasOwnProperty
  • 检查对象中是否存在某个指定的成员(仅仅检查实例属性)
  1. isPrototypeOf
  • 作用:判断对象是否是另一个对象的原型对象
  • 原型对象.isPrototypeOf(对象)。 注意点:检查整条原型链(原型链详解
  1. propertyIsEnumerable
  • 对象.propertyIsEnumerable(属性)
  • 检查对象的属性是否是可以被枚举。如果是可以枚举的,可以使用for..in循环遍历打印
  1. toLocaleString
  • 返回的是一个本地化字符串描述信息,大部分情况下同toString方法
  1. toString
  • 如果是object类型的对象,返回的是[object Object]
  • 如果是其他类型的对象,返回的是对应的字符串描述
  • 如果是Number类型调用,那么可以接受一个参数(几进制),如果参数不传递那么默认是10进制的
  1. valueOf(获得这个对象对应的值。)
  • 基本包装类型,返回对应的基本类型值。
  • 其他的对象,返回的是这个对象本身
  • 日期类型的对象,返回时间戳

4. Object的静态成员

  1. Object.apply(借用其他对象的方法)
  • 格式:对象1.方法.apply(对象2,[参数1,参数2..])
  1. Object.arguments(接收函数调用时候传入的实参)
  2. Object.assign(拷贝属性(一次性拷贝多个对象的属性))
  • 格式:Object.assign(目标对象,要拷贝属性的对象1,要拷贝属性的对象2...)
  1. Object.bind(绑定对象调用方法,同call和apply几乎是一样。)
  2. Object.call(同apply方法)
  • 对象1.方法.call(对象2,参数1,参数2..)
  1. Object.caller(调用者,谁调用当前的方法,那么就指向谁)
  2. Object.create(创建对象并且该对象的原型对象)
  • var o = Object.create(obj);//obj为新创建的对象o的原型对象
  1. Object.getOwnPropertyDescriptor(获取对象中某个属性的描述信息(描述对象))
  • 属性信息:
    • 该属性对应的值
    • 该属性是否是可枚举的enumerable
    • 该属性是否是可配置的configurable
      • 可配置的 该属性可以被删除,并且可以被修改为不可配置的
      • 不可配置的 该属性不可以被删除 并且不可以被修改为可配置的
    • 该属性是否是可重写的writable
  1. Object.getOwnPropertyDescriptors(获得对象中多个属性的描述信息)
  2. Object.defineProperty(设置对象中某个属性的描述信息(对象))
- 第一个参数:对象
- 第二个参数:属性
- 第三个参数:描述对象

注意点:
如果是已经存在的属性,在设置时省略不写,默认值全部都是true
如果是新增加一个属性,在设置时省略不写,默认值全部都是false

var o = {
        name:"小明",
        des:"描述信息"
    }
//console.log(Object.getOwnPropertyDescriptor(o, "name"));
    Object.defineProperty(o, "name",{
        configurable:true,   //删除属性,以及配置
        writable:true,        //重写属性  修改
        enumerable:false,
        value:"明明"
    });
  1. Object.getOwnPropertyNames(获得对象所有的实例属性名(key),返回值是一个数组,不论该属性是否是可枚举的,都可以获取
  2. Object.keys(获取所有的key)
- 不包含原型对象中的key
- 不能返回不可枚举的属性
  1. Object.getPrototypeOf(获取原型对象)
  2. Object.preventExtensions|Object.isExtensible
- 禁止对象扩展(不能给对象添加属性或者是方法)
  1. Object.seal
- (密封对象(对象不能添加成员 + 不能删除成员))
  1. Object.freeze
- 冻结对象(对象不能添加成员 + 不能删除成员 + 不能修改成员)

5. 函数内部的隐藏参数

  1. this (指向一个对象)(函数的调用方法会影响到函数内部this的指向)
    • 对象.方法 (以对象的方法来进行调用) this->对象本身
    • 以普通函数方式进行调用 this->window(非严格模式)
    • 以构造函数的方式调用 this->新创建的对象
    • 函数上下文call|apply this->绑定的第一个参数
  2. arguments(一个类似于数组的结构,用来接收函数调用时传入的实参。)
    • arguments.length:函数调用时候实际参数的个数
    • 函数.length:函数期望的形参个数

6. callee 和 caller

  1. callee
    • 返回正在执行的函数本身的引用,它是arguments的一个属性
    • 常用于递归
    • arguments.callee.length是形参的长度,arguments.length是实参的长度。
  2. caller
    • 返回一个函数的引用,该函数调用了当前函数
    • 注意:window来调用函数的时候,caller指向null而不是window

7. with

  • 作用:缩短代码
  • 使用:with(对象){} 在{}中可以通过无前缀的方式来操作对象的成员

注意点:

  1. this的指向->window
  2. 在{}中不能使用没有前缀的方式来添加成员,如果要添加成员必须要使用前缀
  3. 会破坏js代码的词法作用域,性能降低
  4. 严格模式下已经被禁止
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,216评论 0 4
  • 甜桂八月始盛开, 馨香结露入梦来。 诗情大发需纵酒, 涵儿甜笑乐开怀。 朋友八月喜得千金,小名甜馨,唤作诗涵。
    无为而字阅读 545评论 6 18
  • 一 产品概述 (1)体验环境 体验者机型为魅族m1 note, Android版本5.1,App版本为v5.8.1...
    贺小妮阅读 4,704评论 3 6
  • 雪莲果被不少人误认为是红薯,若不细看在外观上两者的确极为相似,可是当削开皮后,里面一层在颜色上却是有着明显的不同。...
    执笔青衫阅读 915评论 1 1
  • 夏天:“是,没错我们结束了,但是我还是忍不住想去知道你的近况,想知道你最近过得可好。” 大白:“别天真了” 夏天:...
    夏天和大白阅读 346评论 0 1