zoukankan      html  css  js  c++  java
  • [笔记] imooc《JavaScript深入浅出》对象与函数

    懒得做草稿了,习惯md也懒得扔印象笔记
    主要是之前没去接触这一部分,就随手记下来了

    创建对象的方法

    • 对象字面量
    • new构造器/原型链
    • Object.create()

    属性操作

    • 属性读写(以及读写异常、a && a.b && a.b.c)
    • 属性删除(delete、全局/局部 变量/函数名、不允许删除的属性、configurable)
    • 属性检测(in操作符、hasOwnProperty()propertyIsEnumerable()defineProperty()
    • 属性枚举(in + if hasOwnProperty())

    属性标签(属性级的权限设置)

    • (writable、enumerable、configurable、value)
    • getOwnPropertyDescriptor()
    • defineProperty()defineProperties()
    • 遍历:enumerable: false,影响for...inObject.keys()

    对象标签

    • ( [[proto]]、[[class]]、[[extensible]] )
    • 对象类名:Object.prototype.toString.call().slice(8, -1)
    • 对象扩展:Object.isExtensible()Object.preventExtensions()
    • 禁止对象修改属性标签、删除属性:Object.isSealed()Object.seal()
    • 冻结对象上的属性修改:Object.isFrozen()Object.freeze()
    • 只影响传入对象本身,不影响原型链

    对象序列化

    • !!注意:undefined不会出现,NaN 和 Infinity 会转成null,Date类型会转成ISO时间格式(toJSON()toISOString()
    • 自定义序列化:在对象中添加toJSON()方法
    • valueOf()返回基本数据类型,toString()返回字符串

    创建数组

    • 数组字面量(可以逗号间隔,undefined,末尾忽略)
    • 最大长度2**23-1(应该是取决于堆大小或者其他的设置,我的浏览器和node都是2**32-1
    • new Array(n),不用new也可以

    数组元素操作

    • delete不会改变数组长度,undefined,但不可枚举(没有kv索引)
    • arr.push()arr[arr.length]=0arr.unshift()
    • delete arr[2]arr.length-=1arr.pop()arr.shift()

    函数

    • JS中的函数常叫做函数对象
    • new构造器如果没有返回值,或返回基本类型,则返回this

    函数调用方式

    • 直接调用:foo()
    • 对象方法:obj.method()
    • 构造器:new Foo()
    • call/apply/bind:func.call(o)

    函数与this

    • 一般函数的this:window(浏览器)、global(node)、undefined(严格模式)
    • 作为对象方法的函数中的this:指向对象(其实是指向执行上下文对象)
    • 对象原型链上的this:指向对象(而不是原型链)
    • get/set方法与this:指向执行get/set的对象
    • 构造器中的this:new的过程中是一个空对象(其原型指向Foo.prototype
    • call/apply方法与this:指向传入的第一个参数(基本类型会转为包装类)
    • bind方法与this:新函数的this绑定到传入bind的第一个参数(其他形参也可以绑定)

    函数属性与arguments

    • 函数名:foo.name,函数形参个数:foo.length

    ES3执行上下文

    • 变量对象(VO,Variable Object)、激活对象(AO)
    • 函数变量初始化阶段,VO按顺序填充(函数表达式不会影响VO):
      • 函数参数(未传入的为undefined)
      • 内部函数声明(发生命名冲突会覆盖,即覆盖形参)
      • 内部变量声明(全都undefined,命名冲突则忽略)
    • 代码执行阶段:变量的赋值、函数的调用等




    本文基于知识共享许可协议知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议发布,欢迎引用、转载或演绎,但是必须保留本文的署名BlackStorm以及本文链接http://www.cnblogs.com/BlackStorm/p/7222016.html,且未经许可不能用于商业目的。如有疑问或授权协商请与我联系

  • 相关阅读:
    点击文本变成输入框
    html代码片段
    node 开启Gzip压缩
    npm 安装与卸载
    console.dir()-----js中console.log()和console.dir()的区别
    javaScript学习笔记之-------this
    javaScript学习笔记之-------闭包
    从零搭建vue项目---VUE从无到有
    require.js扫盲版
    cross-env 解决跨平台设置的NODE_ENV的问题
  • 原文地址:https://www.cnblogs.com/BlackStorm/p/7222016.html
Copyright © 2011-2022 走看看